QueueTest::testPopOrder()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
cc 3
nc 4
nop 0
1
<?php
2
3
/*
4
 * This file is part of the Phive Queue package.
5
 *
6
 * (c) Eugene Leonovich <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Phive\Queue\Tests\Queue;
13
14
use Phive\Queue\NoItemAvailableException;
15
use Phive\Queue\Queue;
16
use Phive\Queue\Tests\TimeUtils;
17
18
abstract class QueueTest extends \PHPUnit_Framework_TestCase
19
{
20
    use Util;
21
22
    /**
23
     * @var Queue
24
     */
25
    protected $queue;
26
27
    /**
28
     * Whether the queue supports an expired ETA or not.
29
     *
30
     * @var bool
31
     */
32
    protected $supportsExpiredEta = true;
33
34
    /**
35
     * {@inheritdoc}
36
     */
37
    protected function setUp()
38
    {
39
        $this->queue = $this->createQueue();
40
    }
41
42
    public function testImplementQueueInterface()
43
    {
44
        $this->assertInstanceOf('Phive\Queue\Queue', $this->queue);
45
    }
46
47
    public function testPushPop()
48
    {
49
        $this->queue->push('item');
50
51
        $this->assertEquals('item', $this->queue->pop());
52
        $this->assertNoItemIsAvailable($this->queue);
53
    }
54
55
    public function testPopOrder()
56
    {
57
        if ($this->supportsExpiredEta) {
58
            $this->queue->push('item1');
59
            $this->queue->push('item2', '-1 hour');
60
        } else {
61
            $this->queue->push('item1', '+3 seconds');
62
            $this->queue->push('item2');
63
        }
64
65
        $this->assertEquals('item2', $this->queue->pop());
66
        if (!$this->supportsExpiredEta) {
67
            sleep(3);
68
        }
69
        $this->assertEquals('item1', $this->queue->pop());
70
    }
71
72
    public function testPopDelay()
73
    {
74
        $eta = time() + 3;
75
76
        $this->queue->push('item', $eta);
77
        $this->assertNoItemIsAvailable($this->queue);
78
79
        TimeUtils::callAt($eta, function () {
80
            $this->assertEquals('item', $this->queue->pop());
81
        }, !$this->supportsExpiredEta);
82
    }
83
84
    public function testPushWithExpiredEta()
85
    {
86
        $this->queue->push('item', time() - 1);
87
        $this->assertEquals('item', $this->queue->pop());
88
    }
89
90
    public function testPushEqualItems()
91
    {
92
        $this->queue->push('item');
93
        $this->queue->push('item');
94
95
        $this->assertEquals('item', $this->queue->pop());
96
        $this->assertEquals('item', $this->queue->pop());
97
    }
98
99
    public function testCountAndClear()
100
    {
101
        $this->assertEquals(0, $this->queue->count());
102
103
        for ($i = $count = 5; $i; $i--) {
104
            $this->queue->push('item'.$i);
105
        }
106
107
        $this->assertEquals($count, $this->queue->count());
108
109
        $this->queue->clear();
110
        $this->assertEquals(0, $this->queue->count());
111
    }
112
113
    /**
114
     * @dataProvider provideItemsOfSupportedTypes
115
     */
116
    public function testSupportItemType($item, $type)
117
    {
118
        $this->queue->push($item);
119
120
        if (Types::TYPE_BINARY_STRING === $type) {
121
            // strict comparison
122
            $this->assertSame($item, $this->queue->pop());
123
        } else {
124
            // loose comparison
125
            $this->assertEquals($item, $this->queue->pop());
126
        }
127
    }
128
129
    protected function assertNoItemIsAvailable(Queue $queue)
130
    {
131
        try {
132
            $queue->pop();
133
        } catch (NoItemAvailableException $e) {
134
            return;
135
        }
136
137
        $this->fail('An expected NoItemAvailableException has not been raised.');
138
    }
139
140
    /**
141
     * @return Queue
142
     */
143
    abstract public function createQueue();
144
}
145