Skip to content

Commit 8eca68b

Browse files
author
Marc Bennewitz
committed
Merge pull request #13 from marc-mabe/unique
LogicException on ambiguous values
2 parents 24657b6 + fbdfad5 commit 8eca68b

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

src/MabeEnum/Enum.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,27 @@ public function __construct($value)
3838
$reflectionClass = new ReflectionClass($this);
3939
$constants = $reflectionClass->getConstants();
4040

41+
// Constant values needs to be unique
42+
if (count($constants) > count(array_unique($constants))) {
43+
$ambiguous = array();
44+
foreach (array_count_values($constants) as $constValue => $countValue) {
45+
if ($countValue < 2) {
46+
continue;
47+
}
48+
$ambiguous[] = $constValue;
49+
}
50+
throw new LogicException(sprintf(
51+
'All possible values needs to be unique. The following are ambiguous: %s',
52+
"'" . implode("', '", $ambiguous) . "'"
53+
));
54+
}
55+
4156
// This is required to make sure that constants of base classes will be the first
4257
while ( ($reflectionClass = $reflectionClass->getParentClass()) ) {
4358
$constants = $reflectionClass->getConstants() + $constants;
4459
}
4560
$this->constants = $constants;
4661

47-
// TODO: Check that constant values are equal (non strict comparison)
48-
4962
// find and set the given value
5063
// set the defined value because of non strict comparison
5164
$const = array_search($value, $this->constants);

tests/MabeEnumTest/EnumTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,10 @@ public function testInstantiateUsingMagicMethodThrowsBadMethodCallException()
103103
$this->setExpectedException('BadMethodCallException');
104104
MabeEnumTest_TestAsset_EnumInheritance::UNKNOWN();
105105
}
106+
107+
public function testAmbuguousConstantsThrowsLogicException()
108+
{
109+
$this->setExpectedException('LogicException');
110+
new MabeEnumTest_TestAsset_EnumAmbiguous(MabeEnumTest_TestAsset_EnumAmbiguous::AMBIGUOUS1);
111+
}
106112
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
/**
4+
* Unit tests for the class MabeEnum_Enum
5+
*
6+
* @link http://github.com/marc-mabe/php-enum for the canonical source repository
7+
* @copyright Copyright (c) 2012 Marc Bennewitz
8+
* @license http://github.com/marc-mabe/php-enum/blob/master/LICENSE.txt New BSD License
9+
*/
10+
class MabeEnumTest_TestAsset_EnumAmbiguous extends MabeEnum_Enum
11+
{
12+
const UNIQUE1 = 'unique1';
13+
const AMBIGUOUS1 = 1;
14+
const UNIQUE2 = 'unique2';
15+
const AMBIGUOUS2 = '1';
16+
const UNIQUE3 = 'unique3';
17+
}

0 commit comments

Comments
 (0)