Example #1
0
 /**
  * @param Field             $field
  * @param UniqueArrayObject $data
  * @param Builder           $builder
  * @return mixed
  * @throws SampleException
  */
 private function sampleUniqueField(Field $field, UniqueArrayObject $data, Builder $builder)
 {
     // create a generation store for unique values
     if ($field->isType(Field::TYPE_LINK)) {
         // For links we only want uniqueness within the current object
         // For unique relations with other objects across all samples a relation should be used.
         $id = spl_object_hash($field) . $data->getId();
     } else {
         $id = spl_object_hash($field);
     }
     if (!isset($this->sampled[$id])) {
         $this->sampled[$id] = [];
     }
     // try to iteratively generate a unique value
     $rounds = 0;
     do {
         if ($rounds === $this->unique_tries) {
             $name = $field->getName();
             $type = $builder->getType();
             throw new SampleException("Tried to get unique value for field {$name} in {$type}, but none could be generated");
         }
         $value = $this->sampleField($field, $data);
         $rounds += 1;
     } while (in_array($value, $this->sampled[$id], true));
     // store the generated value for later testing
     $this->sampled[$id][] = $value;
     return $value;
 }