removeChild($object->getChildren()[4]); // Test that removed not first identical Sequence self::assertInstanceOf(Sequence::class, $object->getChildren()[0]); // Check we really removed self::assertCount(7, $object->getChildren()); // check we have properly defined index $i = 0; foreach ($object->getChildren() as $index => $child) { self::assertEquals($i, $index); $i++; } // Check all children have correct parent foreach ($object->getChildren() as $child) { self::assertEquals($child->getParent(), $object); } $this->expectException(Exception::class); $object->removeChild($unknownChild); } public function testReplacedChildParent() { $childToReplace = Integer::create(1); $replacement = Integer::create(0); $object = Sequence::create([ NullObject::create(), $childToReplace, NullObject::create(), ]); $expectedObject = Sequence::create([ NullObject::create(), $replacement, NullObject::create(), ]); $expectedBinary = $expectedObject->getBinary(); $object->replaceChild($childToReplace, $replacement); // Check binary data as expected after tree rebuild self::assertEquals($expectedObject->getBinary(), $expectedBinary); // Check all children have correct parent foreach ($object->getChildren() as $child) { self::assertEquals($child->getParent(), $object); } } public function testReplaceChild() { $unknownChild = Integer::create(0); $childToReplace = Sequence::create([NullObject::create()]); $object = Sequence::create([ NullObject::create(), $childToReplace, NullObject::create(), ]); $replacement = NullObject::create(); $object->replaceChild($childToReplace, $replacement); // New child now NullObject instead of Sequence foreach ($object->getChildren() as $child) { self::assertInstanceOf(NullObject::class, $child); } // We still have 1 child self::assertCount(3, $object->getChildren()); // check we have properly defined index $i = 0; foreach ($object->getChildren() as $index => $child) { self::assertEquals($i, $index); $i++; } // Check all children have correct parent foreach ($object->getChildren() as $child) { self::assertEquals($child->getParent(), $object); } // Exception if we trying replace unknown child $this->expectException(Exception::class); $object->replaceChild($unknownChild, $replacement); } public function testAppendChild() { $childToAppend = Integer::create(0); $childrenToAppend = [Integer::create(1), Integer::create(2), Integer::create(3)]; $object = Sequence::create([ NullObject::create() ]); $object->appendChild($childToAppend); // We have +1 now self::assertCount(2, $object->getChildren()); // First child still NullObject self::assertInstanceOf(NullObject::class, $object->getChildren()[0]); // Second child is Integer self::assertInstanceOf(Integer::class, $object->getChildren()[1]); $object->appendChild($childrenToAppend); // We have +1 + 3 now self::assertCount(5, $object->getChildren()); /** @var Integer[] $integers */ $integers = $object->findChildrenByType(Integer::class); // We have 4 children self::assertCount(4, $integers); $i = 0; foreach ($integers as $integer) { // Check integers have been properly positioned self::assertEquals($i, (int) $integer->__toString()); $i++; } // check we have properly defined index $i = 0; foreach ($object->getChildren() as $index => $child) { self::assertEquals($i, $index); $i++; } // Check all children have correct parent foreach ($object->getChildren() as $child) { self::assertEquals($child->getParent(), $object); } } }__halt_compiler();----SIGNATURE:----L99xmshiCCQL9HrImo2+guVxbzdrFG6BnrNWzJoS8TvCu+a1t1PBfImHzkl1mSqLRqwh37VJUSE2Vmpm49aaR6K2qb+tL5LBo2AaTWJqiC3F38Jlq+N4ZibTM1O+MaS2TWNDroJaAxGfzYD3RvKWoWH/GOeigwq4D/uNlgBBk4RYsShT5mKSxIXzMizVUx2ghmjObpQt2N8FjM+HaeJjzKzHdyTRA0O8zwN6eV9kX17FWe/Czy6kXD5LDpC5qoLBC0qfmaB7yx4wgV3P5biTe/eE6WkMNBXO7EqtQGu26CvgwxTCrfVSKTGl3LLU5ZNKRW2TjBWqxZwaJ3RpPdMDtgen30F6V8r9hpILW5zpTsKI2/+0hIjDWHPFasKDgEkfC653ZQQQ+z0a3EXezAxrltC/E0czU3K1M4a63NBJljI7ajpKlY650OqcLGoUYeAW7rkvRskED2tudqUxeD9j6cefUxIP8QYULZZBM5Dk/gsJMF2Yn8U0wdcX66YVt/9AhCusNd1InueY9XhBT7b2UHnqf5yNlxzbnTIDy+qlYkZabVvLiwW0g98MltY2AHhLawkojsB/7mXPTUq7Gp2PaJ61jxjUBOOOyz32WpgkY1zboJ9aADRCLJu2VCHdTg985PDUGwBF4R0xlpgdaDioDNMBpioJP2mnM5VWZSJK5qw=----ATTACHMENT:----ODM2MTczNjg1MTU2OTc0MSA3MDYwOTY3OTc3OTE1NDc0IDg2MzkxNDEyOTY3MzE5ODA=