domkey 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/domkey/exception.rb +4 -0
- data/lib/domkey/version.rb +1 -1
- data/lib/domkey/view.rb +1 -0
- data/lib/domkey/view/checkbox_group.rb +12 -63
- data/lib/domkey/view/label_mapper.rb +7 -1
- data/lib/domkey/view/labeled_group.rb +22 -11
- data/lib/domkey/view/option_selectable.rb +102 -0
- data/lib/domkey/view/option_selectable_group.rb +120 -0
- data/lib/domkey/view/page_object.rb +11 -11
- data/lib/domkey/view/page_object_collection.rb +1 -1
- data/lib/domkey/view/radio_group.rb +9 -58
- data/lib/domkey/view/select_list.rb +67 -0
- data/lib/domkey/view/widgetry/dispatcher.rb +51 -0
- data/lib/domkey/view/widgetry/package.rb +49 -0
- data/spec/checkbox_group_spec.rb +81 -5
- data/spec/option_selectable_spec.rb +57 -0
- data/spec/radio_group_spec.rb +62 -4
- data/spec/select_list_spec.rb +212 -0
- metadata +11 -6
- data/lib/domkey/view/watir_widget.rb +0 -106
- data/lib/domkey/view/widgetry_package.rb +0 -48
- data/spec/watir_widget_select_spec.rb +0 -176
@@ -1,69 +1,20 @@
|
|
1
|
-
require 'domkey/view/
|
1
|
+
require 'domkey/view/option_selectable_group'
|
2
|
+
|
2
3
|
module Domkey
|
3
4
|
|
4
5
|
module View
|
5
6
|
|
6
7
|
# RadioGroup allows you to interact with PageObjectCollection of radios as a single PageObject
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
# @param [String] match text in value attribute and set that radio
|
13
|
-
def set value
|
14
|
-
validate_scope
|
15
|
-
return unless value
|
16
|
-
[*value].each do |v|
|
17
|
-
e = case v
|
18
|
-
when String
|
19
|
-
element.find { |e| e.value == v }
|
20
|
-
when Regexp
|
21
|
-
element.find { |e| e.value.match(v) }
|
22
|
-
end
|
23
|
-
e ? e.set : fail(Exception::Error, "RadioGroup value not found: #{v.inspect}")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# @return [String] text in value attribute of currently set
|
28
|
-
def value
|
29
|
-
validate_scope
|
30
|
-
element.find_all { |r| r.set? }.map { |e| e.value }
|
31
|
-
end
|
32
|
-
|
33
|
-
def options
|
34
|
-
validate_scope
|
35
|
-
element.map { |e| e.value }
|
36
|
-
end
|
37
|
-
|
38
|
-
# convert to LabeledGroup settable by corresponding label text
|
39
|
-
def to_labeled
|
40
|
-
LabeledGroup.new(self)
|
41
|
-
end
|
42
|
-
|
43
|
-
# @yield [PageObject]
|
44
|
-
def each(&blk)
|
45
|
-
validate_scope
|
46
|
-
super(&blk)
|
47
|
-
end
|
48
|
-
|
49
|
-
# @return [Array<PageObject>]
|
50
|
-
def to_a
|
51
|
-
validate_scope
|
52
|
-
super
|
53
|
-
end
|
8
|
+
# Acts like OptionSelectable
|
9
|
+
# Radios collection is constrained by the same name attribute
|
10
|
+
# Behaves like a single Select list.
|
11
|
+
# It has one radio selected at all times
|
12
|
+
class RadioGroup < OptionSelectableGroup
|
54
13
|
|
55
14
|
private
|
56
15
|
|
57
|
-
|
58
|
-
|
59
|
-
# @raise [Exception::Error] when where is more than one unique name attribute
|
60
|
-
# --
|
61
|
-
# returns true on subsequent unless magically more radios show up after initial validation
|
62
|
-
def validate_scope
|
63
|
-
return if @validated
|
64
|
-
groups = element.map { |e| e.name }.uniq
|
65
|
-
fail(Exception::Error, "RadioGroup definition scope too broad: Found #{groups.count} radio groups with names: #{groups}") unless (groups.size == 1)
|
66
|
-
@validated = true
|
16
|
+
def before_set
|
17
|
+
validate_scope
|
67
18
|
end
|
68
19
|
end
|
69
20
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'domkey/view/option_selectable'
|
2
|
+
|
3
|
+
module Domkey
|
4
|
+
module View
|
5
|
+
|
6
|
+
class SelectList < PageObject
|
7
|
+
|
8
|
+
include OptionSelectable
|
9
|
+
|
10
|
+
def set_by_string value
|
11
|
+
element.select value
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_by_regexp value
|
15
|
+
element.select value
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_by_index value
|
19
|
+
case value
|
20
|
+
when Fixnum
|
21
|
+
element.options[value].select
|
22
|
+
when Array
|
23
|
+
value.each do |i|
|
24
|
+
element.options[i].select
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_by_value value
|
30
|
+
case value
|
31
|
+
when String
|
32
|
+
element.select_value value
|
33
|
+
when Array
|
34
|
+
value.each { |v| element.select_value v }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def value_by_options opts
|
39
|
+
element.selected_options.map do |o|
|
40
|
+
Hash[opts.map { |opt| [opt, o.send(opt)] }]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def value_by_default
|
45
|
+
element.selected_options.map { |e| e.text }
|
46
|
+
end
|
47
|
+
|
48
|
+
# iffy
|
49
|
+
def options
|
50
|
+
element.options.map do |o|
|
51
|
+
{text: o.text,
|
52
|
+
value: o.value,
|
53
|
+
index: o.index}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def before_set
|
61
|
+
element.clear if element.multiple?
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Domkey
|
2
|
+
module View
|
3
|
+
module Widgetry
|
4
|
+
|
5
|
+
# Dispatcher chooser for a given Element
|
6
|
+
# @param object [Element] thing that needs to be interacted with, i.e. Watir::Select, Watir::CheckBox, Selenium::Element etc...
|
7
|
+
# @return [Widgetry::Dispatcher] (or subclass of) that handles the strategy for interacting with the element
|
8
|
+
def self.dispatcher(object)
|
9
|
+
object_class_name = object.class.name.split('::').last
|
10
|
+
if const_defined? object_class_name.to_sym
|
11
|
+
const_get("#{self}::#{object_class_name}").new(object)
|
12
|
+
else
|
13
|
+
Dispatcher.new(object)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Widgetry::Dispatcher is a communication object responsible for
|
18
|
+
# receiving and transmitting messages to PageObject Element.
|
19
|
+
# Client should subclass and provide desired interaction strategy that may differ from provided by default
|
20
|
+
class Dispatcher < SimpleDelegator
|
21
|
+
|
22
|
+
# @param [Element] thing that needs to be set i.e. Watir::Select, Watir::CheckBox etc...
|
23
|
+
def initialize(object)
|
24
|
+
__setobj__(object)
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Element] subclasses use this to interact with original Elment wrapped by Dispacher
|
28
|
+
def original
|
29
|
+
__getobj__
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Array<Option>] defaults to [] if original.options.empty?
|
33
|
+
def options
|
34
|
+
o = original.options
|
35
|
+
o.count == 0 ? [] : o
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class Radio < Dispatcher
|
41
|
+
|
42
|
+
# because radio.set does not take args
|
43
|
+
def set value
|
44
|
+
original.set
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Domkey
|
2
|
+
module View
|
3
|
+
module Widgetry
|
4
|
+
|
5
|
+
module Package
|
6
|
+
|
7
|
+
attr_accessor :package, :container
|
8
|
+
|
9
|
+
# initialize PageObject or PageObjectCollection
|
10
|
+
# for PageObject expects WebdriverElement a single element definition i.e text_field, checkbox
|
11
|
+
# for PageObjectCollection expects WebdriverElement a collection definition i.e. text_fields, checkboxes
|
12
|
+
# @param package [Proc(WebdriverElement)]
|
13
|
+
# @param package [PageObject]
|
14
|
+
# @param package [Hash{Symbol => Proc(WebdriverElement)]
|
15
|
+
# @param package [Hash{Symbol => PageObject]
|
16
|
+
def initialize package, container=lambda { Domkey.browser }
|
17
|
+
@container = container
|
18
|
+
@package = initialize_this package
|
19
|
+
end
|
20
|
+
|
21
|
+
# access widgetry of watir elements composing this page object
|
22
|
+
# @param [Symbol] (false)
|
23
|
+
# @return [Hash{Symbol => WebdriverElement}]
|
24
|
+
# @return [Element] raw element, i.e. Watir::Select, Watir::CheckBox (not wrapped with Dispatcher strategy)
|
25
|
+
def element(key=false)
|
26
|
+
return instantiator unless package.respond_to?(:each_pair)
|
27
|
+
return package.fetch(key).element if key
|
28
|
+
Hash[package.map { |key, package| [key, package.element] }]
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# talks to the browser
|
34
|
+
# returns runtime element in a specified container
|
35
|
+
# @return [WebdriverElement]
|
36
|
+
def instantiator
|
37
|
+
container_instantiator.instance_exec(&package)
|
38
|
+
end
|
39
|
+
|
40
|
+
# talks to the browser
|
41
|
+
# returns runtime container element in a browser/driver
|
42
|
+
# @return [WebdriverElement]
|
43
|
+
def container_instantiator
|
44
|
+
container.respond_to?(:call) ? container.call : container.send(:instantiator)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/checkbox_group_spec.rb
CHANGED
@@ -39,16 +39,20 @@ describe Domkey::View::CheckboxGroup do
|
|
39
39
|
|
40
40
|
it 'initial value on test page' do
|
41
41
|
@v.group.value.should eql ['other']
|
42
|
+
@v.group.value(:value, :index, :label).should eql [value: 'other', index: 2, label: 'Other']
|
42
43
|
end
|
43
44
|
|
44
|
-
it 'set
|
45
|
+
it 'set string' do
|
45
46
|
@v.group.set 'tomato'
|
46
47
|
@v.group.value.should eql ['tomato']
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'set regexp' do
|
47
51
|
@v.group.set /^othe/
|
48
52
|
@v.group.value.should eql ['other']
|
49
53
|
end
|
50
54
|
|
51
|
-
it 'set array of
|
55
|
+
it 'set array of strings or regexp' do
|
52
56
|
@v.group.set ['tomato']
|
53
57
|
@v.group.value.should eql ['tomato']
|
54
58
|
|
@@ -56,12 +60,12 @@ describe Domkey::View::CheckboxGroup do
|
|
56
60
|
@v.group.value.should eql ['tomato', 'other']
|
57
61
|
end
|
58
62
|
|
59
|
-
it 'set false clears all
|
63
|
+
it 'set false clears all' do
|
60
64
|
@v.group.set false
|
61
65
|
@v.group.value.should eql []
|
62
66
|
end
|
63
67
|
|
64
|
-
it 'set empty array clears all
|
68
|
+
it 'set empty array clears all' do
|
65
69
|
@v.group.set []
|
66
70
|
@v.group.value.should eql []
|
67
71
|
end
|
@@ -74,8 +78,80 @@ describe Domkey::View::CheckboxGroup do
|
|
74
78
|
expect { @v.group.set /balaba/ }.to raise_error
|
75
79
|
end
|
76
80
|
|
77
|
-
it '
|
81
|
+
it 'set by index single' do
|
82
|
+
@v.group.set index: 1
|
83
|
+
@v.group.value.should eql ['tomato']
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'set by index array' do
|
87
|
+
@v.group.set index: [0, 2, 1]
|
88
|
+
@v.group.value.should eql ['cucumber', 'tomato', 'other']
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'set by label string' do
|
92
|
+
@v.group.set label: 'Tomatorama'
|
93
|
+
@v.group.value.should eql ['tomato']
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'set by label regexp' do
|
97
|
+
@v.group.set label: /umberama/
|
98
|
+
@v.group.value([:index, :value, :text, :label]).should eql [{:index=>0, :value=>"cucumber", :text=>"Cucumberama", :label=>"Cucumberama"}]
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
it 'set by index array string, regex' do
|
103
|
+
@v.group.set label: ['Cucumberama', /atorama/]
|
104
|
+
@v.group.value.should eql ['cucumber', 'tomato']
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
it 'value options single selected' do
|
109
|
+
@v.group.set [/tomat/]
|
110
|
+
@v.group.value.should eql ['tomato']
|
111
|
+
|
112
|
+
@v.group.value(:label).should eql [{:label=>"Tomatorama"}]
|
113
|
+
@v.group.value([:label]).should eql [{:label=>"Tomatorama"}]
|
114
|
+
@v.group.value(:label, :value, :index).should eql [{:label=>"Tomatorama", :value=>"tomato", :index=>1}]
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'value options many selected' do
|
118
|
+
@v.group.set ['other', /tomat/, /cucum/]
|
119
|
+
@v.group.value.should eql ['cucumber', 'tomato', 'other']
|
120
|
+
|
121
|
+
@v.group.value(:label).should eql [{:label=>"Cucumberama"}, {:label=>"Tomatorama"}, {:label=>"Other"}]
|
122
|
+
@v.group.value(:label, :index, :value).should eql [{:label=>"Cucumberama", :index=>0, :value=>"cucumber"},
|
123
|
+
{:label=>"Tomatorama", :index=>1, :value=>"tomato"},
|
124
|
+
{:label=>"Other", :index=>2, :value=>"other"}]
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'value options none selected' do
|
128
|
+
@v.group.set []
|
129
|
+
@v.group.value.should eql []
|
130
|
+
@v.group.value(:label).should eql []
|
131
|
+
@v.group.value(:label, :index, :value).should eql []
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'options by default' do
|
78
135
|
@v.group.options.should eql ["cucumber", "tomato", "other"]
|
79
136
|
end
|
137
|
+
|
138
|
+
it 'options by opts single' do
|
139
|
+
@v.group.options(:value).should eql [{:value=>"cucumber"}, {:value=>"tomato"}, {:value=>"other"}]
|
140
|
+
@v.group.options([:value]).should eql [{:value=>"cucumber"}, {:value=>"tomato"}, {:value=>"other"}]
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'options by label' do
|
144
|
+
@v.group.options(:label).should eql [{:label=>"Cucumberama"}, {:label=>"Tomatorama"}, {:label=>"Other"}]
|
145
|
+
@v.group.options([:label]).should eql [{:label=>"Cucumberama"}, {:label=>"Tomatorama"}, {:label=>"Other"}]
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'options by opts many' do
|
149
|
+
expected = [{:value=>"cucumber", :index=>0, :label=>"Cucumberama", :text=>"Cucumberama"},
|
150
|
+
{:value=>"tomato", :index=>1, :label=>"Tomatorama", :text=>"Tomatorama"},
|
151
|
+
{:value=>"other", :index=>2, :label=>"Other", :text=>"Other"}]
|
152
|
+
|
153
|
+
@v.group.options(:value, :index, :label, :text).should eql expected
|
154
|
+
@v.group.options([:value, :index, :label, :text]).should eql expected
|
155
|
+
end
|
80
156
|
end
|
81
157
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Domkey::View::OptionSelectable do
|
4
|
+
|
5
|
+
class OptionSelectableFaker
|
6
|
+
include Domkey::View::OptionSelectable
|
7
|
+
end
|
8
|
+
|
9
|
+
before :all do
|
10
|
+
@widget = OptionSelectableFaker.new
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'set string' do
|
14
|
+
expect { @widget.set('fake') }.to raise_error(Domkey::Exception::NotImplementedError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'set regex' do
|
18
|
+
expect { @widget.set(/fake/) }.to raise_error(Domkey::Exception::NotImplementedError)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'set :label' do
|
22
|
+
expect { @widget.set(:label => 'fake') }.to raise_error(Domkey::Exception::NotImplementedError)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'set :text' do
|
26
|
+
expect { @widget.set(:text => 'fake') }.to raise_error(Domkey::Exception::NotImplementedError)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'set :index' do
|
30
|
+
expect { @widget.set(:index => 3) }.to raise_error(Domkey::Exception::NotImplementedError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'set :value' do
|
34
|
+
expect { @widget.set(:value => 'fake') }.to raise_error(Domkey::Exception::NotImplementedError)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'value default' do
|
38
|
+
expect { @widget.value }.to raise_error(Domkey::Exception::NotImplementedError)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'value option' do
|
42
|
+
expect { @widget.value(:foo) }.to raise_error(Domkey::Exception::NotImplementedError)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'options default' do
|
46
|
+
expect { @widget.options }.to raise_error(Domkey::Exception::NotImplementedError)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'options opt' do
|
50
|
+
expect { @widget.options(:foo) }.to raise_error(Domkey::Exception::NotImplementedError)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
data/spec/radio_group_spec.rb
CHANGED
@@ -41,11 +41,19 @@ describe Domkey::View::RadioGroup do
|
|
41
41
|
|
42
42
|
it 'initial value on test page' do
|
43
43
|
@v.group.value.should eql ['other']
|
44
|
+
@v.group.value(:index, :value, :label, :text).should eql [{:index=>2, :value=>"other", :label=>"Other", :text=>"Other"}]
|
45
|
+
@v.group.value([:index, :value, :label, :text]).should eql [{:index=>2, :value=>"other", :label=>"Other", :text=>"Other"}]
|
46
|
+
@v.group.value([:index]).should eql [{:index=>2}]
|
47
|
+
@v.group.value([:value]).should eql [{:value=>'other'}]
|
44
48
|
end
|
45
49
|
|
46
|
-
it 'set
|
50
|
+
it 'set string' do
|
47
51
|
@v.group.set 'tomato'
|
48
52
|
@v.group.value.should eql ['tomato']
|
53
|
+
@v.group.value(:value).should eql [{value: 'tomato'}]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'set regexp' do
|
49
57
|
@v.group.set /^oth/
|
50
58
|
@v.group.value.should eql ['other']
|
51
59
|
end
|
@@ -56,14 +64,15 @@ describe Domkey::View::RadioGroup do
|
|
56
64
|
|
57
65
|
@v.group.set ['other', 'tomato', /cucu/]
|
58
66
|
@v.group.value.should eql ['cucumber']
|
67
|
+
@v.group.value([:index, :label]).should eql [{:index=>0, :label=>"Cucumber"}]
|
59
68
|
end
|
60
69
|
|
61
|
-
it 'set false has no effect
|
70
|
+
it 'set false has no effect' do
|
62
71
|
@v.group.set false
|
63
72
|
@v.group.value.should eql ['other']
|
64
73
|
end
|
65
74
|
|
66
|
-
it 'set empty array
|
75
|
+
it 'set empty array has no effect' do
|
67
76
|
@v.group.set []
|
68
77
|
@v.group.value.should eql ['other']
|
69
78
|
end
|
@@ -76,10 +85,59 @@ describe Domkey::View::RadioGroup do
|
|
76
85
|
expect { @v.group.set /balaba/ }.to raise_error
|
77
86
|
end
|
78
87
|
|
79
|
-
|
88
|
+
|
89
|
+
it 'set by index single' do
|
90
|
+
@v.group.set index: 1
|
91
|
+
@v.group.value.should eql ['tomato']
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'set by index array' do
|
95
|
+
@v.group.set index: [0, 2, 1]
|
96
|
+
@v.group.value.should eql ['tomato']
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'set by label string' do
|
100
|
+
@v.group.set label: 'Tomato'
|
101
|
+
@v.group.value.should eql ['tomato']
|
102
|
+
@v.group.value(:text).should eql [{text: 'Tomato'}]
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'set by label regexp' do
|
106
|
+
@v.group.set label: /umber/
|
107
|
+
@v.group.value.should eql ['cucumber']
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
it 'set by index array string, regex' do
|
112
|
+
@v.group.set label: ['Cucumber', /mato/]
|
113
|
+
@v.group.value.should eql ['tomato']
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'options by default' do
|
80
117
|
@v.group.options.should eql ["cucumber", "tomato", "other"]
|
81
118
|
end
|
82
119
|
|
120
|
+
it 'options by opts single' do
|
121
|
+
@v.group.options(:value).should eql [{:value=>"cucumber"}, {:value=>"tomato"}, {:value=>"other"}]
|
122
|
+
@v.group.options([:value]).should eql [{:value=>"cucumber"}, {:value=>"tomato"}, {:value=>"other"}]
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'options by label' do
|
126
|
+
expected = [{:label=>"Cucumber"}, {:label=>"Tomato"}, {:label=>"Other"}]
|
127
|
+
@v.group.options(:label).should eql expected
|
128
|
+
@v.group.options([:label]).should eql expected
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'options by opts many' do
|
132
|
+
expected = [{:value=>"cucumber", :index=>0, :label=>"Cucumber", :text=>"Cucumber"},
|
133
|
+
{:value=>"tomato", :index=>1, :label=>"Tomato", :text=>"Tomato"},
|
134
|
+
{:value=>"other", :index=>2, :label=>"Other", :text=>"Other"}]
|
135
|
+
|
136
|
+
@v.group.options(:value, :index, :label, :text).should eql expected
|
137
|
+
@v.group.options([:value, :index, :label, :text]).should eql expected
|
138
|
+
end
|
139
|
+
|
140
|
+
|
83
141
|
end
|
84
142
|
|
85
143
|
end
|