<?php
 
 
class A_CollectionTest extends UnitTestCase
 
{
 
    public function testConstruct()
 
    {
 
        $collection = new A_Collection(array('foo' => 'bar', 'baz' => array('foobar' => 'barfoo')));
 
        
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        $this->assertEqual($collection->get('baz')->get('foobar'), 'barfoo');
 
        $this->assertEqual($collection->count(), 2);
 
        $this->assertEqual($collection->get('baz')->count(), 1);
 
    }
 
    
 
    public function testImport()
 
    {
 
        $collection = new A_Collection(array('foo' => 'bar', 'baz' => array('foobar' => 'barfoo'), 'bar' => 'baz'));
 
        $return = $collection->import(array('bar' => 'foo', 'baz' => array('foo' => 'bar'), 'barfoo' => 'foo'));
 
        
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        $this->assertEqual($collection->get('baz')->get('foobar'), 'barfoo');
 
        $this->assertEqual($collection->get('baz')->get('foo'), 'bar');
 
        $this->assertEqual($collection->get('bar'), 'foo');
 
        $this->assertEqual($collection->get('barfoo'), 'foo');
 
        $this->assertEqual($collection->count(), 4);
 
        $this->assertEqual($collection->get('baz')->count(), 2);
 
        
 
        // make sure import() returns self
 
        $this->assertEqual($return, $collection);
 
    }
 
    
 
    public function testGet()
 
    {
 
        $collection = $this->createFlatCollection();
 
        $collection->set('foo', 'bar');
 
        
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        $this->assertEqual($collection->get('baz', 'default'), 'default');
 
        $this->assertTrue($collection->get('baz') === null);
 
    }
 
    
 
    public function testSet()
 
    {
 
        $collection = new A_Collection();
 
        
 
        $collection->set('foo', 'bar');
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        
 
        $collection->set('foo', 'baz', 'bar');
 
        $this->assertEqual($collection->get('foo'), 'baz');
 
        
 
        $collection->set('foo', null, 'bar');
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        
 
        $collection->set('foo', null, null);
 
        $this->assertFalse($collection->has('foo'));
 
        
 
        // make sure set() returns self
 
        $return = $collection->set(null, null, null);
 
        $this->assertEqual($return, $collection);
 
    }
 
    
 
    public function testAdd()
 
    {
 
        $collection = new A_Collection();
 
        
 
        $collection->add('foo');
 
        $this->assertEqual($collection->get(0), 'foo');
 
        
 
        $collection->add('bar', false);
 
        $this->assertEqual($collection->get(1), 'bar');
 
        
 
        $collection->add('baz', true);
 
        $this->assertEqual($collection->get(2), 'baz');
 
        
 
        $collection = new A_Collection();
 
        
 
        $collection->add(null);
 
        $this->assertTrue($collection->get(0, 'foo'), null);
 
        
 
        $collection->add(null, false);
 
        $this->assertTrue($collection->get(1, 'foo'), null);
 
        
 
        $collection->add(null, true);
 
        $this->assertFalse($collection->has(2));
 
        
 
        // make sure add() returns self
 
        $return = $collection->add(null);
 
        $this->assertEqual($return, $collection);
 
    }
 
 
    public function testAddAll()
 
    {
 
        $collection = new A_Collection(array(
 
            'foo' => 'bar',
 
            'barfoo' => 'baz'
 
        ));
 
        
 
        $array = array(2, 4, 'foo');
 
        $collection->addAll($array);
 
 
        $this->assertEqual($collection->toArray(), array(
 
            'foo' => 'bar',
 
            'barfoo' => 'baz',
 
            0 => 2,
 
            1 => 4,
 
            2 => 'foo'
 
        ));
 
 
        $collection = new A_Collection();
 
        $otherCollection = new A_Collection(array(
 
            'foo' => 'bar',
 
            'blah' => 'baz'
 
        ));
 
 
        $collection->addAll($otherCollection);
 
 
        $this->assertEqual($collection->toArray(), array(
 
            0 => 'bar',
 
            1 => 'baz'
 
        ));
 
 
        $collection = new A_Collection();
 
        $array = array('foo', 'bar', null, false, 0, '', 'baz');
 
 
        $collection->addAll($array, true);
 
 
        $this->assertEqual($collection->toArray(), array(
 
            'foo',
 
            'bar',
 
            false,
 
            0,
 
            '',
 
            'baz'
 
        ));
 
    }
 
    
 
    public function testRemove()
 
    {
 
        $collection = new A_Collection();
 
        
 
        $collection->set('foo', 'bar');
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        
 
        $collection->remove('foo');
 
        $this->assertFalse($collection->has('foo'));
 
        
 
        // make sure remove() returns self
 
        $return = $collection->remove(null);
 
        $this->assertEqual($return, $collection);
 
    }
 
    
 
    public function testCount()
 
    {
 
        $collection = new A_Collection();
 
        
 
        $this->assertEqual($collection->count(), 0);
 
        
 
        $collection->add('foo');
 
        $this->assertEqual($collection->count(), 1);
 
        
 
        $collection->set('bar', 'baz');
 
        $this->assertEqual($collection->count(), 2);
 
        
 
        $collection->set('baz', null);
 
        $this->assertEqual($collection->count(), 2);
 
        
 
        $collection->remove(0);
 
        $this->assertEqual($collection->count(), 1);
 
    }
 
    
 
    public function testUserSort()
 
