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:----eC9rHnaBgwqDazKt5CzZtZPrfJGdE5mnt5/UvrMnJE21qQvlxtlbh+XZD9V3mVORC1rQwcxlVTBL6iW2STsx/kGfrPr0/1sSC2FeFjmqgG3hL/jjKvcVkH8km+zSoG7NEHSOScgsZOIxrKoJhmtXGB7zqgbEPcZ4oy7gsHiVmh2cVuDZ6UnTOEyjvyuUtZpKdchXYu6VDIMhEqWqs0B7fKZnWcVLobOfSGVZ5KykkI3lJSWJVN3Gqrd64gOyy/xgILd7DKExrvf9EbiUi3JFeMhPtIDWf53yNaEZ762yyYez/acT14Ls4AUalXcIQpM/iyasX0bSkrkwHFbXlt7b8LfMtUzlwZEEVEiOGnsbDFkzcZajLytHdytNTfyIBiSq9JFZznqAEJKSFgc8X0cVOmFe+bN/K+a3A9K7OHqDimcwWMleAK+YpVXrwryD03GDPSeov8hwRkAcBHyHF3CvKwh/Ob0To5nueeBnJ2Ya2w95QU2kFsZpDtYAZgUL5LL0+zQ9O/B47HSO8IvrCIyVCEInrbiNJwnOKnQSf7JT1iLV1cCQVmvI3Tth0ecijzRWPrnPKomnD032DhwPQsI2AEwzw6g+5JkucedktphCg6/nuBV0EyAD9jzL1HpPSKmYl7VhCGnYjVFtF8KRky8GCqZY2nvWD5f68pX9lQ/4Ru8=----ATTACHMENT:----OTM4MTkxNjY4NjMwMDEwMSAxNzI1Mjg5MDc4Nzc4NjkyIDYyMzcxMDE1Njg2NDgxMzQ=