From 198fd0a949333bfb1d2d45419ce2882215b0c548 Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Sat, 17 Oct 2009 01:20:01 +0000 Subject: - Patch #557924 by bjaspan, plach: fixed Options widget. --- modules/field/modules/options/options.info | 1 + modules/field/modules/options/options.module | 17 ++- modules/field/modules/options/options.test | 199 +++++++++++++++++++++++++++ 3 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 modules/field/modules/options/options.test (limited to 'modules') diff --git a/modules/field/modules/options/options.info b/modules/field/modules/options/options.info index 04d53c422..289ef48f8 100644 --- a/modules/field/modules/options/options.info +++ b/modules/field/modules/options/options.info @@ -5,4 +5,5 @@ package = Core - fields version = VERSION core = 7.x files[]=options.module +files[]=options.test required = TRUE diff --git a/modules/field/modules/options/options.module b/modules/field/modules/options/options.module index 743d92454..9fc8b9223 100644 --- a/modules/field/modules/options/options.module +++ b/modules/field/modules/options/options.module @@ -131,13 +131,20 @@ function options_buttons_elements_process($element, &$form_state, $form) { $options = options_options($field, $instance); $multiple = isset($element['#multiple']) ? $element['#multiple'] : $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED; - $value = array(); - foreach ($element['#value'][$field_key] as $key) { - // Multiple (checkboxes) need the default value in the form of an array. + // Incoming #value is an array (checkboxes) or integer (radios). + $keys = $element['#value'][$field_key]; + if (!is_array($keys)) { + $keys = array($keys); + } + + // Multiple (checkboxes) need #default_value to be an array, and + // non-multiple (radios) need a single default value. If #value is + // empty we loop won't run, so initialize $value to the right type. + $value = $multiple ? array() : ''; + foreach ($keys as $key) { if ($multiple) { - $value[$key] = 1; + $value[] = $key; } - // Non-multiple (radios) need single default value. else { $value = $key; break; diff --git a/modules/field/modules/options/options.test b/modules/field/modules/options/options.test new file mode 100644 index 000000000..1d93bfe46 --- /dev/null +++ b/modules/field/modules/options/options.test @@ -0,0 +1,199 @@ + 'Options widgets', + 'description' => "Test the Options widgets.", + 'group' => 'Field' + ); + } + + function setUp() { + parent::setUp('field_test'); + + $this->list_values = array(1 => 'One', 2 => 'Two', 3 => 'Three'); + $this->card_1 = array( + 'field_name' => 'card_1', + 'type' => 'list', + 'cardinality' => 1, + 'settings' => array( + 'allowed_values' => "1|One\n2|Two\n3|Three\n", + ), + ); + $this->card_1 = field_create_field($this->card_1); + + $this->card_2 = array( + 'field_name' => 'card_2', + 'type' => 'list', + 'cardinality' => 2, + 'settings' => array( + 'allowed_values' => "1|One\n2|Two\n3|Three\n", + ), + ); + $this->card_2 = field_create_field($this->card_2); + } + + /** + * Test widgets + */ + + /** + * Return an element from rendered HTML by id, or '' if id is not found. + */ + function getTagById($html, $id) { + // @todo: ids sometimes have an extra -n after them; why? + if (preg_match('@(<[^>]*id="' . $id . '(?:-\d+)?"[^>]*/>)@i', $html, $m)) { + return $m[0]; + } + return ''; + } + + /** + * Assert that a checkbox identified by $id is checked. + */ + function assertIsChecked($html, $id) { + $input = $this->getTagById($html, $id); + $this->assertTrue(preg_match('@checked="checked"@', $input), t('Checkbox %id is checked', array('%id' => $id))); + } + + /** + * Assert that a checkbox identified by $id is not checked. + */ + function assertIsNotChecked($html, $id) { + $input = $this->getTagById($html, $id); + if (!empty($input)) { + $this->assertFalse(preg_match('@checked@', $input), t('Checkbox %id is not checked', array('%id' => $id))); + } + else { + $this->fail(t('Checkbox %id is not found', array('%id' => $id))); + } + } + + /** + * Return an )@i', $html, $m)) { + return $m[0]; + } + return ''; + } + + /** + * Assert that an