    {
 
        $items = array(
 
            array('name' => 'bob', 'age' => 40),
 
            array('name' => 'mike', 'age' => 23),
 
            array('name' => 'jim', 'age' => 37)
 
        );
 
        $collection = new A_Collection($items);
 
        
 
        $this->assertTrue($collection->get(0)->get('name') == $items[0]['name']);
 
        $this->assertTrue($collection->get(1)->get('name') == $items[1]['name']);
 
        $this->assertTrue($collection->get(2)->get('name') == $items[2]['name']);
 
        
 
        $return = $collection->userSort(function ($item1, $item2) {
 
            return $item1->get('age') - $item2->get('age');
 
        });
 
        // make sure userSort returns it's object
 
        $this->assertTrue($return == $collection);
 
        
 
        $this->assertTrue($collection->get(0)->get('name') == $items[1]['name']);
 
        $this->assertTrue($collection->get(1)->get('name') == $items[2]['name']);
 
        $this->assertTrue($collection->get(2)->get('name') == $items[0]['name']);
 
    }
 
    
 
    public function testSlice()
 
    {
 
        $collection = new A_Collection(array('foo' => 'bar', 'baz' => 'foobar', 'barfoo' => 'foobarbaz', 'bazbarfoo' => 'foobazbar'));
 
        
 
        $slice = $collection->slice(1, 2);
 
        
 
        $this->assertEqual($slice->count(), 2);
 
        $this->assertEqual($slice->get('baz'), 'foobar');
 
        $this->assertEqual($slice->get('barfoo'), 'foobarbaz');
 
        
 
        $slice = $collection->slice(1);
 
        
 
        $this->assertEqual($slice->count(), 3);
 
        $this->assertEqual($slice->get('baz'), 'foobar');
 
        $this->assertEqual($slice->get('barfoo'), 'foobarbaz');
 
        $this->assertEqual($slice->get('bazbarfoo'), 'foobazbar');
 
    }
 
    
 
    public function testHas()
 
    {
 
        $collection = new A_Collection(array('foo' => 'bar'));
 
        
 
        $this->assertTrue($collection->has('foo'));
 
        $this->assertFalse($collection->has('baz'));
 
    }
 
    
 
    public function testToArray()
 
    {
 
        $collection = new A_Collection(array('foo' => 'bar', 'baz'));
 
        $this->assertEqual($collection->toArray(), $collection->toArray(false));
 
        
 
        $array = $collection->toArray();
 
        $this->assertTrue(is_array($array));
 
        $this->assertEqual($array['foo'], 'bar');
 
        $this->assertEqual($array[0], 'baz');
 
        
 
        $collection = new A_Collection(array('foo' => 'bar', 'bar' => array('baz' => 'foo')));
 
        $this->assertEqual($collection->toArray(), $collection->toArray(false));
 
        
 
        $array = $collection->toArray();
 
        $this->assertTrue(is_array($array));
 
        $this->assertEqual($array['foo'], 'bar');
 
        $this->assertFalse(is_array($array['bar']));
 
        $this->assertEqual($array['bar']->get('baz'), 'foo');
 
        
 
        $array = $collection->toArray(true);
 
        $this->assertTrue(is_array($array));
 
        $this->assertEqual($array['foo'], 'bar');
 
        $this->assertTrue(is_array($array));
 
        $this->assertEqual($array['bar']['baz'], 'foo');
 
    }
 
    
 
    public function testNestedJoin()
 
    {
 
        $collection = $this->createNestedCollection();
 
        $joined = $collection->join('');
 
        
 
        $this->assertEqual($joined, 'foobarfoobarbarfooblah');
 
    }
 
    
 
    public function testFlatJoin()
 
    {
 
        $collection = $this->createFlatCollection();
 
        $joined = $collection->join('');
 
        
 
        $this->assertEqual($joined, 'foobarfoobar');
 
    }
 
    
 
    public function testIterator()
 
    {
 
        $array = array('foo' => 'bar', 'baz' => 'foobar');
 
        $collection = new A_Collection($array);
 
        
 
        // do twice to make sure there are no problems with reset()
 
        for ($i = 0; $i < 2; $i++) {
 
            foreach ($collection as $key => $value) {
 
                $this->assertEqual($value, $array[$key]);
 
            }
 
        }
 
    }
 
    
 
    public function testArrayAccess()
 
    {
 
        $collection = new A_Collection();
 
        
 
        $this->assertFalse(isset($collection['foo']));
 
        
 
        $collection['foo'] = 'bar';
 
        $this->assertTrue(isset($collection['foo']));
 
        $this->assertEqual($collection['foo'], 'bar');
 
        
 
        unset($collection['foo']);
 
        $this->assertFalse(isset($collection['foo']));
 
    }
 
    
 
    public function test__ToString()
 
    {
 
        $collection = $this->createNestedCollection();
 
        
 
        $this->assertEqual(strval($collection), $collection->join(','));
 
    }
 
    
 
    public function test__Set()
 
    {
 
        $collection = new A_Collection();
 
        
 
        $collection->foo = 'bar';
 
        $this->assertEqual($collection->get('foo'), 'bar');
 
        
 
        $collection->foo = null;
 
        $this->assertFalse($collection->has('foo'));
 
    }
 
    
 
    public function test__Get()
 
    {
 
        $collection = new A_Collection(array('foo' => 'bar'));
 
        
 
        $this->assertEqual($collection->foo, 'bar');
 
    }
 
    
 
    // NON-TEST UTILITY METHODS
 
    
 
    private function createNestedCollection()
 
    {
 
        return new A_Collection(array(
 
            'foo',
 
            'bar',
 
            array(
 
                'foobar',
 
                array(
 
                    'barfoo'
 
                )
 
            ),
 
            'blah'
 
        ));
 
    }
 
    
 
    private function createFlatCollection()
 
    {
 
        return new A_Collection(array(
 
            'foo',
 
            'bar',
 
            'foobar'
 
        ));
 
    }
 
}
 
 
 |