| 
<?php
 require_once('src/Phabstractic/Data/Types/Enumeration.php');
 require_once('src/Phabstractic/Data/Types/Exception/CodeGenerationException.php');
 require_once('src/Phabstractic/Data/Types/Exception/RuntimeException.php');
 
 use PHPUnit\Framework\TestCase;
 use Phabstractic\Data\Types;
 use Phabstractic\Data\Types\Exception;
 
 Types\Enumeration::createEnumerator('TestEnumeration', array( 'RED',
 'GREEN',
 'BLUE',
 'YELLOW',
 'ORANGE',),
 array('namespace' => 'EnumerationTests' ) );
 
 class EnumerationTest extends TestCase
 {
 
 public function testInstantiationWithoutConfig()
 {
 $enum = new Types\Enumeration('TestEnum', array('ONE'=>1,'TWO'=>2));
 
 $this->assertInstanceOf(Types\Enumeration::class, $enum);
 }
 
 public function testInstantiationWithConfig()
 {
 $enum = new Types\Enumeration(
 'TestEnum',
 array('ONE','TWO'),
 array('default'=>'ONE',
 'namespace'=>'TestNamespace',)
 );
 
 $this->assertInstanceOf(Types\Enumeration::class, $enum);
 $this->assertEquals($enum->getDefault(), 'ONE');
 
 return $enum;
 
 }
 
 public function testInstantiationWithBake() {
 $enum = new Types\Enumeration(
 'TestImmediateBake',
 array('RED','BLUE','GREEN',),
 array('default'=>'BLUE',
 'namespace'=>'TestNamespace',
 'bake'=>true,)
 );
 
 $this->assertTrue(class_exists('\\TestNamespace\\TestImmediateBake'));
 
 }
 
 /**
 * @depends testInstantiationWithConfig
 *
 */
 public function testClassnameAccessors($enum) {
 $this->assertEquals('TestEnum', $enum->getClassName());
 $enum->setClassName('ModifiedEnum');
 $this->assertEquals('ModifiedEnum', $enum->getClassName());
 }
 
 /**
 * @depends testInstantiationWithConfig
 *
 */
 public function testConstants($enum) {
 $this->assertEmpty(array_diff(array('ONE','TWO'), $enum->getConstants()));
 $enum->addConstant('THREE');
 $this->assertEmpty(array_diff(array('ONE','TWO','THREE'), $enum->getConstants()));
 $enum->addConstants(array('FOUR','TWO'));
 $this->assertEmpty(array_diff(array('ONE','TWO','THREE','FOUR'), $enum->getConstants()));
 $enum->removeConstant('TWO');
 $this->assertEmpty(array_diff(array('ONE','THREE','FOUR'), $enum->getConstants()));
 $enum->setConstants(array('SIX','SEVEN','EIGHT'));
 $this->assertEmpty(array_diff(array('SIX','SEVEN','EIGHT'), $enum->getConstants()));
 
 return $enum;
 
 }
 
 /**
 * @depends testConstants
 *
 */
 public function testDefaultAccessors($enum) {
 $enum->setDefault('THREE'); // this doesn't exist
 $this->assertEquals('', $enum->getDefault());
 $enum->setDefault('SEVEN');
 $this->assertEquals('SEVEN', $enum->getDefault());
 
 return $enum;
 
 }
 
 /**
 * @depends testDefaultAccessors
 *
 */
 public function testNamespaceAccessors($enum) {
 $this->assertEquals('TestNamespace', $enum->getNamespace());
 $enum->setNamespace('ModifiedNamespace');
 $this->assertEquals('ModifiedNamespace', $enum->getNamespace());
 
 }
 
 public function testEnumerationBake() {
 $enum = new Types\Enumeration(
 'TestEnumBake',
 array('ONE','TWO','RED'),
 array('default'=>'ONE',
 'namespace'=>'TestNamespace',)
 );
 
 $enum->bake();
 
 $this->assertTrue(class_exists('\\TestNamespace\\TestEnumBake'));
 
 return $enum;
 }
 
 /**
 * @depends testEnumerationBake
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testEnumerationRebake($enum)
 {
 $enum = new Types\Enumeration(
 'TestEnumBake',
 array('ONE','TWO','RED'),
 array('default'=>'RED',
 'namespace'=>'TestNamespace',)
 );
 
 $enum->bake();
 
 }
 
 public function testEnumerationInstance() {
 $enum = new Types\Enumeration(
 'TestEnumInstance',
 array('ONE','TWO','BLUE'),
 array('default'=>'ONE',
 'namespace'=>'TestNamespace',
 'bake'=>true)
 );
 
 $enum2 = new Types\Enumeration(
 'TestEnumInstanceBake',
 array('THREE','FOUR','RED','BLUE'),
 array('default'=>'THREE',
 'namespace'=>'TestNamespace')
 );
 
 $value = $enum->getInstance('TWO');
 $this->assertEquals(\TestNamespace\TestEnumInstance::TWO, $value->get());
 
 $value = $enum2->getInstance('RED');
 $this->assertEquals(\TestNamespace\TestEnumInstanceBake::RED, $value->get());
 
 $value = $enum2->getInstance('FOUR');
 $this->assertEquals(\TestNamespace\TestEnumInstanceBake::FOUR, $value->get());
 
 return $enum2;
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \UnexpectedValueException
 *
 */
 public function testEnumerationInstanceFalseValue($enum) {
 $value = $enum->getInstance('ONE');
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testClassnameAfterBaked($enum) {
 $enum->setClassname('AlreadyBakedTest');
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testSetConstantsAfterBaked($enum) {
 $enum->setConstants(array('BLAH'));
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testAddConstantAfterBaked($enum) {
 $enum->addConstant('BLAH');
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testAddConstantsAfterBaked($enum) {
 $enum->addConstants(array('BLAH'));
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testRemoveConstantAfterBaked($enum) {
 $enum->removeConstant('FOUR');
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testSetDefaultAfterBaked($enum) {
 $enum->setDefault('FOUR');
 
 }
 
 /**
 * @depends testEnumerationInstance
 * @expectedException \Phabstractic\Data\Types\Exception\RuntimeException
 *
 */
 public function testSetNamespaceAfterBaked($enum) {
 $enum->setNamespace('BadNamespace');
 
 }
 
 /**
 * @depends testEnumerationInstance
 *
 */
 public function testBaked($enum) {
 $this->assertTrue($enum->isBaked());
 
 }
 
 /**
 * @depends testEnumerationInstance
 *
 */
 public function testCreateEnumeration($enum) {
 $value = Types\Enumeration::createEnumeration('TestNamespace\\TestEnumInstanceBake', 'RED');
 $this->assertEquals(\TestNamespace\TestEnumInstanceBake::RED, $value->get());
 }
 
 public function testCreateEnumerator() {
 Types\Enumeration::createEnumerator(
 'TestStaticEnumBake',
 array('GOOGLE','YAHOO','MSN'),
 array('default'=>'GOOGLE',
 'namespace'=>'TestNamespace')
 );
 
 $this->assertTrue(class_exists('\\TestNamespace\\TestStaticEnumBake'));
 }
 
 /**
 * @expectedException \UnexpectedValueException
 *
 */
 public function testSetImproperEnumerationElement() {
 $e = new EnumerationTests\TestEnumeration(256);
 
 }
 }
 
 |