function TranslationTest::testFieldInvoke

Test the multilanguage logic of _field_invoke().

File

drupal/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php, line 106
Definition of Drupal\field\Tests\TranslationTest.

Class

TranslationTest
Unit test class for the multilanguage fields logic.

Namespace

Drupal\field\Tests

Code

function testFieldInvoke() {

  // Enable field translations for the entity.
  field_test_entity_info_translatable('test_entity', TRUE);
  $entity_type = 'test_entity';
  $entity = field_test_create_entity(0, 0, $this->instance['bundle']);

  // Populate some extra languages to check if _field_invoke() correctly uses
  // the result of field_available_languages().
  $values = array();
  $extra_langcodes = mt_rand(1, 4);
  $langcodes = $available_langcodes = field_available_languages($this->entity_type, $this->field);
  for ($i = 0; $i < $extra_langcodes; ++$i) {
    $langcodes[] = $this
      ->randomName(2);
  }

  // For each given language provide some random values.
  foreach ($langcodes as $langcode) {
    for ($delta = 0; $delta < $this->field['cardinality']; $delta++) {
      $values[$langcode][$delta]['value'] = mt_rand(1, 127);
    }
  }
  $entity->{$this->field_name} = $values;
  $results = _field_invoke('test_op', $entity);
  foreach ($results as $langcode => $result) {
    $hash = hash('sha256', serialize(array(
      $entity,
      $this->field_name,
      $langcode,
      $values[$langcode],
    )));

    // Check whether the parameters passed to _field_invoke() were correctly
    // forwarded to the callback function.
    $this
      ->assertEqual($hash, $result, format_string('The result for %language is correctly stored.', array(
      '%language' => $langcode,
    )));
  }
  $this
    ->assertEqual(count($results), count($available_langcodes), 'No unavailable language has been processed.');
}