Vous êtes connecté en tant que anonymous Se Deconnecter
vendor/windwalker/structure/Test/StructureTest.php
4f5a31d2
 <?php declare(strict_types=1);
 /**
  * Part of Windwalker project Test files.  @codingStandardsIgnoreStart
  *
  * @copyright  Copyright (C) 2019 LYRASOFT Taiwan, Inc.
  * @license    LGPL-2.0-or-later
  */
 
 namespace Windwalker\Structure\Test;
 
 use Windwalker\Structure\Structure;
 use Windwalker\Structure\StructureHelper;
 use Windwalker\Test\TestCase\AbstractBaseTestCase;
 
 /**
  * Test class of Structure
  *
  * @since 2.0
  */
 class StructureTest extends AbstractBaseTestCase
 {
     /**
      * Test instance.
      *
      * @var Structure
      */
     protected $instance;
 
     /**
      * Sets up the fixture, for example, opens a network connection.
      * This method is called before a test is executed.
      *
      * @return void
      */
     protected function setUp(): void
     {
         $this->instance = new Structure($this->getTestData());
     }
 
     /**
      * getTestData
      *
      * @return  array
      */
     protected function getTestData()
     {
         return [
             'flower' => 'sakura',
             'olive' => 'peace',
             'pos1' => [
                 'sunflower' => 'love',
             ],
             'pos2' => [
                 'cornflower' => 'elegant',
             ],
             'array' => [
                 'A',
                 'B',
                 'C',
             ],
         ];
     }
 
     /**
      * Tears down the fixture, for example, closes a network connection.
      * This method is called after a test is executed.
      *
      * @return void
      */
     protected function tearDown(): void
     {
     }
 
     /**
      * Method to test __clone().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::__clone
      */
     public function test__clone()
     {
         $structure1 = new Structure($this->getTestData());
 
         $structure2 = clone $structure1;
 
         $this->assertEquals($structure1, $structure2);
     }
 
     /**
      * Method to test __toString().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::__toString
      */
     public function test__toString()
     {
         $this->assertJsonStringEqualsJsonString(json_encode($this->getTestData()), (string) $this->instance);
     }
 
     /**
      * Method to test jsonSerialize().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::jsonSerialize
      */
     public function testJsonSerialize()
     {
         $this->assertJsonStringEqualsJsonString(json_encode($this->getTestData()), (string) $this->instance);
     }
 
     /**
      * Method to test def().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::def
      */
     public function testDef()
     {
         $this->assertNull($this->instance->get('lily'));
 
         $this->instance->def('lily', 'love');
 
         $this->assertEquals('love', $this->instance->get('lily'));
     }
 
     /**
      * Method to test exists().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::exists
      */
     public function testExists()
     {
         $this->assertFalse($this->instance->exists('rose'));
         $this->assertTrue($this->instance->exists('flower'));
     }
 
     /**
      * Method to test get().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::get
      */
     public function testGet()
     {
         $this->assertEquals($this->instance->get('flower', 'canna'), 'sakura');
 
         $this->assertEquals($this->instance->get('not.exists', 'canna'), 'canna');
 
         $this->assertNull($this->instance->get('not.exists'));
 
         $this->assertEquals($this->instance->get('pos1.sunflower'), 'love');
     }
 
     /**
      * Method to test loadArray().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::load
      */
     public function testLoadArray()
     {
         $structure = new Structure();
 
         $structure->load($this->getTestData());
 
         $this->assertEquals($structure->get('olive'), 'peace');
 
         $this->assertEquals($structure->get('pos1.sunflower'), 'love');
     }
 
     /**
      * Method to test loadObject().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::load
      */
     public function testLoadObject()
     {
         $structure = new Structure();
 
         $structure->load((object) $this->getTestData());
 
         $this->assertEquals($structure->get('olive'), 'peace');
 
         $this->assertEquals($structure->get('pos1.sunflower'), 'love');
     }
 
     /**
      * Method to test loadFile().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::loadFile
      */
     public function testLoadFile()
     {
         $structure = new Structure();
 
         $this->assertEquals(
             $structure->reset()->loadFile(__DIR__ . '/Stubs/flower.json', 'json')->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadFile(__DIR__ . '/Stubs/flower.yml', 'yaml')->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadFile(__DIR__ . '/Stubs/flower.ini', 'ini')->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadFile(__DIR__ . '/Stubs/flower.xml', 'xml')->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadFile(__DIR__ . '/Stubs/flower.php', 'php')->get('flower'),
             'sakura'
         );
     }
 
     /**
      * Method to test loadString().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::loadString
      * @throws \Exception
      */
     public function testLoadString()
     {
         $structure = new Structure();
 
         $this->assertEquals(
             $structure->reset()->loadString(
                 file_get_contents(__DIR__ . '/Stubs/flower.json'),
                 'json'
             )->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadString(
                 file_get_contents(__DIR__ . '/Stubs/flower.yml'),
                 'yaml'
             )->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadString(
                 file_get_contents(__DIR__ . '/Stubs/flower.ini'),
                 'ini'
             )->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadString(
                 file_get_contents(__DIR__ . '/Stubs/flower.xml'),
                 'xml'
             )->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadString(
                 file_get_contents(__DIR__ . '/Stubs/flower.hjson'),
                 'hjson'
             )->get('flower'),
             'sakura'
         );
         $this->assertEquals(
             $structure->reset()->loadString(
                 file_get_contents(__DIR__ . '/Stubs/flower.toml'),
                 'toml',
                 ['load_raw' => true]
             )->get('flower'),
             'sakura'
         );
     }
 
     /**
      * Method to test merge().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::merge
      * @throws \Exception
      */
     public function testMerge()
     {
         // Test recursive merge
         $object1 = '{
             "foo" : "foo value",
             "bar" : {
                 "bar1" : "bar value 1",
                 "bar2" : "bar value 2",
                 "bar3" : "bar value 3"
             }
         }';
         $object2 = '{
             "foo" : "foo value",
             "bar" : {
                 "bar2" : "new bar value 2",
                 "bar3" : null
             }
         }';
 
         $structure1 = new Structure(json_decode($object1));
         $structure2 = new Structure(json_decode($object2));
 
         $structure1->merge($structure2);
 
         $this->assertEquals(
             'new bar value 2',
             $structure1->get('bar.bar2'),
             'Line: ' . __LINE__ . '. bar.bar2 should be override.'
         );
         $this->assertEquals(
             'bar value 1',
             $structure1->get('bar.bar1'),
             'Line: ' . __LINE__ . '. bar.bar1 should not be override.'
         );
         $this->assertSame(
             'bar value 3',
             $structure1->get('bar.bar3'),
             'Line: ' . __LINE__ . '. bar.bar3 should not be override.'
         );
 
         $structure = new Structure(['flower' => 'rose', 'honor' => 'Osmanthus month']);
 
         $structure->merge($this->instance);
 
         $this->assertEquals($structure->get('flower'), 'sakura');
         $this->assertEquals($structure->get('honor'), 'Osmanthus month');
     }
 
     /**
      * Method to test merge().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::merge
      */
     public function testMergeWithIgnoreValues()
     {
         // Test recursive merge
         $object1 = '{
             "foo" : "foo value",
             "bar" : {
                 "bar1" : "bar value 1",
                 "bar2" : "bar value 2",
                 "bar3" : "bar value 3"
             }
         }';
         $object2 = '{
             "foo" : "foo value",
             "bar" : {
                 "bar2" : "new bar value 2",
                 "bar3" : ""
             }
         }';
 
         $structure1 = new Structure(json_decode($object1));
         $structure2 = new Structure(json_decode($object2));
 
         $structure1->setIgnoreValues([null, '']);
         $structure1->merge($structure2);
 
         $this->assertEquals(
             'new bar value 2',
             $structure1->get('bar.bar2'),
             'Line: ' . __LINE__ . '. bar.bar2 should be override.'
         );
         $this->assertEquals(
             'bar value 1',
             $structure1->get('bar.bar1'),
             'Line: ' . __LINE__ . '. bar.bar1 should not be override.'
         );
         $this->assertSame(
             'bar value 3',
             $structure1->get('bar.bar3'),
             'Line: ' . __LINE__ . '. bar.bar3 should not be override.'
         );
 
         $structure = new Structure(['flower' => 'rose', 'honor' => 'Osmanthus month']);
 
         $structure->merge($this->instance);
 
         $this->assertEquals($structure->get('flower'), 'sakura');
         $this->assertEquals($structure->get('honor'), 'Osmanthus month');
     }
 
     /**
      * testMergeTo
      *
      * @return  void
      *
      * @covers \Windwalker\Structure\Structure::mergeTo
      */
     public function testMergeTo()
     {
         $structure = new Structure(['sunflower' => 'shine', 'honor' => 'Osmanthus month']);
 
         $this->instance->mergeTo('pos1', $structure);
 
         $this->assertEquals($this->instance->get('pos1.sunflower'), 'shine');
         $this->assertEquals($this->instance->get('pos1.honor'), 'Osmanthus month');
 
         $this->instance->mergeTo('foo.bar', $structure);
 
         $this->assertEquals($this->instance->get('foo.bar.sunflower'), 'shine');
         $this->assertEquals($this->instance->get('foo.bar.honor'), 'Osmanthus month');
     }
 
     /**
      * Method to test offsetExists().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::offsetExists
      */
     public function testOffsetExists()
     {
         $this->assertTrue(isset($this->instance['flower']));
         $this->assertFalse(isset($this->instance['carbon']));
     }
 
     /**
      * Method to test offsetGet().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::offsetGet
      */
     public function testOffsetGet()
     {
         $this->assertEquals($this->instance['flower'], 'sakura');
     }
 
     /**
      * Method to test offsetSet().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::offsetSet
      */
     public function testOffsetSet()
     {
         $this->instance['bird'] = 'flying';
 
         $this->assertEquals($this->instance['bird'], 'flying');
     }
 
     /**
      * Method to test offsetUnset().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::offsetUnset
      */
     public function testOffsetUnset()
     {
         unset($this->instance['bird']);
 
         $this->assertEquals($this->instance['bird'], null);
     }
 
     /**
      * Method to test set().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::set
      */
     public function testSet()
     {
         $this->instance->set('tree.bird', 'sleeping');
 
         $this->assertEquals($this->instance->get('tree.bird'), 'sleeping');
     }
 
     /**
      * Method to test setRaw()
      *
      * @return  void
      *
      * @covers \Windwalker\Structure\Structure::setRaw
      */
     public function testSetRaw()
     {
         $object = (object) ['foo' => 'bar'];
 
         $this->instance->setRaw('tree.bird', $object);
 
         $this->assertEquals('bar', $this->instance->get('tree.bird.foo'));
         $this->assertSame($object, $this->instance->get('tree.bird'));
     }
 
     /**
      * Method to test toArray().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::toArray
      */
     public function testToArray()
     {
         $structure = new Structure($this->getTestData());
 
         $this->assertEquals($structure->toArray(), $this->getTestData());
     }
 
     /**
      * Method to test toObject().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::toObject
      */
     public function testToObject()
     {
         $structure = new Structure($this->getTestData());
 
         $this->assertEquals($structure->toObject(), StructureHelper::toObject($this->getTestData()));
     }
 
     /**
      * Method to test toString().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::toString
      */
     public function testToString()
     {
         $structure = new Structure($this->getTestData());
 
         $this->assertStringSafeEquals($this->loadFile(__DIR__ . '/Stubs/flower.ini'), $structure->toString('ini'));
         $this->assertStringSafeEquals($this->loadFile(__DIR__ . '/Stubs/flower.json'), $structure->toString('json'));
         $this->assertStringSafeEquals($this->loadFile(__DIR__ . '/Stubs/flower.yml'), $structure->toString('yml'));
         $this->assertStringSafeEquals($this->loadFile(__DIR__ . '/Stubs/flower.xml'), $structure->toString('xml'));
         $this->assertStringSafeEquals($this->loadFile(__DIR__ . '/Stubs/flower.php'), $structure->toString('php', ['strict' => true]));
     }
 
     /**
      * Method to test flatten().
      *
      * @return void
      *
      * @covers \Windwalker\Structure\Structure::flatten
      */
     public function testFlatten()
     {
         $flatted = $this->instance->flatten();
 
         $this->assertEquals($flatted['pos1.sunflower'], 'love');
 
         $flatted = $this->instance->flatten('/');
 
         $this->assertEquals($flatted['pos1/sunflower'], 'love');
     }
 
     /**
      * testAppend
      *
      * @return  void
      *
      * @covers \Windwalker\Structure\Structure::push
      */
     public function testPush()
     {
         $structure = new Structure();
 
         $structure->set('foo', ['var1', 'var2', 'var3']);
 
         $structure->push('foo', 'var4');
 
         $this->assertEquals('var4', $structure->get('foo.3'));
 
         $structure->push('foo', 'var5', 'var6');
 
         $this->assertEquals('var5', $structure->get('foo.4'));
         $this->assertEquals('var6', $structure->get('foo.5'));
 
         $structure->setRaw('foo2', (object) ['var1', 'var2', 'var3']);
 
         $b = $structure->get('foo2');
 
         $this->assertTrue(is_object($b));
 
         $structure->push('foo2', 'var4');
 
         $b = $structure->get('foo2');
 
         $this->assertTrue(is_array($b));
     }
 
     /**
      * testShift
      *
      * @return  void
      *
      * @covers \Windwalker\Structure\Structure::shift
      */
     public function testShift()
     {
         $structure = new Structure();
 
         $structure->set('foo.bar', ['var1', 'var2', 'var3']);
 
         $this->assertEquals('var1', $structure->shift('foo.bar'));
 
         $this->assertEquals('var2', $structure->get('foo.bar.0'));
 
         $structure->setRaw('foo.bar2', (object) ['v1' => 'var1', 'v2' => 'var2', 'v3' => 'var3']);
 
         $this->assertEquals('var1', $structure->shift('foo.bar2'));
 
         $this->assertEquals('var2', $structure->get('foo.bar2.v2'));
 
         $this->assertTrue(is_array($structure->get('foo.bar2')));
     }
 
     /**
      * testPop
      *
      * @return  void
      *
      * @covers \Windwalker\Structure\Structure::pop
      */
     public function testPop()
     {
         $structure = new Structure();
 
         $structure->set('foo.bar', ['var1', 'var2', 'var3']);
 
         $this->assertEquals('var3', $structure->pop('foo.bar'));
 
         $this->assertNull($structure->get('foo.bar.2'));
 
         $structure->setRaw('foo.bar2', (object) ['v1' => 'var1', 'v2' => 'var2', 'v3' => 'var3']);
 
         $this->assertEquals('var3', $structure->pop('foo.bar2'));
 
         $this->assertNull($structure->get('foo.bar2.v3'));
 
         $this->assertTrue(is_array($structure->get('foo.bar2')));
     }
 
     /**
      * testUnshift
      *
      * @return  void
      *
      * @covers \Windwalker\Structure\Structure::unshift
      */
     public function testUnshift()
     {
         $structure = new Structure();
 
         $structure->set('foo', ['var1', 'var2', 'var3']);
 
         $structure->unshift('foo', 'var4');
 
         $this->assertEquals('var4', $structure->get('foo.0'));
 
         $structure->unshift('foo', 'var5', 'var6');
 
         $this->assertEquals('var5', $structure->get('foo.0'));
         $this->assertEquals('var6', $structure->get('foo.1'));
 
         $structure->setRaw('foo2', (object) ['var1', 'var2', 'var3']);
 
         $b = $structure->get('foo2');
 
         $this->assertTrue(is_object($b));
 
         $structure->unshift('foo2', 'var4');
 
         $b = $structure->get('foo2');
 
         $this->assertTrue(is_array($b));
     }
 
     /**
      * testReset
      *
      * @return  void
      *
      * @covers  \Windwalker\Structure\Structure::reset
      */
     public function testReset()
     {
         $this->instance->reset();
 
         $this->assertEquals([], $this->instance->getRaw());
     }
 
     /**
      * testGetRaw
      *
      * @return  void
      *
      * @covers  \Windwalker\Structure\Structure::getRaw
      */
     public function testGetRaw()
     {
         $this->assertEquals($this->getTestData(), $this->instance->getRaw());
     }
 
     /**
      * testGetIterator
      *
      * @return  void
      *
      * @covers  \Windwalker\Structure\Structure::getIterator
      */
     public function testGetIterator()
     {
         $this->assertInstanceOf('RecursiveArrayIterator', $this->instance->getIterator());
 
         $this->assertEquals($this->getTestData(), iterator_to_array($this->instance));
         $this->assertEquals(
             iterator_to_array(new \RecursiveIteratorIterator(new \RecursiveArrayIterator($this->getTestData()))),
             iterator_to_array(new \RecursiveIteratorIterator($this->instance))
         );
     }
 
     /**
      * testCount
      *
      * @return  void
      *
      * @covers  \Windwalker\Structure\Structure::count
      */
     public function testCount()
     {
         $this->assertEquals(5, count($this->instance));
     }
 
     /**
      * loadFile
      *
      * @param string $file
      *
      * @return  string
      */
     protected function loadFile($file)
     {
         $text = file_get_contents($file);
 
         return $text;
     }
 }