function TranslationTest::testFieldDisplayLanguage

Tests display language logic for translatable fields.

File

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

Class

TranslationTest
Unit test class for the multilanguage fields logic.

Namespace

Drupal\field\Tests

Code

function testFieldDisplayLanguage() {
  $field_name = drupal_strtolower($this
    ->randomName() . '_field_name');
  $entity_type = 'test_entity';

  // We need an additional field here to properly test display language
  // suggestions.
  $field = array(
    'field_name' => $field_name,
    'type' => 'test_field',
    'cardinality' => 2,
    'translatable' => TRUE,
  );
  field_create_field($field);
  $instance = array(
    'field_name' => $field['field_name'],
    'entity_type' => $entity_type,
    'bundle' => 'test_bundle',
  );
  field_create_instance($instance);
  $entity = field_test_create_entity(1, 1, $this->instance['bundle']);
  $instances = field_info_instances($entity_type, $this->instance['bundle']);
  $enabled_langcodes = field_content_languages();
  $langcodes = array();

  // This array is used to store, for each field name, which one of the locked
  // languages will be used for display.
  $locked_languages = array();

  // Generate field translations for languages different from the first
  // enabled.
  foreach ($instances as $instance) {
    $field_name = $instance['field_name'];
    $field = field_info_field($field_name);
    do {

      // Index 0 is reserved for the requested language, this way we ensure
      // that no field is actually populated with it.
      $langcode = $enabled_langcodes[mt_rand(1, count($enabled_langcodes) - 1)];
    } while (isset($langcodes[$langcode]));
    $langcodes[$langcode] = TRUE;
    $entity->{$field_name}[$langcode] = $this
      ->_generateTestFieldValues($field['cardinality']);

    // If the langcode is one of the locked languages, then that one
    // will also be used for display. Otherwise, the default one should be
    // used, which is Language::LANGCODE_NOT_SPECIFIED.
    if (language_is_locked($langcode)) {
      $locked_languages[$field_name] = $langcode;
    }
    else {
      $locked_languages[$field_name] = Language::LANGCODE_NOT_SPECIFIED;
    }
  }

  // Test multiple-fields display languages for untranslatable entities.
  field_test_entity_info_translatable($entity_type, FALSE);
  drupal_static_reset('field_language');
  $requested_langcode = $enabled_langcodes[0];
  $display_langcodes = field_language($entity, NULL, $requested_langcode);
  foreach ($instances as $instance) {
    $field_name = $instance['field_name'];
    $this
      ->assertTrue($display_langcodes[$field_name] == $locked_languages[$field_name], format_string('The display language for field %field_name is %language.', array(
      '%field_name' => $field_name,
      '%language' => $locked_languages[$field_name],
    )));
  }

  // Test multiple-fields display languages for translatable entities.
  field_test_entity_info_translatable($entity_type, TRUE);
  drupal_static_reset('field_language');
  $display_langcodes = field_language($entity, NULL, $requested_langcode);
  foreach ($instances as $instance) {
    $field_name = $instance['field_name'];
    $langcode = $display_langcodes[$field_name];

    // As the requested language was not assinged to any field, if the
    // returned language is defined for the current field, core fallback rules
    // were successfully applied.
    $this
      ->assertTrue(isset($entity->{$field_name}[$langcode]) && $langcode != $requested_langcode, format_string('The display language for the field %field_name is %language.', array(
      '%field_name' => $field_name,
      '%language' => $langcode,
    )));
  }

  // Test single-field display language.
  drupal_static_reset('field_language');
  $langcode = field_language($entity, $this->field_name, $requested_langcode);
  $this
    ->assertTrue(isset($entity->{$this->field_name}[$langcode]) && $langcode != $requested_langcode, format_string('The display language for the (single) field %field_name is %language.', array(
    '%field_name' => $field_name,
    '%language' => $langcode,
  )));

  // Test field_language() basic behavior without language fallback.
  \Drupal::state()
    ->set('field_test.language_fallback', FALSE);
  $entity->{$this->field_name}[$requested_langcode] = mt_rand(1, 127);
  drupal_static_reset('field_language');
  $display_langcode = field_language($entity, $this->field_name, $requested_langcode);
  $this
    ->assertEqual($display_langcode, $requested_langcode, 'Display language behave correctly when language fallback is disabled');
}