/**
  * @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);
 }