<?php

/**
 * Abstract base class for meta data tests.
 * 
 * @package Cache
 * @version //autogen//
 * @subpackage Test
 */
abstract class ezcCacheStackBaseMetaDataTest extends ezcTestCase
{
    protected $metaDataClass;

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

    public function testCtor()
    {
        $meta = new $this->metaDataClass();

        $this->assertAttributeEquals(
            array(),
            'storageData',
            $meta
        );
        $this->assertAttributeEquals(
            array(),
            'replacementData',
            $meta
        );
    }

    public function testAddItemBase()
    {
        $meta = new $this->metaDataClass();

        $this->assertAttributeEquals(
            array(),
            'storageData',
            $meta
        );

        // Add first item to unknown storage
        $meta->addItem( 'storage_id_1', 'item_id_1' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
            ),
            'storageData',
            $meta
        );

        // Add first item to second unknown storage
        $meta->addItem( 'storage_id_2', 'item_id_1' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_1' => true,
                ),
            ),
            'storageData',
            $meta
        );

        // Add second item to known storag
        $meta->addItem( 'storage_id_2', 'item_id_2' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_1' => true,
                    'item_id_2' => true,
                ),
            ),
            'storageData',
            $meta
        );

        // Add existing item without changes
        $meta->addItem( 'storage_id_1', 'item_id_1' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_1' => true,
                    'item_id_2' => true,
                ),
            ),
            'storageData',
            $meta
        );
    }

    public function testRemoveItem()
    {
        $meta = new $this->metaDataClass();
        $meta->setState(
            array(
                'storageData' => array(
                    'storage_id_1' => array(
                        'item_id_1' => true,
                    ),
                    'storage_id_2' => array(
                        'item_id_1' => true,
                        'item_id_2' => true,
                    ),
                ),
                'replacementData' => array(
                    'item_id_1' => 1,
                    'item_id_2' => 2,
                )
            )
        );

        // Assert basis
        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_1' => true,
                    'item_id_2' => true,
                ),
            ),
            'storageData',
            $meta
        );
        $this->assertAttributeEquals(
            array(
                'item_id_1' => 1,
                'item_id_2' => 2,
            ),
            'replacementData',
            $meta
        );

        // Remove item with non empty storage afterwards
        $meta->removeItem( 'storage_id_2', 'item_id_1' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_2' => true,
                ),
            ),
            'storageData',
            $meta
        );
        $this->assertAttributeEquals(
            array(
                'item_id_1' => 1,
                'item_id_2' => 2,
            ),
            'replacementData',
            $meta
        );

        // Remove item with empty storage afterwards
        $meta->removeItem( 'storage_id_2', 'item_id_2' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
            ),
            'storageData',
            $meta
        );
        $this->assertAttributeEquals(
            array(
                'item_id_1' => 1,
            ),
            'replacementData',
            $meta
        );

        // Remove unknown item
        $meta->removeItem( 'storage_id_1', 'item_id_2' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
            ),
            'storageData',
            $meta
        );
        $this->assertAttributeEquals(
            array(
                'item_id_1' => 1,
            ),
            'replacementData',
            $meta
        );

        // Remove from unknown storage
        $meta->removeItem( 'storage_id_2', 'item_id_1' );

        $this->assertAttributeEquals(
            array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
            ),
            'storageData',
            $meta
        );
        $this->assertAttributeEquals(
            array(
                'item_id_1' => 1,
            ),
            'replacementData',
            $meta
        );
    }

    public function testHasItem()
    {
        $meta = new $this->metaDataClass();
        $meta->setState(
            array(
                'storageData' => array(
                    'storage_id_1' => array(
                        'item_id_1' => true,
                    ),
                    'storage_id_2' => array(
                        'item_id_1' => true,
                        'item_id_2' => true,
                    ),
                ),
                'replacementData' => array(
                    'item_id_1' => 1,
                    'item_id_2' => 2,
                )
            )
        );
        
        // Known item in known storage
        $this->assertTrue(
            $meta->hasItem( 'storage_id_1', 'item_id_1' )
        );
        
        // Known item in unknown storage
        $this->assertFalse(
            $meta->hasItem( 'storage_id_3', 'item_id_1' )
        );
        
        // Unknown item in known storage
        $this->assertFalse(
            $meta->hasItem( 'storage_id_1', 'item_id_2' )
        );
        
        // Unknown item in unknown storage
        $this->assertFalse(
            $meta->hasItem( 'storage_id_3', 'item_id_3' )
        );
    }

    public function testReachedItemLimit()
    {
        $meta = new $this->metaDataClass();
        $meta->setState(
            array(
                'storageData' => array(
                    'storage_id_1' => array(
                        'item_id_1' => true,
                    ),
                    'storage_id_2' => array(
                        'item_id_1' => true,
                        'item_id_2' => true,
                    ),
                ),
                'replacementData' => array(
                    'item_id_1' => 1,
                    'item_id_2' => 2,
                )
            )
        );

        // Reached limit exactly
        $this->assertTrue(
            $meta->reachedItemLimit( 'storage_id_2', 2 )
        );

        // Over limit
        $this->assertTrue(
            $meta->reachedItemLimit( 'storage_id_2', 1 )
        );

        // Under limit
        $this->assertFalse(
            $meta->reachedItemLimit( 'storage_id_2', 3 )
        );

        // Unknown storage
        $this->assertFalse(
            $meta->reachedItemLimit( 'storage_id_3', 3 )
        );
    }

    public function testGetReplacementItems()
    {
        $meta = new $this->metaDataClass();
        $meta->setState(
            array(
                'storageData' => array(
                ),
                'replacementData' => array(
                    'item_id_1' => 4,
                    'item_id_2' => 3,
                    'item_id_5' => 2,
                    'item_id_3' => 8,
                    'item_id_4' => 5,
                )
            )
        );

        $sorted = array(
            'item_id_5' => 2,
            'item_id_2' => 3,
            'item_id_1' => 4,
            'item_id_4' => 5,
            'item_id_3' => 8,
        );
        
        // Returned array correctly sorted
        $this->assertEquals(
            $sorted,
            $meta->getReplacementItems()
        );

        // Attribute correctly sorted
        $this->assertAttributeEquals(
            $sorted,
            'replacementData',
            $meta
        );
    }

    public function testGetData()
    {
        $meta = new $this->metaDataClass();
        $data = array(
            'storageData' => array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_1' => true,
                    'item_id_2' => true,
                ),
            ),
            'replacementData' => array(
                'item_id_1' => 1,
                'item_id_2' => 2,
            )
        );

        $meta->setState(
            $data
        );
        $returnedData = $meta->getState();
        
        $this->assertEquals(
            $data['replacementData'],
            $returnedData['replacementData']
        );
        $this->assertEquals(
            $data['storageData'],
            $returnedData['storageData']
        );

    }

    public function testSetData()
    {
        $meta = new $this->metaDataClass();
        $data = array(
            'storageData' => array(
                'storage_id_1' => array(
                    'item_id_1' => true,
                ),
                'storage_id_2' => array(
                    'item_id_1' => true,
                    'item_id_2' => true,
                ),
            ),
            'replacementData' => array(
                'item_id_1' => 1,
                'item_id_2' => 2,
            )
        );

        $meta->setState(
            $data
        );
        
        $this->assertAttributeEquals(
            $data['replacementData'],
            'replacementData',
            $meta
        );
        $this->assertAttributeEquals(
            $data['storageData'],
            'storageData',
            $meta
        );
    }
}

?>
