Chris@17: 'A', Chris@17: 'b' => array( Chris@17: 'b' => 'B', Chris@17: 'c' => array('C1', 'C2', 'C3'), Chris@17: 'd' => array( Chris@17: 'd1' => 'D1', Chris@17: 'd2' => 'D2', Chris@17: 'd3' => 'D3', Chris@17: ), Chris@17: ), Chris@17: 'c' => array('c1', 'c2', 'c3'), Chris@17: 'f' => array( Chris@17: 'g' => array( Chris@17: 'h' => 'FGH', Chris@17: ), Chris@17: ), Chris@17: 'h' => array( Chris@17: 'i' => 'I', Chris@17: ), Chris@17: 'i' => array( Chris@17: 'j' => 'J', Chris@17: ), Chris@17: ); Chris@17: } Chris@17: Chris@17: protected function runSampleDataTests(DataInterface $data) Chris@17: { Chris@17: $this->assertEquals('A', $data->get('a')); Chris@17: $this->assertEquals('B', $data->get('b.b')); Chris@17: $this->assertEquals(array('C1', 'C2', 'C3'), $data->get('b.c')); Chris@17: $this->assertEquals('D3', $data->get('b.d.d3')); Chris@17: $this->assertEquals(array('c1', 'c2', 'c3'), $data->get('c')); Chris@17: $this->assertNull($data->get('foo'), 'Foo should not exist'); Chris@17: $this->assertNull($data->get('f.g.h.i')); Chris@17: $this->assertEquals($data->get('foo', 'default-value-1'), 'default-value-1', 'Return default value'); Chris@17: $this->assertEquals($data->get('f.g.h.i', 'default-value-2'), 'default-value-2'); Chris@17: } Chris@17: Chris@17: public function testAppend() Chris@17: { Chris@17: $data = new Data($this->getSampleData()); Chris@17: Chris@17: $data->append('a', 'B'); Chris@17: $data->append('c', 'c4'); Chris@17: $data->append('b.c', 'C4'); Chris@17: $data->append('b.d.d3', 'D3b'); Chris@17: $data->append('b.d.d4', 'D'); Chris@17: $data->append('e', 'E'); Chris@17: $data->append('f.a', 'b'); Chris@17: $data->append('h.i', 'I2'); Chris@17: $data->append('i.k.l', 'L'); Chris@17: Chris@17: $this->assertEquals(array('A', 'B'), $data->get('a')); Chris@17: $this->assertEquals(array('c1', 'c2', 'c3', 'c4'), $data->get('c')); Chris@17: $this->assertEquals(array('C1', 'C2', 'C3', 'C4'), $data->get('b.c')); Chris@17: $this->assertEquals(array('D3', 'D3b'), $data->get('b.d.d3')); Chris@17: $this->assertEquals(array('D'), $data->get('b.d.d4')); Chris@17: $this->assertEquals(array('E'), $data->get('e')); Chris@17: $this->assertEquals(array('b'), $data->get('f.a')); Chris@17: $this->assertEquals(array('I', 'I2'), $data->get('h.i')); Chris@17: $this->assertEquals(array('L'), $data->get('i.k.l')); Chris@17: Chris@17: $this->setExpectedException('RuntimeException'); Chris@17: Chris@17: $data->append('', 'broken'); Chris@17: } Chris@17: Chris@17: public function testSet() Chris@17: { Chris@17: $data = new Data; Chris@17: Chris@17: $this->assertNull($data->get('a')); Chris@17: $this->assertNull($data->get('b.c')); Chris@17: $this->assertNull($data->get('d.e')); Chris@17: Chris@17: $data->set('a', 'A'); Chris@17: $data->set('b.c', 'C'); Chris@17: $data->set('d.e', array('f' => 'F', 'g' => 'G',)); Chris@17: Chris@17: $this->assertEquals('A', $data->get('a')); Chris@17: $this->assertEquals(array('c' => 'C'), $data->get('b')); Chris@17: $this->assertEquals('C', $data->get('b.c')); Chris@17: $this->assertEquals('F', $data->get('d.e.f')); Chris@17: $this->assertEquals(array('e' => array('f' => 'F', 'g' => 'G',)), $data->get('d')); Chris@17: Chris@17: $this->setExpectedException('RuntimeException'); Chris@17: Chris@17: $data->set('', 'broken'); Chris@17: } Chris@17: Chris@17: public function testSetClobberStringInPath() Chris@17: { Chris@17: $data = new Data; Chris@17: Chris@17: $data->set('a.b.c', 'Should not be able to write to a.b.c.d.e'); Chris@17: Chris@17: $this->setExpectedException('RuntimeException'); Chris@17: Chris@17: $data->set('a.b.c.d.e', 'broken'); Chris@17: } Chris@17: Chris@17: public function testRemove() Chris@17: { Chris@17: $data = new Data($this->getSampleData()); Chris@17: Chris@17: $data->remove('a'); Chris@17: $data->remove('b.c'); Chris@17: $data->remove('b.d.d3'); Chris@17: $data->remove('d'); Chris@17: $data->remove('d.e.f'); Chris@17: $data->remove('empty.path'); Chris@17: Chris@17: $this->assertNull($data->get('a')); Chris@17: $this->assertNull($data->get('b.c')); Chris@17: $this->assertNull($data->get('b.d.d3')); Chris@17: $this->assertNull(null); Chris@17: $this->assertEquals('D2', $data->get('b.d.d2')); Chris@17: Chris@17: $this->setExpectedException('RuntimeException'); Chris@17: Chris@17: $data->remove('', 'broken'); Chris@17: } Chris@17: Chris@17: public function testGet() Chris@17: { Chris@17: $data = new Data($this->getSampleData()); Chris@17: Chris@17: $this->runSampleDataTests($data); Chris@17: } Chris@17: Chris@17: public function testHas() Chris@17: { Chris@17: $data = new Data($this->getSampleData()); Chris@17: Chris@17: foreach ( Chris@17: array('a', 'i', 'b.d', 'f.g.h', 'h.i', 'b.d.d1') as $existentKey Chris@17: ) { Chris@17: $this->assertTrue($data->has($existentKey)); Chris@17: } Chris@17: Chris@17: foreach ( Chris@17: array('p', 'b.b1', 'b.c.C1', 'h.i.I', 'b.d.d1.D1') as $notExistentKey Chris@17: ) { Chris@17: $this->assertFalse($data->has($notExistentKey)); Chris@17: } Chris@17: } Chris@17: Chris@17: public function testGetData() Chris@17: { Chris@17: $wrappedData = new Data(array( Chris@17: 'wrapped' => array( Chris@17: 'sampleData' => $this->getSampleData() Chris@17: ), Chris@17: )); Chris@17: Chris@17: $data = $wrappedData->getData('wrapped.sampleData'); Chris@17: Chris@17: $this->runSampleDataTests($data); Chris@17: Chris@17: $this->setExpectedException('RuntimeException'); Chris@17: Chris@17: $data = $wrappedData->getData('wrapped.sampleData.a'); Chris@17: } Chris@17: Chris@17: public function testImport() Chris@17: { Chris@17: $data = new Data(); Chris@17: $data->import($this->getSampleData()); Chris@17: Chris@17: $this->runSampleDataTests($data); Chris@17: } Chris@17: Chris@17: public function testImportData() Chris@17: { Chris@17: $data = new Data(); Chris@17: $data->importData(new Data($this->getSampleData())); Chris@17: Chris@17: $this->runSampleDataTests($data); Chris@17: } Chris@17: Chris@17: public function testExport() Chris@17: { Chris@17: $data = new Data($this->getSampleData()); Chris@17: Chris@17: $this->assertEquals($this->getSampleData(), $data->export()); Chris@17: } Chris@17: }