/** * @param array $wanted * @param array $extracted * * @return array */ protected function extractDependencies(array $wanted, $extracted = []) { $extracted = empty($extracted) ? [$wanted] : $extracted; foreach ($wanted as $dependentCollection => $dependentIds) { foreach ($this->dependencies as $dependency) { $toAdd = []; $onCollection = key($tmp = $dependency[static::ON]); $onField = reset($dependency[static::ON]); $dependentField = reset($dependency[static::DEPENDENT]); // if dependency exists for the wanted collection if (!empty($dependency[static::DEPENDENT][$dependentCollection])) { $addedFor = []; foreach ($this->data[$onCollection] as $onId => $onRow) { foreach ($dependentIds as $dependentId) { if ($onRow[$onField] == $this->data[$dependentCollection][$dependentId][$dependentField]) { $toAdd[$onId] = true; $addedFor[] = $dependentId; } } } if (!SimpleArrayLibrary::hasAllValues($addedFor, $dependentIds)) { throw new UnexpectedValueException('Dependency missing. Expected: "' . implode(', ', $dependentIds) . '", found: "' . implode(', ', $addedFor) . '" in ' . $dependentCollection . ' on ' . $onCollection . ' dependency'); } $newWanted = [$onCollection => array_keys($toAdd)]; $extracted[] = $newWanted; $extracted = $this->extractDependencies($newWanted, $extracted); } } } return $extracted; }
/** * @param array $data * * @return void * @dataProvider getData */ public function test_function(array $data) { // invoke logic $result = SimpleArrayLibrary::hasAllValues($data['array'], $data['values']); // test $this->assertEquals($data['expected'], $result); }