Test Failed
Pull Request — 2.x (#116)
by Marc
03:08 queued 01:34
created

EnumSetTest::testGetBinaryBitsetBe()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 33
Code Lines 23

Duplication

Lines 33
Ratio 100 %

Importance

Changes 0
Metric Value
dl 33
loc 33
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 23
nc 1
nop 0
1
<?php
2
3
namespace MabeEnumTest;
4
5
use MabeEnum\EnumSet;
6
use MabeEnumTest\TestAsset\EmptyEnum;
7
use MabeEnumTest\TestAsset\EnumBasic;
8
use MabeEnumTest\TestAsset\EnumInheritance;
9
use MabeEnumTest\TestAsset\Enum32;
10
use MabeEnumTest\TestAsset\Enum64;
11
use MabeEnumTest\TestAsset\Enum65;
12
use MabeEnumTest\TestAsset\Enum66;
13
use PHPUnit_Framework_TestCase as TestCase;
14
15
/**
16
 * Unit tests for the class MabeEnum\EnumSet
17
 *
18
 * @link http://github.com/marc-mabe/php-enum for the canonical source repository
19
 * @copyright Copyright (c) 2015 Marc Bennewitz
20
 * @license http://github.com/marc-mabe/php-enum/blob/master/LICENSE.txt New BSD License
21
 */
22
class EnumSetTest extends TestCase
23
{
24
    public function testBasic()
25
    {
26
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
27
        $this->assertSame('MabeEnumTest\TestAsset\EnumBasic', $enumSet->getEnumeration());
28
29
        $enum1  = EnumBasic::ONE();
30
        $enum2  = EnumBasic::TWO();
31
32
        $this->assertFalse($enumSet->contains($enum1));
33
        $this->assertNull($enumSet->attach($enum1));
34
        $this->assertTrue($enumSet->contains($enum1));
35
36
        $this->assertFalse($enumSet->contains($enum2));
37
        $this->assertNull($enumSet->attach($enum2));
38
        $this->assertTrue($enumSet->contains($enum2));
39
40
        $this->assertNull($enumSet->detach($enum1));
41
        $this->assertFalse($enumSet->contains($enum1));
42
43
        $this->assertNull($enumSet->detach($enum2));
44
        $this->assertFalse($enumSet->contains($enum2));
45
    }
46
47
    public function testDeprecatedGetEnumClass()
48
    {
49
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
50
        $this->assertSame('MabeEnumTest\TestAsset\EnumBasic', $enumSet->getEnumClass());
51
    }
52
53
    public function testBasicWithConstantValuesAsEnums()
54
    {
55
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
56
57
        $enum1  = EnumBasic::ONE;
58
        $enum2  = EnumBasic::TWO;
59
60
        $this->assertFalse($enumSet->contains($enum1));
61
        $this->assertNull($enumSet->attach($enum1));
62
        $this->assertTrue($enumSet->contains($enum1));
63
64
        $this->assertFalse($enumSet->contains($enum2));
65
        $this->assertNull($enumSet->attach($enum2));
66
        $this->assertTrue($enumSet->contains($enum2));
67
68
        $this->assertNull($enumSet->detach($enum1));
69
        $this->assertFalse($enumSet->contains($enum1));
70
71
        $this->assertNull($enumSet->detach($enum2));
72
        $this->assertFalse($enumSet->contains($enum2));
73
    }
74
75
    public function testUnique()
76
    {
77
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
78
79
        $enumSet->attach(EnumBasic::ONE());
80
        $enumSet->attach(EnumBasic::ONE);
81
82
        $enumSet->attach(EnumBasic::TWO());
83
        $enumSet->attach(EnumBasic::TWO);
84
85
        $this->assertSame(2, $enumSet->count());
86
    }
87
88
    public function testIterateOrdered()
89
    {
90
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
91
92
        // an empty enum set needs to be invalid, starting by 0
93
        $this->assertSame(0, $enumSet->count());
94
        $this->assertFalse($enumSet->valid());
95
        $this->assertNull($enumSet->current());
96
97
        // attach
98
        $enum1 = EnumBasic::ONE();
99
        $enum2 = EnumBasic::TWO();
100
        $enumSet->attach($enum1);
101
        $enumSet->attach($enum2);
102
103
        // a not empty enum set should be valid, starting by 0 (if not iterated)
104
        $enumSet->rewind();
105
        $this->assertSame(2, $enumSet->count());
106
        $this->assertTrue($enumSet->valid());
107
        $this->assertSame($enum1->getOrdinal(), $enumSet->key());
108
        $this->assertSame($enum1, $enumSet->current());
109
110
        // go to the next element (last)
111
        $this->assertNull($enumSet->next());
112
        $this->assertTrue($enumSet->valid());
113
        $this->assertSame($enum2->getOrdinal(), $enumSet->key());
114
        $this->assertSame($enum2, $enumSet->current());
115
116
        // go to the next element (out of range)
117
        $this->assertNull($enumSet->next());
118
        $this->assertFalse($enumSet->valid());
119
        $this->assertNull($enumSet->current());
120
121
        // rewind will set the iterator position back to 0
122
        $enumSet->rewind();
123
        $this->assertTrue($enumSet->valid());
124
        $this->assertSame(0, $enumSet->key());
125
        $this->assertSame($enum1, $enumSet->current());
126
    }
127
128
    public function testIterateAndDetach()
129
    {
130
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumInheritance');
131
132
        $enum1 = EnumInheritance::ONE();
133
        $enum2 = EnumInheritance::TWO();
134
        $enum3 = EnumInheritance::INHERITANCE();
135
136
        // attach
137
        $enumSet->attach($enum1);
138
        $enumSet->attach($enum2);
139
        $enumSet->attach($enum3);
140
141
        // go to the next entry
142
        $enumSet->next();
143
        $this->assertSame($enum2, $enumSet->current());
144
145
        // detach current entry
146
        $enumSet->detach($enumSet->current());
147
        $this->assertFalse($enumSet->valid());
148
        $this->assertNull($enumSet->current());
149
        $this->assertSame($enum2->getOrdinal(), $enumSet->key());
150
151
        // go to the next entry should be the last entry
152
        $enumSet->next();
153
        $this->assertSame($enum3, $enumSet->current());
154
155
        // detech the last entry
156
        $enumSet->detach($enumSet->current());
157
        $this->assertFalse($enumSet->valid());
158
        $this->assertNull($enumSet->current());
159
        $this->assertSame($enum3->getOrdinal(), $enumSet->key());
160
    }
161
162
    public function testConstructThrowsInvalidArgumentExceptionIfEnumClassDoesNotExtendBaseEnum()
163
    {
164
        $this->setExpectedException('InvalidArgumentException');
165
        new EnumSet('stdClass');
166
    }
167
168
    public function testInitEnumThrowsInvalidArgumentExceptionOnInvalidEnum()
169
    {
170
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
171
        $this->setExpectedException('InvalidArgumentException');
172
        $this->assertFalse($enumSet->contains(EnumInheritance::INHERITANCE()));
173
    }
174
175
    public function testIterateOutOfRangeIfLastOrdinalEnumIsSet()
176
    {
177
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
178
        $enum    = EnumBasic::byOrdinal(count(EnumBasic::getConstants()) - 1);
179
180
        $enumSet->attach($enum);
181
        $enumSet->rewind();
182
        $this->assertSame($enum, $enumSet->current());
183
184
        // go to the next entry results in out of range
185
        $enumSet->next();
186
        $this->assertFalse($enumSet->valid());
187
        $this->assertSame($enum->getOrdinal() + 1, $enumSet->key());
188
189
        // go more over doesn't change iterator position
190
        $enumSet->next();
191
        $this->assertFalse($enumSet->valid());
192
        $this->assertSame($enum->getOrdinal() + 1, $enumSet->key());
193
    }
194
195
    public function testRewindFirstOnEmptySet()
196
    {
197
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
198
199
        $enumSet->attach(EnumBasic::TWO);
200
        $enumSet->rewind();
201
        $this->assertGreaterThan(0, $enumSet->key());
202
203
        $enumSet->detach(EnumBasic::TWO);
204
        $enumSet->rewind();
205
        $this->assertSame(0, $enumSet->key());
206
    }
207
208
    public function test32EnumerationsSet()
209
    {
210
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum32');
211
        foreach (Enum32::getConstants() as $name => $value) {
212
            $this->assertFalse($enumSet->contains($value));
213
            $enumSet->attach($value);
214
            $this->assertTrue($enumSet->contains($value));
215
        }
216
217
        $this->assertSame(32, $enumSet->count());
218
219
        $expectedOrdinal = 0;
220
        foreach ($enumSet as $ordinal => $enum) {
221
            $this->assertSame($expectedOrdinal, $ordinal);
222
            $this->assertSame($expectedOrdinal, $enum->getOrdinal());
223
            $expectedOrdinal++;
224
        }
225
    }
226
227
    public function test64EnumerationsSet()
228
    {
229
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum64');
230
        foreach (Enum64::getConstants() as $name => $value) {
231
            $this->assertFalse($enumSet->contains($value));
232
            $enumSet->attach($value);
233
            $this->assertTrue($enumSet->contains($value));
234
        }
235
236
        $this->assertSame(64, $enumSet->count());
237
238
        $expectedOrdinal = 0;
239
        foreach ($enumSet as $ordinal => $enum) {
240
            $this->assertSame($expectedOrdinal, $ordinal);
241
            $this->assertSame($expectedOrdinal, $enum->getOrdinal());
242
            $expectedOrdinal++;
243
        }
244
    }
245
246
    public function test65EnumerationsSet()
247
    {
248
        $enum = new EnumSet('MabeEnumTest\TestAsset\Enum65');
249
250
        $this->assertNull($enum->attach(Enum65::byOrdinal(64)));
251
        $enum->next();
252
        $this->assertTrue($enum->valid());
253
    }
254
255
    public function testGetBinaryBitsetLe()
256
    {
257
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
258
        
259
        $enum1 = Enum65::ONE;
260
        $enum2 = Enum65::TWO;
261
        $enum3 = Enum65::SIXTYFIVE;
262
        $enum4 = Enum65::SIXTYFOUR;
263
264
        $this->assertNull($enumSet->attach($enum1));
265
        $this->assertSame("\x01\x00\x00\x00\x00\x00\x00\x00\x00", $enumSet->getBinaryBitsetLe());
266
        $this->assertTrue($enumSet->contains($enum1));
267
268
        $this->assertNull($enumSet->attach($enum2));
269
        $this->assertSame("\x03\x00\x00\x00\x00\x00\x00\x00\x00", $enumSet->getBinaryBitsetLe());
270
        $this->assertTrue($enumSet->contains($enum2));
271
272
        $this->assertNull($enumSet->attach($enum3));
273
        $this->assertSame("\x03\x00\x00\x00\x00\x00\x00\x00\x01", $enumSet->getBinaryBitsetLe());
274
        $this->assertTrue($enumSet->contains($enum3));
275
276
        $this->assertNull($enumSet->attach($enum4));
277
        $this->assertSame("\x03\x00\x00\x00\x00\x00\x00\x80\x01", $enumSet->getBinaryBitsetLe());
278
        $this->assertTrue($enumSet->contains($enum4));
279
        
280
        $this->assertSame(4, $enumSet->count());
281
282
        $this->assertNull($enumSet->detach($enum2));
283
        $this->assertSame("\x01\x00\x00\x00\x00\x00\x00\x80\x01", $enumSet->getBinaryBitsetLe());
284
        $this->assertFalse($enumSet->contains($enum2));
285
        
286
        $this->assertSame(3, $enumSet->count());
287
    }
288
289
    public function testGetBinaryBitsetBe()
290
    {
291
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
292
        
293
        $enum1 = Enum65::ONE;
294
        $enum2 = Enum65::TWO;
295
        $enum3 = Enum65::SIXTYFIVE;
296
        $enum4 = Enum65::SIXTYFOUR;
297
298
        $this->assertNull($enumSet->attach($enum1));
299
        $this->assertSame("\x00\x00\x00\x00\x00\x00\x00\x00\x01", $enumSet->getBinaryBitsetBe());
300
        $this->assertTrue($enumSet->contains($enum1));
301
302
        $this->assertNull($enumSet->attach($enum2));
303
        $this->assertSame("\x00\x00\x00\x00\x00\x00\x00\x00\x03", $enumSet->getBinaryBitsetBe());
304
        $this->assertTrue($enumSet->contains($enum2));
305
306
        $this->assertNull($enumSet->attach($enum3));
307
        $this->assertSame("\x01\x00\x00\x00\x00\x00\x00\x00\x03", $enumSet->getBinaryBitsetBe());
308
        $this->assertTrue($enumSet->contains($enum3));
309
310
        $this->assertNull($enumSet->attach($enum4));
311
        $this->assertSame("\x01\x80\x00\x00\x00\x00\x00\x00\x03", $enumSet->getBinaryBitsetBe());
312
        $this->assertTrue($enumSet->contains($enum4));
313
        
314
        $this->assertSame(4, $enumSet->count());
315
316
        $this->assertNull($enumSet->detach($enum2));
317
        $this->assertSame("\x01\x80\x00\x00\x00\x00\x00\x00\x01", $enumSet->getBinaryBitsetBe());
318
        $this->assertFalse($enumSet->contains($enum2));
319
        
320
        $this->assertSame(3, $enumSet->count());
321
    }
322
323
    /**
324
     * @deprecated
325
     */
326
    public function testGetBitset()
327
    {
328
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
329
        
330
        $enum1 = Enum65::ONE;
331
        $enum2 = Enum65::TWO;
332
        $enum3 = Enum65::SIXTYFIVE;
333
        $enum4 = Enum65::SIXTYFOUR;
334
335
        $this->assertNull($enumSet->attach($enum1));
336
        $this->assertSame("\x00\x00\x00\x00\x00\x00\x00\x00\x01", $enumSet->getBitset());
337
        $this->assertTrue($enumSet->contains($enum1));
338
339
        $this->assertNull($enumSet->attach($enum2));
340
        $this->assertSame("\x00\x00\x00\x00\x00\x00\x00\x00\x03", $enumSet->getBitset());
341
        $this->assertTrue($enumSet->contains($enum2));
342
343
        $this->assertNull($enumSet->attach($enum3));
344
        $this->assertSame("\x01\x00\x00\x00\x00\x00\x00\x00\x03", $enumSet->getBitset());
345
        $this->assertTrue($enumSet->contains($enum3));
346
347
        $this->assertNull($enumSet->attach($enum4));
348
        $this->assertSame("\x01\x80\x00\x00\x00\x00\x00\x00\x03", $enumSet->getBitset());
349
        $this->assertTrue($enumSet->contains($enum4));
350
        
351
        $this->assertSame(4, $enumSet->count());
352
353
        $this->assertNull($enumSet->detach($enum2));
354
        $this->assertSame("\x01\x80\x00\x00\x00\x00\x00\x00\x01", $enumSet->getBitset());
355
        $this->assertFalse($enumSet->contains($enum2));
356
        
357
        $this->assertSame(3, $enumSet->count());
358
    }
359
360
    public function testSetBinaryBitsetLe()
361
    {
362
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
363
        $enumSet->setBinaryBitsetLe("\x01\x00\x00\x00\x00\x00\x00\x80\x01");
364
365
        $this->assertTrue($enumSet->contains(Enum65::ONE));
366
        $this->assertFalse($enumSet->contains(Enum65::TWO));
367
        $this->assertTrue($enumSet->contains(Enum65::SIXTYFIVE));
368
        $this->assertTrue($enumSet->contains(Enum65::SIXTYFOUR));
369
        $this->assertTrue($enumSet->count() == 3);
370
    }
371
372
    public function testSetBinaryBitsetLeTruncateHighBits()
373
    {
374
        // using Enum66 to make sure the max. ordinal number gets converted into a bitset
375
        // Enum65 has max. ordinal number of 1 of the last byte. -> 00000001
376
        // Enum66 has max. ordinal number of 2 of the last byte. -> 00000011
377
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum66');
378
        foreach (Enum66::getEnumerators() as $enumerator) {
379
            $enumSet->attach($enumerator);
380
        }
381
382
        $bitset    = $enumSet->getBinaryBitsetLe();
383
        $newBitset = substr($bitset, 0, -1) . "\xff\xff";
384
        $enumSet->setBinaryBitsetLe($newBitset);
385
386
        $this->assertSame(bin2hex($bitset), bin2hex($enumSet->getBinaryBitsetLe()));
387
    }
388
389
    public function testSetBinaryBitsetBe()
390
    {
391
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
392
        $enumSet->setBinaryBitsetBe("\x01\x80\x00\x00\x00\x00\x00\x00\x01");
393
394
        $this->assertTrue($enumSet->contains(Enum65::ONE));
395
        $this->assertFalse($enumSet->contains(Enum65::TWO));
396
        $this->assertTrue($enumSet->contains(Enum65::SIXTYFIVE));
397
        $this->assertTrue($enumSet->contains(Enum65::SIXTYFOUR));
398
        $this->assertTrue($enumSet->count() == 3);
399
    }
400
401
    /**
402
     * @deprecated
403
     */
404
    public function testSetBitset()
405
    {
406
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
407
        $enumSet->setBitset("\x01\x80\x00\x00\x00\x00\x00\x00\x01");
408
409
        $this->assertTrue($enumSet->contains(Enum65::ONE));
410
        $this->assertFalse($enumSet->contains(Enum65::TWO));
411
        $this->assertTrue($enumSet->contains(Enum65::SIXTYFIVE));
412
        $this->assertTrue($enumSet->contains(Enum65::SIXTYFOUR));
413
        $this->assertTrue($enumSet->count() == 3);
414
    }
415
416
    public function testSetBinaryBitsetLeShort()
417
    {
418
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\Enum65');
419
        $enumSet->setBinaryBitsetLe("\x0A");
420
        $this->assertSame("\x0A\x00\x00\x00\x00\x00\x00\x00\x00", $enumSet->getBinaryBitsetLe());
421
    }
422
423
    public function testSetBinaryBitsetLeLong()
424
    {
425
        $enumSet = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
426
        $enumSet->setBinaryBitsetLe("\x0A\xFF\xFF\xFF\xFF\xFF");
427
        $this->assertSame("\x0A\xFF", $enumSet->getBinaryBitsetLe());
428
    }
429
430
    public function testSetBinaryBitsetLeArgumentExceptionIfNotString()
431
    {
432
        $this->setExpectedException('InvalidArgumentException');
433
        
434
        $enum = new EnumSet('MabeEnumTest\TestAsset\Enum65');
435
        $enum->setBinaryBitsetLe(0);
436
    }
437
438
    public function testSetBinaryBitsetBeArgumentExceptionIfNotString()
439
    {
440
        $this->setExpectedException('InvalidArgumentException');
441
        
442
        $enum = new EnumSet('MabeEnumTest\TestAsset\Enum65');
443
        $enum->setBinaryBitsetBe(0);
444
    }
445
446
    public function testCountingEmptyEnumEmptySet()
447
    {
448
        $set = new EnumSet('MabeEnumTest\TestAsset\EmptyEnum');
449
        $this->assertSame(0, $set->count());
450
    }
451
452
    public function testIsEqual()
453
    {
454
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
455
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
456
        $this->assertTrue($set1->isEqual($set2));
457
458
        foreach (EnumBasic::getEnumerators() as $enumerator) {
459
            $set1->attach($enumerator);
460
            $this->assertFalse($set1->isEqual($set2));
461
462
            $set2->attach($enumerator);
463
            $this->assertTrue($set1->isEqual($set2));
464
        }
465
    }
466
467
    public function testIsEqualWrongInstance()
468
    {
469
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
470
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumInheritance');
471
        $this->assertFalse($set1->isEqual($set2));
472
473
        foreach (EnumBasic::getEnumerators() as $enumerator) {
474
            $set1->attach($enumerator);
475
            $this->assertFalse($set1->isEqual($set2));
476
477
            $set2->attach($enumerator->getValue());
478
            $this->assertFalse($set1->isEqual($set2));
479
        }
480
    }
481
482
    /**
483
     * if $A->isEqual($B) is true then $A->isSubsetOf($B) is also true
484
     */
485
    public function testIsSubsetEqual()
486
    {
487
        $set1 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
488
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
489
        $this->assertTrue($set1->isSubset($set2));
490
491
        foreach (Enum32::getEnumerators() as $enumerator) {
492
            $set1->attach($enumerator);
493
            $set2->attach($enumerator);
494
            $this->assertTrue($set1->isSubset($set2));
495
        }
496
    }
497
498
    public function testIsSubsetFull()
499
    {
500
        $set1 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
501
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
502
503
        foreach (Enum32::getEnumerators() as $enumerator) {
504
            $set2->attach($enumerator);
505
            $this->assertTrue($set1->isSubset($set2));
506
        }
507
    }
508
509
    public function testIsSubsetFalse()
510
    {
511
        $set1 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
512
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
513
514
        foreach (Enum32::getEnumerators() as $enumerator) {
515
            $set1->attach($enumerator);
516
            $this->assertFalse($set1->isSubset($set2));
517
        }
518
    }
519
520
    public function testIsSubsetWrongInstance()
521
    {
522
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
523
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumInheritance');
524
        $this->assertFalse($set1->isSubset($set2));
525
526
        foreach (EnumBasic::getEnumerators() as $enumerator) {
527
            $set1->attach($enumerator);
528
            $this->assertFalse($set1->isSubset($set2));
529
530
            $set2->attach($enumerator->getValue());
531
            $this->assertFalse($set1->isSubset($set2));
532
        }
533
    }
534
535
    /**
536
     * if $A->isEqual($B) is true then $A->isSuperset($B) is also true
537
     */
538
    public function testIsSsetEqual()
539
    {
540
        $set1 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
541
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
542
        $this->assertTrue($set1->isSuperset($set2));
543
544
        foreach (Enum32::getEnumerators() as $enumerator) {
545
            $set1->attach($enumerator);
546
            $set2->attach($enumerator);
547
            $this->assertTrue($set1->isSuperset($set2));
548
        }
549
    }
550
551
    public function testIsSupersetFull()
552
    {
553
        $set1 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
554
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
555
556
        foreach (Enum32::getEnumerators() as $enumerator) {
557
            $set1->attach($enumerator);
558
            $this->assertTrue($set1->isSuperset($set2));
559
        }
560
    }
561
562
    public function testIsSupersetFalse()
563
    {
564
        $set1 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
565
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
566
567
        foreach (Enum32::getEnumerators() as $enumerator) {
568
            $set2->attach($enumerator);
569
            $this->assertFalse($set1->isSuperset($set2));
570
        }
571
    }
572
573
    public function testIsSupersetWrongInstance()
574
    {
575
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
576
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumInheritance');
577
        $this->assertFalse($set1->isSuperset($set2));
578
579
        foreach (EnumBasic::getEnumerators() as $enumerator) {
580
            $set1->attach($enumerator);
581
            $this->assertFalse($set1->isSuperset($set2));
582
583
            $set2->attach($enumerator->getValue());
584
            $this->assertFalse($set1->isSuperset($set2));
585
        }
586
    }
587
588
    public function testGetOrdinals()
589
    {
590
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
591
        $this->assertSame(array(), $set->getOrdinals());
592
593
        foreach (EnumBasic::getConstants() as $value) {
594
            $set->attach($value);
595
        }
596
597
        $this->assertSame(range(0, count(EnumBasic::getConstants()) - 1), $set->getOrdinals());
598
    }
599
600
    public function testGetOrdinalsDoesNotEffectIteratorPosition()
601
    {
602
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
603
        $set->attach(EnumBasic::ONE);
604
        $set->attach(EnumBasic::TWO);
605
        $set->next();
606
607
        $set->getOrdinals();
608
        $this->assertSame(EnumBasic::TWO, $set->current()->getValue());
609
    }
610
611
    public function testGetEnumerators()
612
    {
613
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
614
        $this->assertSame(array(), $set->getEnumerators());
615
616
        foreach (EnumBasic::getConstants() as $value) {
617
            $set->attach($value);
618
        }
619
620
        $this->assertSame(EnumBasic::getEnumerators(), $set->getEnumerators());
621
    }
622
623
    public function testGetEnumeratorsDoesNotEffectIteratorPosition()
624
    {
625
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
626
        $set->attach(EnumBasic::ONE);
627
        $set->attach(EnumBasic::TWO);
628
        $set->next();
629
630
        $set->getEnumerators();
631
        $this->assertSame(EnumBasic::TWO, $set->current()->getValue());
632
    }
633
634
    public function testGetValues()
635
    {
636
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
637
        $this->assertSame(array(), $set->getValues());
638
639
        foreach (EnumBasic::getConstants() as $value) {
640
            $set->attach($value);
641
        }
642
643
        $this->assertSame(array_values(EnumBasic::getConstants()), $set->getValues());
644
    }
645
646
    public function testGetValuesDoesNotEffectIteratorPosition()
647
    {
648
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
649
        $set->attach(EnumBasic::ONE);
650
        $set->attach(EnumBasic::TWO);
651
        $set->next();
652
653
        $set->getValues();
654
        $this->assertSame(EnumBasic::TWO, $set->current()->getValue());
655
    }
656
657
    public function testGetNames()
658
    {
659
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
660
        $this->assertSame(array(), $set->getNames());
661
662
        foreach (EnumBasic::getConstants() as $value) {
663
            $set->attach($value);
664
        }
665
666
        $this->assertSame(array_keys(EnumBasic::getConstants()), $set->getNames());
667
    }
668
669
    public function testGetNamesDoesNotEffectIteratorPosition()
670
    {
671
        $set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
672
        $set->attach(EnumBasic::ONE);
673
        $set->attach(EnumBasic::TWO);
674
        $set->next();
675
676
        $set->getNames();
677
        $this->assertSame(EnumBasic::TWO, $set->current()->getValue());
678
    }
679
680
    public function testUnion()
681
    {
682
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
683
        $set1->attach(EnumBasic::ONE);
684
        $set1->attach(EnumBasic::TWO);
685
686
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
687
        $set2->attach(EnumBasic::TWO);
688
        $set2->attach(EnumBasic::THREE);
689
690
        $set3 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
691
        $set3->attach(EnumBasic::THREE);
692
        $set3->attach(EnumBasic::FOUR);
693
694
        $rs = $set1->union($set2, $set3);
695
        $this->assertSame(array(
696
            EnumBasic::ONE,
697
            EnumBasic::TWO,
698
            EnumBasic::THREE,
699
            EnumBasic::FOUR,
700
        ), $rs->getValues());
701
    }
702
703
    public function testUnionThrowsInvalidArgumentException()
704
    {
705
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
706
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
707
708
        $this->setExpectedException('InvalidArgumentException');
709
        $set1->union($set2);
710
    }
711
712
    public function testIntersect()
713
    {
714
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
715
        $set1->attach(EnumBasic::ONE);
716
        $set1->attach(EnumBasic::TWO);
717
        $set1->attach(EnumBasic::THREE);
718
719
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
720
        $set2->attach(EnumBasic::TWO);
721
        $set2->attach(EnumBasic::THREE);
722
        $set2->attach(EnumBasic::FOUR);
723
724
        $set3 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
725
        $set3->attach(EnumBasic::THREE);
726
        $set3->attach(EnumBasic::FOUR);
727
        $set3->attach(EnumBasic::FIVE);
728
729
        $rs = $set1->intersect($set2, $set3);
730
        $this->assertSame(array(
731
            EnumBasic::THREE,
732
        ), $rs->getValues());
733
    }
734
735
    public function testIntersectThrowsInvalidArgumentException()
736
    {
737
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
738
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
739
740
        $this->setExpectedException('InvalidArgumentException');
741
        $set1->intersect($set2);
742
    }
743
744
    public function testDiff()
745
    {
746
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
747
        $set1->attach(EnumBasic::ONE);
748
        $set1->attach(EnumBasic::TWO);
749
        $set1->attach(EnumBasic::THREE);
750
751
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
752
        $set2->attach(EnumBasic::TWO);
753
        $set2->attach(EnumBasic::THREE);
754
        $set2->attach(EnumBasic::FOUR);
755
756
        $set3 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
757
        $set3->attach(EnumBasic::THREE);
758
        $set3->attach(EnumBasic::FOUR);
759
        $set3->attach(EnumBasic::FIVE);
760
761
        $rs = $set1->diff($set2, $set3);
762
        $this->assertSame(array(
763
            EnumBasic::ONE,
764
        ), $rs->getValues());
765
    }
766
767
    public function testDiffThrowsInvalidArgumentException()
768
    {
769
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
770
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
771
772
        $this->setExpectedException('InvalidArgumentException');
773
        $set1->diff($set2);
774
    }
775
776
    public function testSymDiff()
777
    {
778
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
779
        $set1->attach(EnumBasic::ONE);
780
        $set1->attach(EnumBasic::TWO);
781
        $set1->attach(EnumBasic::THREE);
782
783
        $set2 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
784
        $set2->attach(EnumBasic::TWO);
785
        $set2->attach(EnumBasic::THREE);
786
        $set2->attach(EnumBasic::FOUR);
787
788
        $set3 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
789
        $set3->attach(EnumBasic::THREE);
790
        $set3->attach(EnumBasic::FOUR);
791
        $set3->attach(EnumBasic::FIVE);
792
793
        $rs = $set1->symDiff($set2, $set3);
794
        $this->assertSame(array(
795
            EnumBasic::ONE,
796
            EnumBasic::FOUR,
797
            EnumBasic::FIVE,
798
        ), $rs->getValues());
799
    }
800
801
    public function testSymDiffThrowsInvalidArgumentException()
802
    {
803
        $set1 = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
804
        $set2 = new EnumSet('MabeEnumTest\TestAsset\Enum32');
805
806
        $this->setExpectedException('InvalidArgumentException');
807
        $set1->symDiff($set2);
808
    }
809
}
810