1.20.x field.test FieldTranslationsTestCase::testFieldDisplayLanguage()

Tests display language logic for translatable fields.

File

modules/field/tests/field.test, line 3023
Tests for field.module.

Class

FieldTranslationsTestCase
Unit test class for the multilanguage fields logic.

Code

function testFieldDisplayLanguage() {
  $field_name = backdrop_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_languages = field_content_languages();
  $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_languages[mt_rand(1, count($enabled_languages) - 1)];
    } 
     while (isset($languages[$langcode]));
    $languages[$langcode] = TRUE;
    $entity->{$field_name}[$langcode] = $this->_generateTestFieldValues($field['cardinality']);
  }

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

  // Test multiple-fields display languages for translatable entities.
  field_test_entity_info_translatable($entity_type, TRUE);
  backdrop_static_reset('field_language');
  $display_language = field_language($entity_type, $entity, NULL, $requested_language);

  foreach ($instances as $instance) {
    $field_name = $instance['field_name'];
    $langcode = $display_language[$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_language, format_string('The display language for the field %field_name is %language.', array('%field_name' => $field_name, '%language' => $langcode)));
  }

  // Test single-field display language.
  backdrop_static_reset('field_language');
  $langcode = field_language($entity_type, $entity, $this->field_name, $requested_language);
  $this->assertTrue(isset($entity->{$this->field_name}[$langcode]) && $langcode != $requested_language, 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.
  $entity->{$this->field_name}[$requested_language] = mt_rand(1, 127);
  backdrop_static_reset('field_language');
  $display_language = field_language($entity_type, $entity, $this->field_name, $requested_language);
  $this->assertEqual($display_language, $requested_language, 'Display language behave correctly when language fallback is disabled');
}