Skip to content

Commit 1621841

Browse files
committed
100% test coverage + fixed some small bugs found
1 parent d75e7b2 commit 1621841

File tree

2 files changed

+148
-31
lines changed

2 files changed

+148
-31
lines changed

src/MabeEnum/EnumMap.php

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,13 @@ public function attach($enum, $data = null)
8787

8888
public function contains($enum)
8989
{
90-
$this->initEnum($enum);
91-
return parent::contains($enum);
90+
try {
91+
$this->initEnum($enum);
92+
return parent::contains($enum);
93+
} catch (InvalidArgumentException $e) {
94+
// On an InvalidArgumentException the given argument can't be contained in this map
95+
return false;
96+
}
9297
}
9398

9499
public function detach($enum)
@@ -100,13 +105,14 @@ public function detach($enum)
100105
public function getHash($enum)
101106
{
102107
$this->initEnum($enum);
103-
return parent::getHash($enum);
108+
109+
// getHash is available since PHP 5.4
110+
return spl_object_hash($enum);
104111
}
105112

106113
public function offsetExists($enum)
107114
{
108-
$this->initEnum($enum);
109-
return parent::offsetExists($enum);
115+
return $this->contains($enum);
110116
}
111117

112118
public function offsetGet($enum)
@@ -124,30 +130,7 @@ public function offsetSet($enum, $data = null)
124130
public function offsetUnset($enum)
125131
{
126132
$this->initEnum($enum);
127-
parent::offsetUnset($enum, $data);
128-
}
129-
130-
private function initEnum(&$enum)
131-
{
132-
// auto instantiate
133-
if (is_scalar($enum)) {
134-
$enumClass = $this->enumClass;
135-
$enum = $enumClass::get($enum);
136-
return;
137-
}
138-
139-
// allow only enums of the same type
140-
// (don't allow instance of)
141-
$enumClass = get_class($enum);
142-
if ($enumClass && strcasecmp($enumClass, $this->enumClass) === 0) {
143-
return;
144-
}
145-
146-
throw new InvalidArgumentException(sprintf(
147-
"The given enum of type '%s' isn't same as the required type '%s'",
148-
get_class($enum) ?: gettype($enum),
149-
$this->enumClass
150-
));
133+
parent::offsetUnset($enum);
151134
}
152135

153136
public function current()
@@ -164,7 +147,7 @@ public function current()
164147
case self::CURRENT_AS_ORDINAL:
165148
return parent::current()->getOrdinal();
166149
default:
167-
throw new RuntimeException('Invalid current flags');
150+
throw new RuntimeException('Invalid current flag');
168151
}
169152
}
170153

@@ -180,7 +163,30 @@ public function key()
180163
case self::KEY_AS_ORDINAL:
181164
return parent::current()->getOrdinal();
182165
default:
183-
throw new RuntimeException('Invalid key flags');
166+
throw new RuntimeException('Invalid key flag');
184167
}
185168
}
169+
170+
private function initEnum(&$enum)
171+
{
172+
// auto instantiate
173+
if (is_scalar($enum)) {
174+
$enumClass = $this->enumClass;
175+
$enum = $enumClass::get($enum);
176+
return;
177+
}
178+
179+
// allow only enums of the same type
180+
// (don't allow instance of)
181+
$enumClass = get_class($enum);
182+
if ($enumClass && strcasecmp($enumClass, $this->enumClass) === 0) {
183+
return;
184+
}
185+
186+
throw new InvalidArgumentException(sprintf(
187+
"The given enum of type '%s' isn't same as the required type '%s'",
188+
get_class($enum) ?: gettype($enum),
189+
$this->enumClass
190+
));
191+
}
186192
}

tests/MabeEnumTest/EnumMapTest.php

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
use MabeEnum\Enum;
66
use MabeEnum\EnumMap;
77
use MabeEnumTest\TestAsset\EnumWithoutDefaultValue;
8+
use MabeEnumTest\TestAsset\EnumInheritance;
89
use PHPUnit_Framework_TestCase as TestCase;
10+
use ReflectionClass;
911

