diff options
author | Dries Buytaert <dries@buytaert.net> | 2010-03-25 11:46:21 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2010-03-25 11:46:21 +0000 |
commit | cfe7f8e69f9156284e1daf57921d89de256abda2 (patch) | |
tree | 0fbf95426b255f46aa8df99c9db7bcbca3859b54 /modules/field/tests | |
parent | 85969b0590391aae9b2995248d3dec5780b379da (diff) | |
download | brdo-cfe7f8e69f9156284e1daf57921d89de256abda2.tar.gz brdo-cfe7f8e69f9156284e1daf57921d89de256abda2.tar.bz2 |
- Patch #657972 by plach, Berdir: make field fallback logic actually reusable.
Diffstat (limited to 'modules/field/tests')
-rw-r--r-- | modules/field/tests/field.test | 155 | ||||
-rw-r--r-- | modules/field/tests/field_test.entity.inc | 13 | ||||
-rw-r--r-- | modules/field/tests/field_test.module | 20 | ||||
-rw-r--r-- | modules/field/tests/field_test.storage.inc | 4 |
4 files changed, 115 insertions, 77 deletions
diff --git a/modules/field/tests/field.test b/modules/field/tests/field.test index f79ebd0b6..3b5cdc7b5 100644 --- a/modules/field/tests/field.test +++ b/modules/field/tests/field.test @@ -2604,8 +2604,7 @@ class FieldInstanceCrudTestCase extends FieldTestCase { * Unit test class for the multilanguage fields logic. * * The following tests will check the multilanguage logic of _field_invoke() and - * that only the correct values are returned by - * field_multilingual_available_languages(). + * that only the correct values are returned by field_available_languages(). */ class FieldTranslationsTestCase extends FieldTestCase { public static function getInfo() { @@ -2628,9 +2627,6 @@ class FieldTranslationsTestCase extends FieldTestCase { 'type' => 'test_field', 'cardinality' => 4, 'translatable' => TRUE, - 'settings' => array( - 'test_hook_in' => FALSE, - ), ); field_create_field($field); $this->field = field_read_field($this->field_name); @@ -2639,19 +2635,6 @@ class FieldTranslationsTestCase extends FieldTestCase { 'field_name' => $this->field_name, 'object_type' => $this->obj_type, 'bundle' => 'test_bundle', - 'label' => $this->randomName() . '_label', - 'description' => $this->randomName() . '_description', - 'weight' => mt_rand(0, 127), - 'settings' => array( - 'test_instance_setting' => $this->randomName(), - ), - 'widget' => array( - 'type' => 'test_field_widget', - 'label' => 'Test Field', - 'settings' => array( - 'test_widget_setting' => $this->randomName(), - ), - ), ); field_create_instance($instance); $this->instance = field_read_instance('test_entity', $this->field_name, 'test_bundle'); @@ -2663,64 +2646,34 @@ class FieldTranslationsTestCase extends FieldTestCase { } /** - * Ensure that only valid values are returned by field_multilingual_available_languages(). + * Ensures that only valid values are returned by field_available_languages(). */ function testFieldAvailableLanguages() { // Test 'translatable' fieldable info. field_test_entity_info_translatable('test_entity', FALSE); $field = $this->field; $field['field_name'] .= '_untranslatable'; - $langcode = language_default(); - $suggested_languages = array($langcode->language); - $available_languages = field_multilingual_available_languages($this->obj_type, $field, $suggested_languages); - $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, t('Untranslatable entity: suggested language ignored.')); // Enable field translations for the entity. field_test_entity_info_translatable('test_entity', TRUE); // Test hook_field_languages() invocation on a translatable field. - $this->field['settings']['test_hook_in'] = TRUE; - $enabled_languages = array_keys(language_list()); - $available_languages = field_multilingual_available_languages($this->obj_type, $this->field); - $this->assertTrue(in_array(LANGUAGE_NONE, $available_languages), t('%language is an available language.', array('%language' => LANGUAGE_NONE))); + variable_set('field_test_field_available_languages_alter', TRUE); + $enabled_languages = field_content_languages(); + $available_languages = field_available_languages($this->obj_type, $this->field); foreach ($available_languages as $delta => $langcode) { - if ($langcode != LANGUAGE_NONE) { + if ($langcode != 'xx' && $langcode != 'en') { $this->assertTrue(in_array($langcode, $enabled_languages), t('%language is an enabled language.', array('%language' => $langcode))); } } - $this->assertFalse(in_array('xx', $available_languages), t('No invalid language was made available.')); - $this->assertTrue(count($available_languages) == count($enabled_languages), t('An enabled language was successfully made unavailable.')); + $this->assertTrue(in_array('xx', $available_languages), t('%language was made available.', array('%language' => 'xx'))); + $this->assertFalse(in_array('en', $available_languages), t('%language was made unavailable.', array('%language' => 'en'))); - // Test field_multilingual_available_languages() behavior for untranslatable fields. + // Test field_available_languages() behavior for untranslatable fields. $this->field['translatable'] = FALSE; $this->field_name = $this->field['field_name'] = $this->instance['field_name'] = drupal_strtolower($this->randomName() . '_field_name'); - $available_languages = field_multilingual_available_languages($this->obj_type, $this->field); - $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, t('For untranslatable fields only neutral language is available.')); - - // Test language suggestions. - $this->field['settings']['test_hook_in'] = FALSE; - $this->field['translatable'] = TRUE; - $this->field_name = $this->field['field_name'] = $this->instance['field_name'] = drupal_strtolower($this->randomName() . '_field_name'); - $suggested_languages = array(); - $lang_count = mt_rand(1, count($enabled_languages) - 1); - for ($i = 0; $i < $lang_count; ++$i) { - do { - $langcode = $enabled_languages[mt_rand(0, $lang_count)]; - } - while (in_array($langcode, $suggested_languages)); - $suggested_languages[] = $langcode; - } - - $available_languages = field_multilingual_available_languages($this->obj_type, $this->field, $suggested_languages); - $this->assertEqual(count($available_languages), count($suggested_languages), t('Suggested languages were successfully made available.')); - foreach ($available_languages as $langcode) { - $this->assertTrue(in_array($langcode, $available_languages), t('Suggested language %language is available.', array('%language' => $langcode))); - } - - $this->field_name = $this->field['field_name'] = $this->instance['field_name'] = drupal_strtolower($this->randomName() . '_field_name'); - $suggested_languages = array('xx'); - $available_languages = field_multilingual_available_languages($this->obj_type, $this->field, $suggested_languages); - $this->assertTrue(empty($available_languages), t('An invalid suggested language was not made available.')); + $available_languages = field_available_languages($this->obj_type, $this->field); + $this->assertTrue(count($available_languages) == 1 && $available_languages[0] === LANGUAGE_NONE, t('For untranslatable fields only LANGUAGE_NONE is available.')); } /** @@ -2731,10 +2684,10 @@ class FieldTranslationsTestCase extends FieldTestCase { $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']); // Populate some extra languages to check if _field_invoke() correctly uses - // the result of field_multilingual_available_languages(). + // the result of field_available_languages(). $values = array(); $extra_languages = mt_rand(1, 4); - $languages = $available_languages = field_multilingual_available_languages($this->obj_type, $this->field); + $languages = $available_languages = field_available_languages($this->obj_type, $this->field); for ($i = 0; $i < $extra_languages; ++$i) { $languages[] = $this->randomString(2); } @@ -2765,14 +2718,14 @@ class FieldTranslationsTestCase extends FieldTestCase { $entities = array(); $entity_type = 'test_entity'; $entity_count = mt_rand(1, 5); - $available_languages = field_multilingual_available_languages($this->obj_type, $this->field); + $available_languages = field_available_languages($this->obj_type, $this->field); for ($id = 1; $id <= $entity_count; ++$id) { $entity = field_test_create_stub_entity($id, $id, $this->instance['bundle']); $languages = $available_languages; // Populate some extra languages to check whether _field_invoke() - // correctly uses the result of field_multilingual_available_languages(). + // correctly uses the result of field_available_languages(). $extra_languages = mt_rand(1, 4); for ($i = 0; $i < $extra_languages; ++$i) { $languages[] = $this->randomString(2); @@ -2815,7 +2768,7 @@ class FieldTranslationsTestCase extends FieldTestCase { $entity_type = 'test_entity'; $entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']); $field_translations = array(); - $available_languages = field_multilingual_available_languages($entity_type, $this->field); + $available_languages = field_available_languages($entity_type, $this->field); $this->assertTrue(count($available_languages) > 1, t('Field is translatable.')); foreach ($available_languages as $langcode) { $field_translations[$langcode] = $this->_generateTestFieldValues($this->field['cardinality']); @@ -2836,6 +2789,82 @@ class FieldTranslationsTestCase extends FieldTestCase { $this->assertTrue($result, t('%language translation correctly handled.', array('%language' => $langcode))); } } + + /** + * Tests display language logic for translatable fields. + */ + 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'], + 'object_type' => $entity_type, + 'bundle' => 'test_bundle', + ); + field_create_instance($instance); + + $entity = field_test_create_stub_entity(1, 1, $this->instance['bundle']); + list(, , $bundle) = entity_extract_ids($entity_type, $entity); + $instances = field_info_instances($entity_type, $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); + drupal_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, t('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); + drupal_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, t('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_type, $entity, $this->field_name, $requested_language); + $this->assertTrue(isset($entity->{$this->field_name}[$langcode]) && $langcode != $requested_language, t('The display language for the (single) field %field_name is %language.', array('%field_name' => $field_name, '%language' => $langcode))); + } } /** diff --git a/modules/field/tests/field_test.entity.inc b/modules/field/tests/field_test.entity.inc index 3196ebd19..eef3dbf73 100644 --- a/modules/field/tests/field_test.entity.inc +++ b/modules/field/tests/field_test.entity.inc @@ -64,6 +64,19 @@ function field_test_entity_info_alter(&$entity_info) { } /** + * Helper function to enable entity translations. + */ +function field_test_entity_info_translatable($entity_type = NULL, $translatable = NULL) { + drupal_static_reset('field_has_translation_handler'); + $stored_value = &drupal_static(__FUNCTION__, array()); + if (isset($entity_type)) { + $stored_value[$entity_type] = $translatable; + entity_info_cache_clear(); + } + return $stored_value; +} + +/** * Creates a new bundle for test_entity entities. * * @param $bundle diff --git a/modules/field/tests/field_test.module b/modules/field/tests/field_test.module index 7d0b8366d..51cd0df70 100644 --- a/modules/field/tests/field_test.module +++ b/modules/field/tests/field_test.module @@ -87,27 +87,23 @@ function field_test_field_test_op_multiple($entity_type, $entities, $field, $ins } /** - * Implements hook_field_languages(). + * Implements hook_field_available_languages_alter(). */ -function field_test_field_languages($entity_type, $field, &$languages) { - if ($field['settings']['test_hook_in']) { +function field_test_field_available_languages_alter(&$languages, $context) { + if (variable_get('field_test_field_available_languages_alter', FALSE)) { // Add an unavailable language. $languages[] = 'xx'; // Remove an available language. - unset($languages[0]); + $index = array_search('en', $languages); + unset($languages[$index]); } } /** - * Helper function to enable entity translations. + * Implements hook_field_language_alter(). */ -function field_test_entity_info_translatable($entity_type = NULL, $translatable = NULL) { - $stored_value = &drupal_static(__FUNCTION__, array()); - if (isset($entity_type)) { - $stored_value[$entity_type] = $translatable; - entity_info_cache_clear(); - } - return $stored_value; +function field_test_field_language_alter(&$display_language, $context) { + locale_field_language_fallback($display_language, $context['entity'], $context['language']); } /** diff --git a/modules/field/tests/field_test.storage.inc b/modules/field/tests/field_test.storage.inc index 617e3b6ae..6ce272040 100644 --- a/modules/field/tests/field_test.storage.inc +++ b/modules/field/tests/field_test.storage.inc @@ -95,7 +95,7 @@ function field_test_field_storage_load($entity_type, $entities, $age, $fields, $ foreach ($field_data[$sub_table] as $row) { if ($row->type == $entity_type && (!$row->deleted || $options['deleted'])) { if (($load_current && in_array($row->entity_id, $ids)) || (!$load_current && in_array($row->revision_id, $ids))) { - if (in_array($row->language, field_multilingual_available_languages($entity_type, $field))) { + if (in_array($row->language, field_available_languages($entity_type, $field))) { if (!isset($delta_count[$row->entity_id][$row->language])) { $delta_count[$row->entity_id][$row->language] = 0; } @@ -127,7 +127,7 @@ function field_test_field_storage_write($entity_type, $entity, $op, $fields) { $field_name = $field['field_name']; $field_data = &$data[$field_id]; - $all_languages = field_multilingual_available_languages($entity_type, $field); + $all_languages = field_available_languages($entity_type, $field); $field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name)); // Delete and insert, rather than update, in case a value was added. |