<?php
/**
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 * @version //autogentag//
 * @package PersistentObject
 * @subpackage Tests
 */

require_once 'data/relation_test_person.php';
require_once 'data/relation_test_address.php';
require_once 'data/relation_test_employer.php';
require_once 'data/multi_relation_test_person.php';

/**
 * Tests the ezcPersistentBasicIdentityMap class.
 *
 * @package PersistentObject
 * @subpackage Tests
 */
class ezcPersistentBasicIdentityMapTest extends ezcTestCase
{
    protected $definitionManager;

    public static function suite()
    {
        return new PHPUnit_Framework_TestSuite( __CLASS__ );
    }

    public function setUp()
    {
        $this->definitionManager = new ezcPersistentCodeManager(
            dirname( __FILE__ ) . '/data'
        );
    }

    public function tearDown()
    {
    }

    /*
     * __construct()
     */

    public function testCtor()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );

        $this->assertAttributeSame(
            $this->definitionManager,
            'definitionManager',
            $idMap
        );
        $this->assertAttributeEquals(
            array(),
            'identities',
            $idMap
        );
    }

    /* 
     * getIdentity()
     */

    public function testGetIdentityFailureNotExists()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $this->assertNull(
            $idMap->getIdentity( 'RelationTestPerson', 23 )
        );
    }

    public function testGetIdentitySingleRecordedSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );
        
        $this->assertSame(
            $obj,
            $idMap->getIdentity( 'RelationTestPerson', 23 )
        );
    }

    public function testGetIdentityMultipleRecordedSameClassSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $objA     = new RelationTestPerson();
        $objA->id = 23;
        
        $objB     = new RelationTestPerson();
        $objB->id = 42;

        $idMap->setIdentity( $objA );
        $idMap->setIdentity( $objB );

        $this->assertSame(
            $objA,
            $idMap->getIdentity( 'RelationTestPerson', 23 )
        );

        $this->assertSame(
            $objB,
            $idMap->getIdentity( 'RelationTestPerson', 42 )
        );
    }

    public function testGetIdentityMultipleRecordedDifferentClassSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $objA     = new RelationTestPerson();
        $objA->id = 23;
        
        $objB     = new RelationTestAddress();
        $objB->id = 42;

        $idMap->setIdentity( $objA );
        $idMap->setIdentity( $objB );

        $this->assertSame(
            $objA,
            $idMap->getIdentity( 'RelationTestPerson', 23 )
        );

        $this->assertSame(
            $objB,
            $idMap->getIdentity( 'RelationTestAddress', 42 )
        );
    }

    /*
     * setIdentity()
     */

    public function testSetIdentitySingleObjectSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testSetIdentityTowObjectsSameClassSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $objA     = new RelationTestPerson();
        $objA->id = 23;

        $objB     = new RelationTestPerson();
        $objB->id = 42;

        $idMap->setIdentity( $objA );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $objA
                    ),
                ),
            ),
            'identities',
            $idMap
        );

        $idMap->setIdentity( $objB );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $objA
                    ),
                    42 => new ezcPersistentIdentity(
                        $objB
                    ),
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testSetIdentityTowObjectsDifferentClassSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $objA     = new RelationTestPerson();
        $objA->id = 23;

        $objB     = new RelationTestAddress();
        $objB->id = 23;

        $idMap->setIdentity( $objA );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $objA
                    ),
                ),
            ),
            'identities',
            $idMap
        );

        $idMap->setIdentity( $objB );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $objA
                    ),
                ),
                'RelationTestAddress' => array(
                    23 => new ezcPersistentIdentity(
                        $objB
                    ),
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testSetIdentityMissingDefinitionFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );

        $obj     = new stdClass();
        $obj->id = 23;

        try
        {
            $idMap->setIdentity( $obj );
            $this->fail( 'Exception not thrown on missing persistence definition.' );
        }
        catch( ezcPersistentDefinitionNotFoundException $e ) {}
    }

    public function testSetIdentitySameObjectTwiceSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );

        $idMap->setIdentity( $obj );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testSetIdentityEqualObjectTwiceFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $objA     = new RelationTestPerson();
        $objA->id = 23;
        
        $objB     = new RelationTestPerson();
        $objB->id = 23;

        $idMap->setIdentity( $objA );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $objA
                    )
                ),
            ),
            'identities',
            $idMap
        );

        $idMap->setIdentity( $objB );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $objB
                    )
                ),
            ),
            'identities',
            $idMap
        );
    }

    /*
     * removeIdentity()
     */

    public function testRemoveIdentityNotReferenced()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    ),
                ),
            ),
            'identities',
            $idMap
        );

        $idMap->removeIdentity( 'RelationTestPerson', 23 );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testRemoveIdentityReferenced()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        
        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) ),
                        array( 'set_name' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][65]->references )
        );

        $idMap->removeIdentity( 'RelationTestAddress', 42 );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertFalse( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        
        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( array( 65 => $relatedObjects[65] ) ) ),
                        array( 'set_name' => new ArrayObject( array( 65 => $relatedObjects[65] ) ) )
                    )
                ),
                'RelationTestAddress' => array(
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][65]->references )
        );
    }

    /*
     * setRelatedObjects()
     */

    public function testSetRelatedObjectsWithoutNameNotExistsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = new ArrayObject();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects->getArrayCopy(), 'RelationTestAddress' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => $relatedObjects )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][65]->references )
        );
    }

    public function testSetRelatedObjectsWithRelationNameNotExistsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new MultiRelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = new ArrayObject();
        $relatedObjects[42] = new MultiRelationTestPerson();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new MultiRelationTestPerson();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects(
            $obj,
            $relatedObjects->getArrayCopy(),
            'MultiRelationTestPerson',
            'fathers_children'
        );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );

        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'MultiRelationTestPerson__fathers_children' => $relatedObjects )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1, count( $identities['MultiRelationTestPerson'][42]->references )
        );
        $this->assertEquals(
            1, count( $identities['MultiRelationTestPerson'][65]->references )
        );
    }

    public function testSetRelatedObjectsWithNameNotExsistsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(),
                        array( 'set_name' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][65]->references )
        );
    }

    public function testSetRelatedObjectsTwiceWithDifferentNamesNotExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'first_set' );
        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'second_set' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(),
                        array(
                            'first_set' => new ArrayObject( $relatedObjects ),
                            'second_set' => new ArrayObject( $relatedObjects )
                        )
                    ),
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            2, count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            2, count( $identities['RelationTestAddress'][65]->references )
        );
    }

    public function testSetRelatedObjectsMissingIdentitySuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity( $obj, array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) ) )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][65]->references )
        );
    }

    public function testSetRelatedObjectsWithoutNameAlreadyExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity( $obj, array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) ) )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][65]->references )
        );
    }

    public function testSetRelatedObjectsWithNameAlreadyExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );
        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(),
                        array( 'set_name' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][42]->references )
        );
        $this->assertEquals(
            1, count( $identities['RelationTestAddress'][65]->references )
        );
    }

    public function testSetRelatedObjectsWithNameAlreadyExistReplaceIdentitiesSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $oldRelatedObjects = array();
        $oldRelatedObjects[42] = new RelationTestAddress();
        $oldRelatedObjects[42]->id = 42;


        $newRelatedObjects = array();
        $newRelatedObjects[42] = new RelationTestAddress();
        $newRelatedObjects[42]->id = 42;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $oldRelatedObjects[42] );

        $idMap->setRelatedObjectSet( $obj, $oldRelatedObjects, 'set_name' );

        $this->assertSame(
            $oldRelatedObjects[42],
            $idMap->getIdentity( 'RelationTestAddress', 42 )
        );
        $this->assertNotSame(
            $newRelatedObjects[42],
            $idMap->getIdentity( 'RelationTestAddress', 42 )
        );

        $idMap->setRelatedObjectSet( $obj, $newRelatedObjects, 'set_name', true );

        $this->assertNotSame(
            $oldRelatedObjects[42],
            $idMap->getIdentity( 'RelationTestAddress', 42 )
        );
        $this->assertSame(
            $newRelatedObjects[42],
            $idMap->getIdentity( 'RelationTestAddress', 42 )
        );
    }

    public function testSetRelatedObjectsInconsistentFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestEmployer();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        try
        {
            $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
            $this->fail( 'Exception not thrown on inconsistent related object set.' );
        }
        catch ( ezcPersistentIdentityRelatedObjectsInconsistentException $e ) {}

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestEmployer'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity( $obj )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                                    ),
                'RelationTestEmployer' => array(
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestEmployer'][65]->references
                    ),

                ),
            ),
            $identities
        );

        $this->assertEquals(
            0,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            0,
            count( $identities['RelationTestEmployer'][65]->references ),
            'Rel count of invalid object incorrect,'
        );
    }

    public function testSetUnnamedRelatedObjectsMissingIdentityFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $relObj     = new RelationTestAddress();
        $relObj->id = 42;
        
        try
        {
            $idMap->setRelatedObjects( $obj, array( $relObj ), 'RelationTestAddress' );
            $this->fail( 'Exception not thrown on setting related objects for unknown identity.' );
        }
        catch ( ezcPersistentIdentityMissingException $e ) {}
    }

    public function testSetNamedRelatedObjectsSetMissingIdentityFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $relObj     = new RelationTestAddress();
        $relObj->id = 42;
        
        try
        {
            $idMap->setRelatedObjectSet( $obj, array( $relObj ), 'named_set' );
            $this->fail( 'Exception not thrown on setting related objects for unknown identity.' );
        }
        catch ( ezcPersistentIdentityMissingException $e ) {}
    }

    /*
     * addRelatedObject()
     */

    public function testAddRelatedObjectToExistingSetSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        $idMap->setIdentity( $newRelatedObject );
        $idMap->addRelatedObject( $obj, $newRelatedObject );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][3]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects + array( 3 => $newRelatedObject ) ) )
                    ),
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                    3  => new ezcPersistentIdentity(
                        $newRelatedObject,
                        array(),
                        array(),
                        $identities['RelationTestAddress'][3]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][3]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testAddRelatedObjectWithRelationNameToExistingSetSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new MultiRelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new MultiRelationTestPerson();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new MultiRelationTestPerson();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects(
            $obj,
            $relatedObjects,
            'MultiRelationTestPerson',
            'mothers_children'
        );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );

        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'MultiRelationTestPerson__mothers_children' => new ArrayObject( $relatedObjects ) )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $newRelatedObject     = new MultiRelationTestPerson();
        $newRelatedObject->id = 3;
        
        $idMap->setIdentity( $newRelatedObject );
        $idMap->addRelatedObject( $obj, $newRelatedObject, 'mothers_children' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][3]->references ) );

        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'MultiRelationTestPerson__mothers_children' => new ArrayObject( $relatedObjects + array( 3 => $newRelatedObject ) ) )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                    3  => new ezcPersistentIdentity(
                        $newRelatedObject,
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][3]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][65]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][3]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testAddRelatedObjectIgnoredEmptySetSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $idMap->setIdentity( $obj );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );

        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        $idMap->setIdentity( $newRelatedObject );

        $idMap->addRelatedObject( $obj, $newRelatedObject );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
                'RelationTestAddress' => array(
                    3  => new ezcPersistentIdentity( $newRelatedObject ),
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testAddRelatedObjectInvalidateNamedSetsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'named_set' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) ),
                        array( 'named_set' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        $idMap->setIdentity( $newRelatedObject );
        $idMap->addRelatedObject( $obj, $newRelatedObject );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][3]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects + array( 3 => $newRelatedObject ) ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                    3  => new ezcPersistentIdentity(
                        $newRelatedObject,
                        array(),
                        array(),
                        $identities['RelationTestAddress'][3]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][3]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testAddRelatedObjectMissingSrcIdentityFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        try
        {
            $idMap->addRelatedObject( $obj, $newRelatedObject );
            $this->fail( 'Exception not thrown on setting related objects for unknown identity.' );
        }
        catch ( ezcPersistentIdentityMissingException $e ) {}
    }

    public function testAddRelatedObjectMissingDestIdentityFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $idMap->setIdentity( $obj );

        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        try
        {
            $idMap->addRelatedObject( $obj, $newRelatedObject );
            $this->fail( 'Exception not thrown on add of related object where the identity is missing.' );
        }
        catch ( ezcPersistentIdentityMissingException $e ) {}

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testAddRelatedObjectMissingDefinitionFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $idMap->setIdentity( $obj );

        $newRelatedObject     = new stdClass();
        $newRelatedObject->id = 3;
        
        try
        {
            $idMap->addRelatedObject( $obj, $newRelatedObject );
            $this->fail( 'Exception not thrown on missing definition of a related object.' );
        }
        catch ( ezcPersistentDefinitionNotFoundException $e ) {}

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testAddRelatedObjectTwiceFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );

        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        $idMap->setIdentity( $newRelatedObject );
        $idMap->addRelatedObject( $obj, $newRelatedObject );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][3]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects + array( 3 => $newRelatedObject ) ) )
                    ),
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                    3  => new ezcPersistentIdentity(
                        $newRelatedObject,
                        array(),
                        array(),
                        $identities['RelationTestAddress'][3]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][3]->references ),
            'Rel count of valid object incorrect,'
        );

        try
        {
            $idMap->addRelatedObject( $obj, $newRelatedObject );
            $this->fail( 'Exception not thrown on double add of same new related object.' );
        }
        catch( ezcPersistentIdentityRelatedObjectAlreadyExistsException $e ) {}

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][3]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects + array( 3 => $newRelatedObject ) ) )
                    ),
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                    3  => new ezcPersistentIdentity(
                        $newRelatedObject,
                        array(),
                        array(),
                        $identities['RelationTestAddress'][3]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][3]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    /*
     * removeRelatedObject()
     */

    public function testRemoveRelatedObjectSingleSetSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
        
        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $idMap->removeRelatedObject( $obj, $relatedObjects[42] );
        
        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(
                            'RelationTestAddress' => new ArrayObject( array(
                                65 => $relatedObjects[65],
                            ) )
                        )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            0,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testRemoveRelatedObjectNamedRelationSingleSetSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new MultiRelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new MultiRelationTestPerson();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new MultiRelationTestPerson();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects(
            $obj,
            $relatedObjects,
            'MultiRelationTestPerson',
            'fathers_children'
        );
        
        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );

        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'MultiRelationTestPerson__fathers_children' => new ArrayObject( $relatedObjects ) )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $idMap->removeRelatedObject( $obj, $relatedObjects[42], 'fathers_children' );
        
        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );

        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(
                            'MultiRelationTestPerson__fathers_children' => new ArrayObject( array(
                                65 => $relatedObjects[65],
                            ) )
                        )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            0,
            count( $identities['MultiRelationTestPerson'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][65]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testRemoveRelatedObjectMultipleSetsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );
        
        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) ),
                        array( 'set_name' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $idMap->removeRelatedObject( $obj, $relatedObjects[42] );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(
                            'RelationTestAddress' => new ArrayObject( array(
                                65 => $relatedObjects[65],
                            ) ),
                        ),
                        array(
                            'set_name' => new ArrayObject( array(
                                65 => $relatedObjects[65],
                            ) ),
                        )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            0,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testRemoveRelatedObjectRelationNameMultipleSetsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new MultiRelationTestPerson();
        $obj->id = 23;
        
        $relatedObjects = array();
        $relatedObjects[42] = new MultiRelationTestPerson();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new MultiRelationTestPerson();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'MultiRelationTestPerson', 'mothers_children' );
        $idMap->setRelatedObjects( $obj, $relatedObjects, 'MultiRelationTestPerson', 'fathers_children' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );
        
        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(
                            'MultiRelationTestPerson__mothers_children' => new ArrayObject( $relatedObjects ),
                            'MultiRelationTestPerson__fathers_children' => new ArrayObject( $relatedObjects ),
                        )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            2,
            count( $identities['MultiRelationTestPerson'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            2,
            count( $identities['MultiRelationTestPerson'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $idMap->removeRelatedObject( $obj, $relatedObjects[42], 'fathers_children' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][42]->references ) );
        $this->assertTrue( isset( $identities['MultiRelationTestPerson'][65]->references ) );

        $this->assertEquals(
            array(
                'MultiRelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array(
                            'MultiRelationTestPerson__fathers_children' => new ArrayObject( array(
                                65 => $relatedObjects[65],
                            ) ),
                            'MultiRelationTestPerson__mothers_children' => new ArrayObject( $relatedObjects ),
                        )
                    ),
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['MultiRelationTestPerson'][65]->references
                    ),
                ),
            ),
            $identities
        );

        $this->assertEquals(
            1,
            count( $identities['MultiRelationTestPerson'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            2,
            count( $identities['MultiRelationTestPerson'][65]->references ),
            'Rel count of valid object incorrect,'
        );
    }

    public function testRemoveRelatedObjectNotExistsSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );
        
        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );
        
        $relatedObject = new RelationTestAddress();
        $relatedObject->id = 42;

        $idMap->removeRelatedObject( $obj, $relatedObject );

        $this->assertAttributeEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj
                    )
                ),
            ),
            'identities',
            $idMap
        );
    }

    public function testRemoveRelatedObjectMissingSrcIdentityFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;
        
        $newRelatedObject     = new RelationTestAddress();
        $newRelatedObject->id = 3;
        
        try
        {
            $idMap->removeRelatedObject( $obj, $newRelatedObject );
            $this->fail( 'Exception not thrown on setting related objects for unknown identity.' );
        }
        catch ( ezcPersistentIdentityMissingException $e ) {}
    }

    /*
     * getRelatedObjects()
     */

    public function testGetRelatedObjectsUnnamedSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );

        $this->assertEquals(
            $relatedObjects,
            $idMap->getRelatedObjects( $obj, 'RelationTestAddress' )
        );
    }

    public function testGetRelatedObjectsRelationNameSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new MultiRelationTestPerson();
        $obj->id = 23;

        $relatedObjects = array();
        $relatedObjects[42] = new MultiRelationTestPerson();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new MultiRelationTestPerson();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects(
            $obj,
            $relatedObjects,
            'MultiRelationTestPerson',
            'mothers_children'
        );
        $idMap->setRelatedObjects(
            $obj,
            array(),
            'MultiRelationTestPerson',
            'fathers_children'
        );

        $this->assertEquals(
            $relatedObjects,
            $idMap->getRelatedObjects( $obj, 'MultiRelationTestPerson', 'mothers_children' )
        );
        $this->assertEquals(
            array(),
            $idMap->getRelatedObjects( $obj, 'MultiRelationTestPerson', 'fathers_children' )
        );
    }


    public function testGetRelatedObjectsNamedSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );

        $this->assertEquals(
            $relatedObjects,
            $idMap->getRelatedObjectSet( $obj, 'set_name' )
        );
    }

    public function testGetRelatedObjectsUnnamedNotExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertEquals(
            null,
            $idMap->getRelatedObjects( $obj, 'RelationTestAddress' )
        );
    }

    public function testGetRelatedObjectsNamedNotExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertEquals(
            null,
            $idMap->getRelatedObjectSet( $obj,'set_name' )
        );
    }

    public function testGetRelatedObjectsUnnamedSrcNotExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $this->assertEquals(
            null,
            $idMap->getRelatedObjects( $obj, 'RelationTestAddress' )
        );
    }

    public function testGetRelatedObjectsNamedSrcNotExistSuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $this->assertEquals(
            null,
            $idMap->getRelatedObjectSet( $obj,'set_name' )
        );
    }

    public function testGetRelatedObjectsUnnamedEmptySuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertEquals(
            null,
            $idMap->getRelatedObjects( $obj, 'RelationTestAddress' )
        );
    }

    public function testGetRelatedObjectsNamedEmptySuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        $this->assertEquals(
            null,
            $idMap->getRelatedObjectSet( $obj, 'set_name' )
        );
    }

    public function testGetRelatedObjectsUnknownClassFailure()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $idMap->setIdentity( $obj );

        try
        {
            $idMap->getRelatedObjects( $obj, 'stdClass' );
            $this->fail( 'Exception not thrown on access to related objects with missing relation.' );
        }
        catch ( ezcPersistentRelationNotFoundException $e ) {}
    }

    /*
     * reset()
     */

    public function testResetEmptySuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );

        $this->assertAttributeEquals(
            array(),
            'identities',
            $idMap
        );
        $this->assertAttributeSame(
            $this->definitionManager,
            'definitionManager',
            $idMap
        );

        $idMap->reset();

        $this->assertAttributeEquals(
            array(),
            'identities',
            $idMap
        );
        $this->assertAttributeSame(
            $this->definitionManager,
            'definitionManager',
            $idMap
        );
    }

    public function testResetNonEmptySuccess()
    {
        $idMap = new ezcPersistentBasicIdentityMap(
            $this->definitionManager
        );
        
        $obj     = new RelationTestPerson();
        $obj->id = 23;

        $relatedObjects = array();
        $relatedObjects[42] = new RelationTestAddress();
        $relatedObjects[42]->id = 42;
        $relatedObjects[65] = new RelationTestAddress();
        $relatedObjects[65]->id = 65;

        $idMap->setIdentity( $obj );
        $idMap->setIdentity( $relatedObjects[42] );
        $idMap->setIdentity( $relatedObjects[65] );

        $idMap->setRelatedObjects( $obj, $relatedObjects, 'RelationTestAddress' );
        $idMap->setRelatedObjectSet( $obj, $relatedObjects, 'set_name' );

        $identities = $this->readAttribute(
            $idMap, 'identities'
        );

        $this->assertTrue( isset( $identities['RelationTestAddress'][42]->references ) );
        $this->assertTrue( isset( $identities['RelationTestAddress'][65]->references ) );

        $this->assertEquals(
            array(
                'RelationTestPerson' => array(
                    23 => new ezcPersistentIdentity(
                        $obj,
                        array( 'RelationTestAddress' => new ArrayObject( $relatedObjects ) ),
                        array( 'set_name' => new ArrayObject( $relatedObjects ) )
                    )
                ),
                'RelationTestAddress' => array(
                    42 => new ezcPersistentIdentity(
                        $relatedObjects[42],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][42]->references
                    ),
                    65 => new ezcPersistentIdentity(
                        $relatedObjects[65],
                        array(),
                        array(),
                        $identities['RelationTestAddress'][65]->references
                    ),
                ),
            ),
            $identities
        );
        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][42]->references ),
            'Rel count of valid object incorrect,'
        );
        $this->assertEquals(
            2,
            count( $identities['RelationTestAddress'][65]->references ),
            'Rel count of valid object incorrect,'
        );

        $this->assertAttributeSame(
            $this->definitionManager,
            'definitionManager',
            $idMap
        );

        $idMap->reset();

        $this->assertAttributeEquals(
            array(),
            'identities',
            $idMap
        );
        $this->assertAttributeSame(
            $this->definitionManager,
            'definitionManager',
            $idMap
        );
    }
}

?>
