diff --git a/src/Enum.php b/src/Enum.php index ded6610..d2fb864 100755 --- a/src/Enum.php +++ b/src/Enum.php @@ -12,7 +12,8 @@ * Create an enum by implementing this class and adding class constants. * * @author Matthieu Napoli - * @author Daniel Costa + * @author Mirosław Filip */ abstract class Enum { @@ -22,7 +23,7 @@ abstract class Enum * @var mixed */ protected $value; - + /** * Store existing constants in a static cache per object. * @@ -39,7 +40,7 @@ abstract class Enum */ public function __construct($value) { - if (!in_array($value, self::toArray())) { + if (!$this->isValid($value)) { throw new \UnexpectedValueException("Value '$value' is not part of the enum " . get_called_class()); } @@ -106,7 +107,7 @@ public static function toArray() */ public static function isValid($value) { - return in_array($value, self::toArray()); + return in_array($value, self::toArray(), true); } /** @@ -118,7 +119,7 @@ public static function isValid($value) */ public static function isValidKey($key) { - return in_array($key, self::keys()); + return in_array($key, self::keys(), true); } /** diff --git a/tests/EnumFixture.php b/tests/EnumFixture.php index 9ea26fc..d04b890 100644 --- a/tests/EnumFixture.php +++ b/tests/EnumFixture.php @@ -15,11 +15,25 @@ * @method static EnumFixture BAR() * @method static EnumFixture NUMBER() * - * @author Daniel Costa + * @author Mirosław Filip */ class EnumFixture extends Enum { const FOO = "foo"; const BAR = "bar"; const NUMBER = 42; + + /** + * Values that are known to cause problems when used with soft typing + */ + const PROBLEMATIC_NUMBER = 0; + const PROBLEMATIC_NULL = null; + const PROBLEMATIC_EMPTY_STRING = ''; + const PROBLEMATIC_BOOLEAN_FALSE = false; } diff --git a/tests/EnumTest.php b/tests/EnumTest.php index d01b20b..64270bb 100755 --- a/tests/EnumTest.php +++ b/tests/EnumTest.php @@ -8,7 +8,8 @@ /** * @author Matthieu Napoli - * @author Daniel Costa + * @author Mirosław Filip */ class EnumTest extends \PHPUnit_Framework_TestCase { @@ -38,42 +39,44 @@ public function testGetKey() } /** - * @expectedException \UnexpectedValueException + * @dataProvider invalidValueProvider */ - public function testInvalidValueString() + public function testCreatingEnumWithInvalidValue($value) { - new EnumFixture("test"); - } + $this->setExpectedException( + '\UnexpectedValueException', + 'Value \'' . $value . '\' is not part of the enum MyCLabs\Tests\Enum\EnumFixture' + ); - /** - * @expectedException \UnexpectedValueException - */ - public function testInvalidValueInt() - { - new EnumFixture(1234); + new EnumFixture($value); } /** - * @expectedException \UnexpectedValueException + * Contains values not existing in EnumFixture + * @return array */ - public function testInvalidValueEmpty() - { - new EnumFixture(null); + public function invalidValueProvider() { + return array( + "string" => array('test'), + "int" => array(1234), + ); } /** * __toString() + * @dataProvider toStringProvider */ - public function testToString() + public function testToString($expected, $enumObject) { - $value = new EnumFixture(EnumFixture::FOO); - $this->assertEquals(EnumFixture::FOO, (string) $value); - - $value = new EnumFixture(EnumFixture::BAR); - $this->assertEquals(EnumFixture::BAR, (string) $value); + $this->assertSame($expected, (string) $enumObject); + } - $value = new EnumFixture(EnumFixture::NUMBER); - $this->assertEquals((string) EnumFixture::NUMBER, (string) $value); + public function toStringProvider() { + return array( + array(EnumFixture::FOO, new EnumFixture(EnumFixture::FOO)), + array(EnumFixture::BAR, new EnumFixture(EnumFixture::BAR)), + array((string) EnumFixture::NUMBER, new EnumFixture(EnumFixture::NUMBER)), + ); } /** @@ -82,13 +85,17 @@ public function testToString() public function testKeys() { $values = EnumFixture::keys(); - $this->assertInternalType("array", $values); $expectedValues = array( "FOO", "BAR", "NUMBER", + "PROBLEMATIC_NUMBER", + "PROBLEMATIC_NULL", + "PROBLEMATIC_EMPTY_STRING", + "PROBLEMATIC_BOOLEAN_FALSE", ); - $this->assertEquals($expectedValues, $values); + + $this->assertSame($expectedValues, $values); } /** @@ -97,13 +104,17 @@ public function testKeys() public function testToArray() { $values = EnumFixture::toArray(); - $this->assertInternalType("array", $values); $expectedValues = array( - "FOO" => EnumFixture::FOO, - "BAR" => EnumFixture::BAR, - "NUMBER" => EnumFixture::NUMBER, + "FOO" => EnumFixture::FOO, + "BAR" => EnumFixture::BAR, + "NUMBER" => EnumFixture::NUMBER, + "PROBLEMATIC_NUMBER" => EnumFixture::PROBLEMATIC_NUMBER, + "PROBLEMATIC_NULL" => EnumFixture::PROBLEMATIC_NULL, + "PROBLEMATIC_EMPTY_STRING" => EnumFixture::PROBLEMATIC_EMPTY_STRING, + "PROBLEMATIC_BOOLEAN_FALSE" => EnumFixture::PROBLEMATIC_BOOLEAN_FALSE, ); - $this->assertEquals($expectedValues, $values); + + $this->assertSame($expectedValues, $values); } /** @@ -128,11 +139,29 @@ public function testBadStaticAccess() /** * isValid() + * @dataProvider isValidProvider */ - public function testIsValid() + public function testIsValid($value, $isValid) { - $this->assertTrue(EnumFixture::isValid('foo')); - $this->assertFalse(EnumFixture::isValid('baz')); + $this->assertSame($isValid, EnumFixture::isValid($value)); + } + + public function isValidProvider() { + return array( + /** + * Valid values + */ + array('foo', true), + array(42, true), + array(null, true), + array(0, true), + array('', true), + array(false, true), + /** + * Invalid values + */ + array('baz', false) + ); } /** @@ -150,6 +179,9 @@ public function testIsValidKey() public function testSearch() { $this->assertEquals('FOO', EnumFixture::search('foo')); - $this->assertNotEquals('FOO', EnumFixture::isValidKey('baz')); + /** + * @see https://github.com/myclabs/php-enum/issues/9 + */ + $this->assertEquals(EnumFixture::PROBLEMATIC_NUMBER, EnumFixture::search(1)); } }