instance = new MergeDataTables(); } public function testMergeDataTablesReturnsCorrectDataWhenTwoTablesAreMerged() { $table1 = new DataTable(); $table1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 2, 'nb_other' => 3], ]), ]); $table1->setAllTableMetadata([ 'a' => 'b', ]); $table2 = new DataTable(); $table2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 1, 'nb_other' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 2', 'nb_visits' => 5, 'nb_other' => 5], ]), ]); $table2->setAllTableMetadata([ 'c' => '3', ]); $this->instance->mergeDataTables($table1, $table2); $xml = $this->getTableAsXml($table1); $expectedXml = << 1 1 END; $this->assertEquals($expectedXml, $xml); } public function testMergeDataTablesReturnsCorrectDataWhenTwoMapsAreMergedAndBothHaveTheSameAmountOfData() { $table1 = new DataTable\Map(); $table1->setKeyName('period'); $childTable1 = new DataTable(); $childTable1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 1, 'nb_other' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 2', 'nb_visits' => 5, 'nb_other' => 5], ]), ]); $childTable1->setAllTableMetadata(['a' => 'b']); $table1->addTable($childTable1, 'p1'); $childTable2 = new DataTable(); $childTable2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 5', 'nb_visits' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 6', 'nb_other' => 5], ]), ]); $childTable2->setAllTableMetadata(['c' => 'd']); $table1->addTable($childTable1, 'p2'); $table2 = new DataTable\Map(); $table2->setKeyName('period'); $childTable1 = new DataTable(); $childTable1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 4, 'nb_other' => 4], ]), ]); $childTable1->setAllTableMetadata(['a' => 'b']); $table2->addTable($childTable1, 'p1'); $childTable2 = new DataTable(); $childTable2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 6', 'nb_other' => 5], ]), ]); $childTable2->setAllTableMetadata(['c' => 'd']); $table2->addTable($childTable1, 'p2'); $this->instance->mergeDataTables($table1, $table2); $xml = $this->getTableAsXml($table1); $expectedXml = << 4 4 5 5 4 4 5 5 END; $this->assertEquals($expectedXml, $xml); } public function testMergeDataTablesReturnsCorrectDataWhenTwoMapsAreMergedAndFirstHasLessThanSecond() { $table1 = new DataTable\Map(); $table1->setKeyName('period'); $childTable2 = new DataTable(); $childTable2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 5', 'nb_visits' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 6', 'nb_other' => 5], ]), ]); $childTable2->setAllTableMetadata(['c' => 'd']); $table1->addTable($childTable2, 'p2'); $table2 = new DataTable\Map(); $table2->setKeyName('period'); $childTable1 = new DataTable(); $childTable1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 4, 'nb_other' => 4], ]), ]); $childTable1->setAllTableMetadata(['a' => 'b']); $table2->addTable($childTable1, 'p1'); $childTable2 = new DataTable(); $childTable2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 6', 'nb_other' => 5], ]), ]); $childTable1->setAllTableMetadata(['c' => 'd']); $table2->addTable($childTable1, 'p2'); $this->instance->mergeDataTables($table1, $table2); $xml = $this->getTableAsXml($table1); $expectedXml = << 4 4 5 4 4 END; $this->assertEquals($expectedXml, $xml); } public function testMergeDataTablesReturnsCorrectDataWhenTwoMapsAreMergedAndSecondHasLessThanFirst() { $table1 = new DataTable\Map(); $table1->setKeyName('period'); $childTable1 = new DataTable(); $childTable1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 1, 'nb_other' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 2', 'nb_visits' => 5, 'nb_other' => 5], ]), ]); $childTable1->setAllTableMetadata(['a' => 'b']); $table1->addTable($childTable1, 'p1'); $childTable2 = new DataTable(); $childTable2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 5', 'nb_visits' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 6', 'nb_other' => 5], ]), ]); $childTable2->setAllTableMetadata(['c' => 'd']); $table1->addTable($childTable1, 'p2'); $table2 = new DataTable\Map(); $table2->setKeyName('period'); $childTable1 = new DataTable(); $childTable1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 4, 'nb_other' => 4], ]), ]); $childTable1->setAllTableMetadata(['a' => 'b']); $table2->addTable($childTable1, 'p1'); $this->instance->mergeDataTables($table1, $table2); $xml = $this->getTableAsXml($table1); $expectedXml = << 4 4 5 5 4 4 5 5 END; $this->assertEquals($expectedXml, $xml); } public function testMergeDataTablesReturnsCorrectDataWhenMapsAreNested() { $table1 = new DataTable\Map(); $table1->setKeyName('site'); $childTableMap1 = new DataTable\Map(); $childTableMap1->setKeyName('period'); $table1->addTable($childTableMap1, 's1'); $childTable1 = new DataTable(); $childTable1->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 1, 'nb_other' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 2', 'nb_visits' => 5, 'nb_other' => 5], ]), ]); $childTable1->setAllTableMetadata(['a' => 'b']); $childTableMap1->addTable($childTable1, 'p1'); $table2 = new DataTable\Map(); $table2->setKeyName('site'); $childTableMap2 = new DataTable\Map(); $childTableMap2->setKeyName('period'); $table2->addTable($childTableMap2, 's2'); $childTable2 = new DataTable(); $childTable2->addRowsFromArray([ new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 1', 'nb_visits' => 1, 'nb_other' => 1], ]), new DataTable\Row([ DataTable\Row::COLUMNS => ['label' => 'label 2', 'nb_visits' => 5, 'nb_other' => 5], ]), ]); $childTable2->setAllTableMetadata(['c' => 'd']); $childTableMap2->addTable($childTable2, 'p1'); $this->instance->mergeDataTables($table1, $table2); $xml = $this->getTableAsXml($table1); $expectedXml = << 1 1 5 5 1 1 END; $this->assertEquals($expectedXml, $xml); } // TODO: test for metadata private function getTableAsXml(DataTable\DataTableInterface $table1) { $renderer = new DataTable\Renderer\Xml(); $renderer->setTable($table1); return $renderer->render(); } }