Nelmio\Alice\Definition\Object\CompleteObjectTest::testDelegatesImmutabilityToTheDecoratedObject PHP Method

testDelegatesImmutabilityToTheDecoratedObject() public method

    public function testDelegatesImmutabilityToTheDecoratedObject()
    {
        // Case where the decorated object is mutable
        $decoratedObject = new SimpleObject('dummy', $instance = new \stdClass());
        $object = new CompleteObject($decoratedObject);
        $instance->foo = 'bar';
        $object->getInstance()->foz = 'baz';
        $clone = clone $object;
        $instance->fao = 'bor';
        $clone->getInstance()->faz = 'boz';
        $this->assertEquals(StdClassFactory::create(['foo' => 'bar', 'foz' => 'baz', 'fao' => 'bor', 'faz' => 'boz']), $object->getInstance());
        $this->assertEquals($object->getInstance(), $clone->getInstance());
        // Case where the decorated object is partially immutable: cloning does create a new instance
        $decoratedObject = new ImmutableByCloneObject('dummy', $instance = new \stdClass());
        $object = new CompleteObject($decoratedObject);
        $instance->foo = 'bar';
        $object->getInstance()->foz = 'baz';
        $clone = clone $object;
        $instance->fao = 'bor';
        $clone->getInstance()->faz = 'boz';
        $this->assertEquals(StdClassFactory::create(['foo' => 'bar', 'foz' => 'baz', 'fao' => 'bor']), $object->getInstance());
        $this->assertEquals(StdClassFactory::create(['foo' => 'bar', 'foz' => 'baz', 'faz' => 'boz']), $clone->getInstance());
        // Case where the decorated object is truly immutable
        $decoratedObject = new ImmutableObject('dummy', $instance = new \stdClass());
        $object = new CompleteObject($decoratedObject);
        $instance->foo = 'bar';
        $object->getInstance()->foz = 'baz';
        $clone = clone $object;
        $instance->fao = 'bor';
        $clone->getInstance()->faz = 'boz';
        $this->assertEquals(new \stdClass(), $object->getInstance());
        $this->assertEquals(new \stdClass(), $clone->getInstance());
    }