public function test_collections_are_valid()
 {
     $data = array(100, 2000, 30000, 400000, 5000000, 60000000, 7000000000, 8000000000);
     $this->repo->registerModelsCollection('Foo', $data);
     $this->repo->registerModelsCollection('Foo', $data, 'AA');
     $models = $this->repo->collectionGetFoo();
     $models2 = $this->repo->collectionGetFoo('AA');
     while ($expectation = array_shift($data)) {
         foreach ($models as $key => $model) {
             $this->assertInstanceOf('ViewModelServiceTest\\TestAsset\\ViewModel\\FooViewModel', $model);
             if (array($expectation) === $model->getBuildArgs()) {
                 unset($models[$key]);
             }
         }
         foreach ($models2 as $key => $model2) {
             $this->assertInstanceOf('ViewModelServiceTest\\TestAsset\\ViewModel\\FooViewModel', $model2);
             if (array($expectation) === $model2->getBuildArgs()) {
                 $this->assertNotSame($expectation, $model2, 'Test fails because same instance of view model in repo was found by differ key.');
             }
             unset($models2[$key]);
         }
     }
     $this->assertTrue(empty($data2));
     $this->assertTrue(empty($models2));
 }
 public function test_b()
 {
     $gqty = 23;
     // look bottom for "// $gqty ..."
     $resDataFoo = function ($data) {
         return array_map(function ($v) {
             return $v = array('input' => array($v));
         }, $data);
     };
     $inDataFoo = function ($prefix, $qty = 10) use(&$gqty) {
         $gqty += $qty;
         return array_fill(0, $qty, uniqid($prefix));
     };
     $resDataRimma = function ($data) {
         return array_map(function ($v) {
             return $v = array('att_1' => '0' . array_shift($v), 'att_2' => '', 'att_3' => '');
         }, $data);
     };
     $inDataRimma = function ($prefix, $qty = 10) use(&$gqty) {
         $gqty += $qty;
         return array_fill(0, $qty, array(uniqid($prefix)));
     };
     $dataFoo1 = $inDataFoo('data_foo_1', 7);
     $dataFoo2 = $inDataFoo('data_foo_2', 10);
     $dataFoo3 = $inDataFoo('data_foo_3', 25);
     $dataRimma1 = $inDataRimma('data_rimma_1', 12);
     $dataRimma2 = $inDataRimma('data_rimma_2', 21);
     $dataRimma3 = $inDataRimma('data_rimma_3', 11);
     $dataFooA1 = $inDataFoo('data_foo_A1', 9);
     $dataFooB2 = $inDataFoo('data_foo_B2', 19);
     $dataFooC3 = $inDataFoo('data_foo_B3', 15);
     $dataRimmaA1 = $inDataRimma('data_rimma_A1', 11);
     $dataRimmaB2 = $inDataRimma('data_rimma_B2', 22);
     $dataRimmaC3 = $inDataRimma('data_rimma_C3', 16);
     $stack = array($this->repo->addFoo('a'), $this->repo->addFoo('a', 'A'), $this->repo->addRimma(array('rimma_1')), $this->repo->addRimma(array('rimma_2'), 'A'), $this->repo->registerModelsCollection('Foo', $dataFoo1), $this->repo->registerModelsCollection('Foo', $dataFoo2), $this->repo->registerModelsCollection('Foo', $dataFoo3), $this->repo->registerModelsCollection('Rimma', $dataRimma1), $this->repo->registerModelsCollection('Rimma', $dataRimma2), $this->repo->registerModelsCollection('Rimma', $dataRimma3), $this->repo->registerModelsCollection('Foo', $dataFooA1, 'A'), $this->repo->registerModelsCollection('Foo', $dataFooB2, 'B'), $this->repo->registerModelsCollection('Foo', $dataFooC3, 'C'), $this->repo->registerModelsCollection('Rimma', $dataRimmaA1, 'A'), $this->repo->registerModelsCollection('Rimma', $dataRimmaB2, 'B'), $this->repo->registerModelsCollection('Rimma', $dataRimmaC3, 'C'));
     $ids = array('Foo' => array('type' => 'Foo', 'expectation' => array(array('input' => array('a')))), 'FooA' => array('type' => 'Foo', 'expectation' => array(array('input' => array('a')))), 'Rimma' => array('type' => 'Rimma', 'expectation' => array(array('att_1' => '0rimma_1', 'att_2' => '', 'att_3' => ''))), 'RimmaA' => array('type' => 'Rimma', 'expectation' => array(array('att_1' => '0rimma_2', 'att_2' => '', 'att_3' => ''))), 'Foocollection' => array('type' => 'Foo', 'expectation' => $resDataFoo($dataFoo1)), 'Foocollection1' => array('type' => 'Foo', 'expectation' => $resDataFoo($dataFoo2)), 'Foocollection2' => array('type' => 'Foo', 'expectation' => $resDataFoo($dataFoo3)), 'Rimmacollection' => array('type' => 'Rimma', 'expectation' => $resDataRimma($dataRimma1)), 'Rimmacollection4' => array('type' => 'Rimma', 'expectation' => $resDataRimma($dataRimma2)), 'Rimmacollection5' => array('type' => 'Rimma', 'expectation' => $resDataRimma($dataRimma3)), 'FooAcollection' => array('type' => 'Foo', 'expectation' => $resDataFoo($dataFooA1)), 'FooBcollection' => array('type' => 'Foo', 'expectation' => $resDataFoo($dataFooB2)), 'FooCcollection' => array('type' => 'Foo', 'expectation' => $resDataFoo($dataFooC3)), 'RimmaAcollection' => array('type' => 'Rimma', 'expectation' => $resDataRimma($dataRimmaA1)), 'RimmaBcollection' => array('type' => 'Rimma', 'expectation' => $resDataRimma($dataRimmaB2)), 'RimmaCcollection' => array('type' => 'Rimma', 'expectation' => $resDataRimma($dataRimmaC3)));
     $expectation = implode(', ', array_keys($ids));
     $this->assertSame($expectation, implode(', ', $stack));
     $self = $this;
     $examine = function (array $models, $type, $expectation) use(&$gqty, $self) {
         foreach ($models as $item) {
             $gqty--;
             $self->assertInstanceOf('ViewModelServiceTest\\TestAsset\\ViewModel\\' . $type . 'ViewModel', $item);
             $self->assertSame(array_shift($expectation), get_object_vars($item));
         }
     };
     $models = $this->repo->collectionGetFoo();
     $examine($models, 'Foo', $resDataFoo($dataFoo1));
     // $gqty += 7
     $models = $this->repo->collectionGetRimma();
     $examine($models, 'Rimma', $resDataRimma($dataRimma1));
     // $gqty += 12
     foreach ($ids as $id => $element) {
         if (strpos($id, 'collection') !== false) {
             $methodName = 'collectionGet' . $element['type'];
             $argument = $id;
             if (false === strpos($id, $element['type'] . 'collection')) {
                 $argument = substr(substr($id, strlen($element['type'])), 0, -(strlen($id) - strpos($id, 'collection')));
             }
             $models = $this->repo->{$methodName}($argument);
         } else {
             $methodName = 'get' . $element['type'];
             $argument = null;
             if (strlen($id) > strlen($element['type'])) {
                 $argument = substr($id, strlen($element['type']));
             }
             $model = $this->repo->{$methodName}($argument);
             $models = array($model);
         }
         //echo "$methodName($argument)\n";
         $examine($models, $element['type'], $element['expectation']);
     }
     $this->assertSame(0, $gqty);
 }