1012
/**
1113
* Unit tests for the class MabeEnum\EnumMap
@@ -31,11 +33,13 @@ public function testBasic()
3133
$this->assertNull($enumMap->attach($enum1, $value1));
3234
$this->assertTrue($enumMap->contains($enum1));
3335
$this->assertSame($value1, $enumMap[$enum1]);
36+
$this->assertSame(spl_object_hash($enum1), $enumMap->getHash($enum1));
3437

3538
$this->assertFalse($enumMap->contains($enum2));
3639
$this->assertNull($enumMap->attach($enum2, $value2));
3740
$this->assertTrue($enumMap->contains($enum2));
3841
$this->assertSame($value2, $enumMap[$enum2]);
42+
$this->assertSame(spl_object_hash($enum2), $enumMap->getHash($enum2));
3943

4044
$this->assertNull($enumMap->detach($enum1));
4145
$this->assertFalse($enumMap->contains($enum1));
@@ -58,11 +62,13 @@ public function testBasicWithConstantValuesAsEnums()
5862
$this->assertNull($enumMap->attach($enum1, $value1));
5963
$this->assertTrue($enumMap->contains($enum1));
6064
$this->assertSame($value1, $enumMap[$enum1]);
65+
$this->assertSame(spl_object_hash(EnumWithoutDefaultValue::ONE()), $enumMap->getHash($enum1));
6166

6267
$this->assertFalse($enumMap->contains($enum2));
6368
$this->assertNull($enumMap->attach($enum2, $value2));
6469
$this->assertTrue($enumMap->contains($enum2));
6570
$this->assertSame($value2, $enumMap[$enum2]);
71+
$this->assertSame(spl_object_hash(EnumWithoutDefaultValue::TWO()), $enumMap->getHash($enum2));
6672

6773
$this->assertNull($enumMap->detach($enum1));
6874
$this->assertFalse($enumMap->contains($enum1));
@@ -197,9 +203,114 @@ public function testIterateWithFlags()
197203
$this->assertSame('ONE', $enumMap->current());
198204
}
199205

206+
public function testArrayAccessWithObjects()
207+
{
208+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
209+
210+
$enumMap[EnumWithoutDefaultValue::ONE()] = 'first';
211+
$enumMap[EnumWithoutDefaultValue::TWO()] = 'second';
212+
213+
$this->assertTrue(isset($enumMap[EnumWithoutDefaultValue::ONE()]));
214+
$this->assertTrue(isset($enumMap[EnumWithoutDefaultValue::TWO()]));
215+
216+
$this->assertSame('first', $enumMap[EnumWithoutDefaultValue::ONE()]);
217+
$this->assertSame('second', $enumMap[EnumWithoutDefaultValue::TWO()]);
218+
219+
unset($enumMap[EnumWithoutDefaultValue::ONE()], $enumMap[EnumWithoutDefaultValue::TWO()]);
220+
221+
$this->assertFalse(isset($enumMap[EnumWithoutDefaultValue::ONE()]));
222+
$this->assertFalse(isset($enumMap[EnumWithoutDefaultValue::TWO()]));
223+
}
224+
225+
public function testArrayAccessWithValues()
226+
{
227+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
228+
229+
$enumMap[EnumWithoutDefaultValue::ONE] = 'first';
230+
$enumMap[EnumWithoutDefaultValue::TWO] = 'second';
231+
232+
$this->assertTrue(isset($enumMap[EnumWithoutDefaultValue::ONE]));
233+
$this->assertTrue(isset($enumMap[EnumWithoutDefaultValue::TWO]));
234+
235+
$this->assertSame('first', $enumMap[EnumWithoutDefaultValue::ONE]);
236+
$this->assertSame('second', $enumMap[EnumWithoutDefaultValue::TWO]);
237+
238+
unset($enumMap[EnumWithoutDefaultValue::ONE], $enumMap[EnumWithoutDefaultValue::TWO]);
239+
240+
$this->assertFalse(isset($enumMap[EnumWithoutDefaultValue::ONE]));
241+
$this->assertFalse(isset($enumMap[EnumWithoutDefaultValue::TWO]));
242+
}
243+
200244
public function testConstructThrowsInvalidArgumentExceptionIfEnumClassDoesNotExtendBaseEnum()
201245
{
202246
$this->setExpectedException('InvalidArgumentException');
203247
new EnumMap('stdClass');
204248
}
249+
250+
public function testSetFlagsThrowsInvalidArgumentExceptionOnUnsupportedKeyFlag()
251+
{
252+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
253+
254+
$this->setExpectedException('InvalidArgumentException');
255+
$enumMap->setFlags(5);
256+
}
257+
258+
public function testCurrentThrowsRuntimeExceptionOnInvalidFlag()
259+
{
260+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
261+
$enumMap->attach(EnumWithoutDefaultValue::ONE());
262+
$enumMap->rewind();
263+
264+
// change internal flags to an invalid current flag
265+
$reflectionClass = new ReflectionClass($enumMap);
266+
$reflectionProp = $reflectionClass->getProperty('flags');
267+
$reflectionProp->setAccessible(true);
268+
$reflectionProp->setValue($enumMap, 0);
269+
270+
$this->setExpectedException('RuntimeException');
271+
$enumMap->current();
272+
}
273+
274+
public function testKeyThrowsRuntimeExceptionOnInvalidFlag()
275+
{
276+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
277+
$enumMap->attach(EnumWithoutDefaultValue::ONE());
278+
$enumMap->rewind();
279+
280+
// change internal flags to an invalid current flag
281+
$reflectionClass = new ReflectionClass($enumMap);
282+
$reflectionProp = $reflectionClass->getProperty('flags');
283+
$reflectionProp->setAccessible(true);
284+
$reflectionProp->setValue($enumMap, 0);
285+
286+
$this->setExpectedException('RuntimeException');
287+
$enumMap->key();
288+
}
289+
290+
public function testSetFlagsThrowsInvalidArgumentExceptionOnUnsupportedCurrentFlag()
291+
{
292+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
293+
294+
$this->setExpectedException('InvalidArgumentException');
295+
$enumMap->setFlags(48);
296+
}
297+
298+
public function testInitEnumThrowsInvalidArgumentExceptionOnInvalidEnumGiven()
299+
{
300+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
301+
302+
$this->setExpectedException('InvalidArgumentException');
303+
$enumMap->offsetSet(EnumInheritance::INHERITANCE(), 'test');
304+
}
305+
306+
public function testContainsAndOffsetExistsReturnsFalseOnInvalidEnum()
307+
{
308+
$enumMap = new EnumMap('MabeEnumTest\TestAsset\EnumWithoutDefaultValue');
309+
310+
$this->assertFalse($enumMap->contains(EnumInheritance::INHERITANCE()));
311+
$this->assertFalse($enumMap->contains(EnumInheritance::INHERITANCE));
312+
313+
$this->assertFalse(isset($enumMap[EnumInheritance::INHERITANCE()]));
314+
$this->assertFalse(isset($enumMap[EnumInheritance::INHERITANCE]));
315+
}
205316
}

0 commit comments

Comments
 (0)