active_form 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. data.tar.gz.sig +2 -0
  2. data/History.txt +4 -0
  3. data/License.txt +20 -0
  4. data/MIT-LICENSE +19 -0
  5. data/Manifest.txt +181 -0
  6. data/README.txt +1 -0
  7. data/Rakefile +4 -0
  8. data/config/hoe.rb +71 -0
  9. data/config/requirements.rb +17 -0
  10. data/init.rb +5 -0
  11. data/lib/active_form.rb +86 -0
  12. data/lib/active_form/core_extensions.rb +179 -0
  13. data/lib/active_form/definition.rb +72 -0
  14. data/lib/active_form/element.rb +50 -0
  15. data/lib/active_form/elements/base.rb +67 -0
  16. data/lib/active_form/elements/builder.rb +103 -0
  17. data/lib/active_form/elements/button.rb +15 -0
  18. data/lib/active_form/elements/checkbox.rb +18 -0
  19. data/lib/active_form/elements/file.rb +15 -0
  20. data/lib/active_form/elements/hidden.rb +9 -0
  21. data/lib/active_form/elements/image.rb +7 -0
  22. data/lib/active_form/elements/input.rb +23 -0
  23. data/lib/active_form/elements/password.rb +12 -0
  24. data/lib/active_form/elements/radio.rb +18 -0
  25. data/lib/active_form/elements/reset.rb +15 -0
  26. data/lib/active_form/elements/section.rb +37 -0
  27. data/lib/active_form/elements/select.rb +42 -0
  28. data/lib/active_form/elements/submit.rb +19 -0
  29. data/lib/active_form/elements/text.rb +9 -0
  30. data/lib/active_form/elements/textarea.rb +18 -0
  31. data/lib/active_form/errors.rb +73 -0
  32. data/lib/active_form/facets/checkbox_group.rb +11 -0
  33. data/lib/active_form/facets/collection_input.rb +96 -0
  34. data/lib/active_form/facets/radio_group.rb +11 -0
  35. data/lib/active_form/facets/select_date.rb +10 -0
  36. data/lib/active_form/facets/select_datetime.rb +10 -0
  37. data/lib/active_form/facets/select_day.rb +17 -0
  38. data/lib/active_form/facets/select_from_model.rb +60 -0
  39. data/lib/active_form/facets/select_hour.rb +17 -0
  40. data/lib/active_form/facets/select_minute.rb +17 -0
  41. data/lib/active_form/facets/select_month.rb +46 -0
  42. data/lib/active_form/facets/select_numeric_range.rb +59 -0
  43. data/lib/active_form/facets/select_second.rb +17 -0
  44. data/lib/active_form/facets/select_time.rb +10 -0
  45. data/lib/active_form/facets/select_timebased.rb +145 -0
  46. data/lib/active_form/facets/select_weekday.rb +46 -0
  47. data/lib/active_form/facets/select_year.rb +24 -0
  48. data/lib/active_form/mixins/attribute_methods.rb +33 -0
  49. data/lib/active_form/mixins/casting.rb +152 -0
  50. data/lib/active_form/mixins/collection_element_methods.rb +204 -0
  51. data/lib/active_form/mixins/common_methods.rb +350 -0
  52. data/lib/active_form/mixins/container_methods.rb +417 -0
  53. data/lib/active_form/mixins/css_methods.rb +70 -0
  54. data/lib/active_form/mixins/element_methods.rb +314 -0
  55. data/lib/active_form/mixins/javascript_methods.rb +99 -0
  56. data/lib/active_form/mixins/loader_methods.rb +72 -0
  57. data/lib/active_form/mixins/option_element_methods.rb +61 -0
  58. data/lib/active_form/mixins/validation_methods.rb +253 -0
  59. data/lib/active_form/validator.rb +47 -0
  60. data/lib/active_form/validators/alpha.rb +9 -0
  61. data/lib/active_form/validators/alphanum.rb +9 -0
  62. data/lib/active_form/validators/base.rb +132 -0
  63. data/lib/active_form/validators/digits.rb +9 -0
  64. data/lib/active_form/validators/email.rb +29 -0
  65. data/lib/active_form/validators/format.rb +15 -0
  66. data/lib/active_form/validators/length_range.rb +24 -0
  67. data/lib/active_form/validators/number.rb +9 -0
  68. data/lib/active_form/validators/option_count.rb +24 -0
  69. data/lib/active_form/validators/proc.rb +22 -0
  70. data/lib/active_form/validators/required.rb +9 -0
  71. data/lib/active_form/validators/set.rb +21 -0
  72. data/lib/active_form/validators/time_range.rb +30 -0
  73. data/lib/active_form/validators/uri.rb +54 -0
  74. data/lib/active_form/version.rb +9 -0
  75. data/lib/active_form/views/fieldsets.rb +34 -0
  76. data/lib/active_form/views/plain.rb +32 -0
  77. data/lib/active_form/views/tables.rb +28 -0
  78. data/lib/active_form/widget.rb +43 -0
  79. data/lib/active_form/widgets/base.rb +28 -0
  80. data/lib/loob/uri_validator.rb +140 -0
  81. data/lib/rails/acts_as_dropdown/MIT-LICENSE +20 -0
  82. data/lib/rails/acts_as_dropdown/acts_as_dropdown.rb +119 -0
  83. data/lib/rails/acts_as_dropdown/dropdown.rb +27 -0
  84. data/lib/rails/controller_helper.rb +19 -0
  85. data/lib/rails/model/loader.rb +206 -0
  86. data/lib/rails/view_helper.rb +20 -0
  87. data/samples/html/css/style.css +175 -0
  88. data/samples/html/js/effects.js +958 -0
  89. data/samples/html/js/prototype.js +2006 -0
  90. data/samples/html/js/validation.js +228 -0
  91. data/samples/html/plain_view.html +77 -0
  92. data/samples/html/sample001.html +158 -0
  93. data/samples/html/sample002.html +76 -0
  94. data/samples/html/sample003.html +34 -0
  95. data/samples/layouts/default.rhtml +18 -0
  96. data/samples/layouts/plain.rhtml +21 -0
  97. data/samples/layouts/sample003.rhtml +25 -0
  98. data/samples/plain_view.rb +58 -0
  99. data/samples/sample001.rb +111 -0
  100. data/samples/sample002.rb +92 -0
  101. data/samples/sample003.rb +30 -0
  102. data/script/destroy +14 -0
  103. data/script/generate +14 -0
  104. data/script/txt2html +74 -0
  105. data/setup.rb +1585 -0
  106. data/tasks/deployment.rake +34 -0
  107. data/tasks/environment.rake +7 -0
  108. data/tasks/website.rake +17 -0
  109. data/test/elements/test_base_element.rb +159 -0
  110. data/test/elements/test_builder_element.rb +81 -0
  111. data/test/elements/test_button_element.rb +12 -0
  112. data/test/elements/test_checkbox_element.rb +233 -0
  113. data/test/elements/test_file_element.rb +20 -0
  114. data/test/elements/test_hidden_element.rb +11 -0
  115. data/test/elements/test_image_element.rb +11 -0
  116. data/test/elements/test_input_element.rb +39 -0
  117. data/test/elements/test_password_element.rb +16 -0
  118. data/test/elements/test_radio_element.rb +197 -0
  119. data/test/elements/test_reset_element.rb +12 -0
  120. data/test/elements/test_section_element.rb +162 -0
  121. data/test/elements/test_select_element.rb +364 -0
  122. data/test/elements/test_submit_element.rb +12 -0
  123. data/test/elements/test_text_element.rb +91 -0
  124. data/test/elements/test_textarea_element.rb +23 -0
  125. data/test/facets/test_checkbox_group_element.rb +388 -0
  126. data/test/facets/test_radio_group_element.rb +312 -0
  127. data/test/facets/test_select_date_element.rb +211 -0
  128. data/test/facets/test_select_datetime_element.rb +56 -0
  129. data/test/facets/test_select_day_element.rb +37 -0
  130. data/test/facets/test_select_from_model_element.rb +86 -0
  131. data/test/facets/test_select_hour_element.rb +37 -0
  132. data/test/facets/test_select_minute_element.rb +52 -0
  133. data/test/facets/test_select_month_element.rb +79 -0
  134. data/test/facets/test_select_numeric_range_element.rb +14 -0
  135. data/test/facets/test_select_second_element.rb +48 -0
  136. data/test/facets/test_select_time_element.rb +148 -0
  137. data/test/facets/test_select_weekday_element.rb +71 -0
  138. data/test/facets/test_select_year_element.rb +73 -0
  139. data/test/fixtures/author.rb +11 -0
  140. data/test/fixtures/authors.yml +0 -0
  141. data/test/fixtures/book.rb +14 -0
  142. data/test/fixtures/books.yml +8 -0
  143. data/test/fixtures/categories.yml +0 -0
  144. data/test/fixtures/categorization.rb +2 -0
  145. data/test/fixtures/categorizations.yml +0 -0
  146. data/test/fixtures/category.rb +8 -0
  147. data/test/fixtures/publisher.rb +5 -0
  148. data/test/fixtures/publishers.yml +10 -0
  149. data/test/fixtures/schema.rb +43 -0
  150. data/test/rails/test_model_autodefinition.rb +121 -0
  151. data/test/rails/test_model_loader.rb +61 -0
  152. data/test/resources/elements/chunky.rb +11 -0
  153. data/test/resources/forms/demo.rb +5 -0
  154. data/test/resources/models/book.rb +8 -0
  155. data/test/resources/models/register_publisher.rb +5 -0
  156. data/test/resources/sections/demo.rb +6 -0
  157. data/test/resources/sections/foo.rb +6 -0
  158. data/test/resources/validators/foo.rb +9 -0
  159. data/test/resources/widgets/custom.rb +13 -0
  160. data/test/test_active_form.rb +1050 -0
  161. data/test/test_casting.rb +124 -0
  162. data/test/test_definition.rb +68 -0
  163. data/test/test_definition_class.rb +118 -0
  164. data/test/test_element_class.rb +201 -0
  165. data/test/test_helper.rb +74 -0
  166. data/test/test_javascript.rb +234 -0
  167. data/test/test_load_definition.rb +68 -0
  168. data/test/test_load_element.rb +35 -0
  169. data/test/test_load_section_element.rb +43 -0
  170. data/test/test_load_validator.rb +31 -0
  171. data/test/test_load_widget.rb +93 -0
  172. data/test/test_validation.rb +722 -0
  173. data/test/validators/test_validates_as_alpha.rb +26 -0
  174. data/test/validators/test_validates_as_alphanum.rb +26 -0
  175. data/test/validators/test_validates_as_digits.rb +26 -0
  176. data/test/validators/test_validates_as_email.rb +29 -0
  177. data/test/validators/test_validates_as_number.rb +26 -0
  178. data/test/validators/test_validates_as_uri.rb +128 -0
  179. data/test/validators/test_validates_with_format.rb +26 -0
  180. data/test/validators/test_validates_within_length_range.rb +46 -0
  181. data/test/validators/test_validates_within_set.rb +46 -0
  182. data/test/validators/test_validates_within_time_range.rb +53 -0
  183. metadata +307 -0
  184. metadata.gz.sig +4 -0
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ class TestTextareaElement < Test::Unit::TestCase
4
+
5
+ def test_set_attributes
6
+ [:title, :lang, :rows, :cols].each do |attribute|
7
+ assert ActiveForm::Element::Textarea.element_attribute_names.include?(attribute)
8
+ end
9
+ elem = ActiveForm::Element::Textarea.new :elem, :rows => 5, :cols => 30
10
+ expected = {"name"=>"elem", "class"=>"elem_textarea", "id"=>"elem", "rows"=>5, "cols"=>30}
11
+ assert_equal expected, elem.element_attributes
12
+ end
13
+
14
+ def test_element_to_html
15
+ elem = ActiveForm::Element::Textarea.new :elem, :value => 'test'
16
+ expected = %|<textarea class="elem_textarea" cols="40" id="elem" name="elem" rows="20">test</textarea>\n|
17
+ assert_equal expected, elem.to_html
18
+ elem = ActiveForm::Element::Textarea.new :elem, :value => 'test', :rows => 5, :cols => 30
19
+ expected = %|<textarea class="elem_textarea" cols="30" id="elem" name="elem" rows="5">test</textarea>\n|
20
+ assert_equal expected, elem.to_html
21
+ end
22
+
23
+ end
@@ -0,0 +1,388 @@
1
+ require 'test_helper'
2
+
3
+ class TestCheckboxGroupElement < Test::Unit::TestCase
4
+
5
+ def test_multiple
6
+ elem = ActiveForm::Element::CheckboxGroup.new :choices, :options => %w{ one two three four }
7
+ assert elem.multiple?
8
+ end
9
+
10
+ def test_add_options
11
+ elem = ActiveForm::Element::CheckboxGroup.new :choices, :options => %w{ one two three four }
12
+ assert_equal ['one', 'two', 'three', 'four'], elem.options.collect(&:label)
13
+ assert_equal ['one', 'two', 'three', 'four'], elem.options.collect(&:value)
14
+
15
+ elem = ActiveForm::Element::CheckboxGroup.new :choices, :options => [ ['one', 1], ['two', 2], ['three', 3], ['four', 4] ]
16
+ assert_equal ['one', 'two', 'three', 'four'], elem.options.collect(&:label)
17
+ assert_equal [1, 2, 3, 4], elem.options.collect(&:value)
18
+
19
+ elem.option('five', 5)
20
+ assert_equal ['one', 'two', 'three', 'four', 'five'], elem.options.collect(&:label)
21
+ assert_equal [1, 2, 3, 4, 5], elem.options.collect(&:value)
22
+ end
23
+
24
+ def test_element_value
25
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => %w{ Barney Fred Wilma }, :value => "Fred"
26
+ assert_equal ["Fred"], elem.element_value
27
+ assert elem.selected?("Fred")
28
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => %w{ Barney Fred Wilma }, :selected => "Fred"
29
+ assert_equal ["Fred"], elem.element_value
30
+ assert elem.selected?("Fred")
31
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => %w{ Barney Fred Wilma }, :selected => ["Fred", "Wilma"]
32
+ assert_equal ["Fred", "Wilma"], elem.element_value
33
+ assert elem.selected?("Fred")
34
+ assert elem.selected?("Wilma")
35
+ end
36
+
37
+ def test_default_value
38
+ elem = ActiveForm::Element::CheckboxGroup.new :elem
39
+ assert_equal [], elem.default_value
40
+ end
41
+
42
+ def test_fallback_value
43
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => ['this', 'that', 'other'], :default => 'no preference'
44
+ assert_equal [], elem.value
45
+ assert_equal [], elem.default_value
46
+ assert_equal ['no preference'], elem.fallback_value
47
+ assert_equal ['no preference'], elem.export_value
48
+ elem.value = 'other'
49
+ assert_equal ['other'], elem.export_value
50
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => ['red', 'green', 'blue'], :default => ['red', 'green']
51
+ assert_equal [], elem.value
52
+ assert_equal [], elem.default_value
53
+ assert_equal ['red', 'green'], elem.fallback_value
54
+ assert_equal ['red', 'green'], elem.export_value
55
+ elem.value = 'blue'
56
+ assert_equal ['blue'], elem.export_value
57
+ end
58
+
59
+ def test_simple_group_options_multiple
60
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => %w{ Barney Fred Wilma }, :value => "Fred"
61
+ assert_equal ["Barney", "Fred", "Wilma"], elem.options.collect(&:value)
62
+ assert_equal ["Fred"], elem.element_value
63
+ assert elem.selected?("Fred")
64
+ end
65
+
66
+ def test_normal_group_options_multiple
67
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [["Barney", 1], ["Fred", 2], ["Wilma", 3]], :value => 3
68
+ assert_equal [1, 2, 3], elem.options.collect(&:value)
69
+ assert_equal [3], elem.element_value
70
+ assert elem.selected?(3)
71
+ end
72
+
73
+ def test_group_options_multiple
74
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [["Barney", 1], ["Fred", 2], ["Wilma", 3]], :value => [2, 3]
75
+ assert_equal [1, 2, 3], elem.options.collect(&:value)
76
+ assert_equal [2, 3], elem.element_value
77
+ assert elem.selected?(2)
78
+ assert elem.selected?(3)
79
+ end
80
+
81
+ def test_each_option_column
82
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => ('a'..'e'), :columns => 2
83
+ result = []
84
+ elem.each_option_column { |options| result << options.compact.collect(&:value) }
85
+ assert_equal [["a", "b", "c"], ["d", "e"]], result
86
+ elem.columns = 3
87
+ result = []
88
+ elem.each_option_column { |options| result << options.compact.collect(&:value) }
89
+ assert_equal [["a", "b"], ["c", "d"], ["e"]], result
90
+ elem.columns = 10
91
+ result = []
92
+ elem.each_option_column { |options| result << options.compact.collect(&:value) }
93
+ assert_equal [["a"], ["b"], ["c"], ["d"], ["e"], [], [], [], [], [], [], []], result
94
+ end
95
+
96
+ def test_element_to_html
97
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :value => [2, 3]
98
+ assert_equal [2, 3], elem.values
99
+ assert elem.selected?(2)
100
+ assert elem.selected?(3)
101
+
102
+ expected = %|<fieldset class="elem_checkbox_group" id="elem">
103
+ <span class="elem">
104
+ <input class="elem_checkbox" id="elem_barney" name="elem[]" type="checkbox" value="1"/>
105
+ <label for="elem_barney">Barney</label>
106
+ </span>
107
+ <span class="elem">
108
+ <input checked="checked" class="elem_checkbox" id="elem_fred" name="elem[]" type="checkbox" value="2"/>
109
+ <label for="elem_fred">Fred</label>
110
+ </span>
111
+ <span class="elem">
112
+ <input checked="checked" class="elem_checkbox" id="elem_wilma" name="elem[]" type="checkbox" value="3"/>
113
+ <label for="elem_wilma">Wilma</label>
114
+ </span>
115
+ </fieldset>\n|
116
+ assert_equal expected, elem.to_html
117
+
118
+ elem.disabled = true
119
+ elem.legend = true
120
+ elem.value = 2
121
+ expected = %|<fieldset class="elem_checkbox_group disabled" id="elem">
122
+ <legend>Elem</legend>
123
+ <span class="elem">
124
+ <input class="elem_checkbox" disabled="disabled" id="elem_barney" name="elem[]" type="checkbox" value="1"/>
125
+ <label for="elem_barney">Barney</label>
126
+ </span>
127
+ <span class="elem">
128
+ <input checked="checked" class="elem_checkbox" disabled="disabled" id="elem_fred" name="elem[]" type="checkbox" value="2"/>
129
+ <label for="elem_fred">Fred</label>
130
+ </span>
131
+ <span class="elem">
132
+ <input class="elem_checkbox" disabled="disabled" id="elem_wilma" name="elem[]" type="checkbox" value="3"/>
133
+ <label for="elem_wilma">Wilma</label>
134
+ </span>
135
+ </fieldset>\n|
136
+ assert_equal expected, elem.to_html
137
+ end
138
+
139
+ def test_element_to_html_in_columns
140
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :columns => 2, :options => ('a'..'c'), :value => 'b'
141
+ expected = %|<fieldset class="elem_checkbox_group" id="elem">
142
+ <div class="column column-1">
143
+ <span class="elem">
144
+ <input class="elem_checkbox" id="elem_a" name="elem[]" type="checkbox" value="a"/>
145
+ <label for="elem_a">a</label>
146
+ </span>
147
+ <span class="elem">
148
+ <input checked="checked" class="elem_checkbox" id="elem_b" name="elem[]" type="checkbox" value="b"/>
149
+ <label for="elem_b">b</label>
150
+ </span>
151
+ </div>
152
+ <div class="column column-2">
153
+ <span class="elem">
154
+ <input class="elem_checkbox" id="elem_c" name="elem[]" type="checkbox" value="c"/>
155
+ <label for="elem_c">c</label>
156
+ </span>
157
+ </div>
158
+ </fieldset>\n|
159
+ assert_equal expected, elem.to_html
160
+
161
+ elem.render_empty = true
162
+ expected = %|<fieldset class="elem_checkbox_group" id="elem">
163
+ <div class="column column-1">
164
+ <span class="elem">
165
+ <input class="elem_checkbox" id="elem_a" name="elem[]" type="checkbox" value="a"/>
166
+ <label for="elem_a">a</label>
167
+ </span>
168
+ <span class="elem">
169
+ <input checked="checked" class="elem_checkbox" id="elem_b" name="elem[]" type="checkbox" value="b"/>
170
+ <label for="elem_b">b</label>
171
+ </span>
172
+ </div>
173
+ <div class="column column-2">
174
+ <span class="elem">
175
+ <input class="elem_checkbox" id="elem_c" name="elem[]" type="checkbox" value="c"/>
176
+ <label for="elem_c">c</label>
177
+ </span>
178
+ <span class="empty-elem">
179
+ </span>
180
+ </div>
181
+ </fieldset>\n|
182
+ assert_equal expected, elem.to_html
183
+ end
184
+
185
+ def test_element_to_html_options_group
186
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :value => 'Wilma', :legend => true do |e|
187
+ e.option_group 'People' do |og|
188
+ og.option 'Barney'
189
+ og.option 'Fred'
190
+ og.option 'Wilma'
191
+ end
192
+ e.option_group('Animals', ['Dino', 'Pluto'])
193
+ e.option_group('Cartoons', [['Simpsons', 'si'], ['Cow&Chicken', 'cc']])
194
+ end
195
+ expected = %|<fieldset class="elem_checkbox_group" id="elem">
196
+ <legend>Elem</legend>
197
+ <fieldset class="options">
198
+ <legend>People</legend>
199
+ <span class="elem">
200
+ <input class="elem_checkbox" id="elem_barney" name="elem[]" type="checkbox" value="Barney"/>
201
+ <label for="elem_barney">Barney</label>
202
+ </span>
203
+ <span class="elem">
204
+ <input class="elem_checkbox" id="elem_fred" name="elem[]" type="checkbox" value="Fred"/>
205
+ <label for="elem_fred">Fred</label>
206
+ </span>
207
+ <span class="elem">
208
+ <input checked="checked" class="elem_checkbox" id="elem_wilma" name="elem[]" type="checkbox" value="Wilma"/>
209
+ <label for="elem_wilma">Wilma</label>
210
+ </span>
211
+ </fieldset>
212
+ <fieldset class="options">
213
+ <legend>Animals</legend>
214
+ <span class="elem">
215
+ <input class="elem_checkbox" id="elem_dino" name="elem[]" type="checkbox" value="Dino"/>
216
+ <label for="elem_dino">Dino</label>
217
+ </span>
218
+ <span class="elem">
219
+ <input class="elem_checkbox" id="elem_pluto" name="elem[]" type="checkbox" value="Pluto"/>
220
+ <label for="elem_pluto">Pluto</label>
221
+ </span>
222
+ </fieldset>
223
+ <fieldset class="options">
224
+ <legend>Cartoons</legend>
225
+ <span class="elem">
226
+ <input class="elem_checkbox" id="elem_simpsons" name="elem[]" type="checkbox" value="si"/>
227
+ <label for="elem_simpsons">Simpsons</label>
228
+ </span>
229
+ <span class="elem">
230
+ <input class="elem_checkbox" id="elem_cow_chicken" name="elem[]" type="checkbox" value="cc"/>
231
+ <label for="elem_cow_chicken">Cow&amp;Chicken</label>
232
+ </span>
233
+ </fieldset>
234
+ </fieldset>\n|
235
+ assert_equal expected, elem.to_html
236
+ end
237
+
238
+ def test_render_within_form
239
+ form = ActiveForm::compose :myform do |f|
240
+ f.checkbox_group_element :people, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
241
+ end
242
+ expected = %|<form action="#myform" class="active_form" id="myform" method="post">
243
+ <fieldset class="elem_checkbox_group" id="myform_people">
244
+ <span class="elem">
245
+ <input class="elem_checkbox" id="myform_people_barney" name="myform[people][]" type="checkbox" value="1"/>
246
+ <label for="myform_people_barney">Barney</label>
247
+ </span>
248
+ <span class="elem">
249
+ <input class="elem_checkbox" id="myform_people_fred" name="myform[people][]" type="checkbox" value="2"/>
250
+ <label for="myform_people_fred">Fred</label>
251
+ </span>
252
+ <span class="elem">
253
+ <input class="elem_checkbox" id="myform_people_wilma" name="myform[people][]" type="checkbox" value="3"/>
254
+ <label for="myform_people_wilma">Wilma</label>
255
+ </span>
256
+ </fieldset>
257
+ </form>\n|
258
+ end
259
+
260
+ def test_render_frozen
261
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :frozen => true
262
+ assert_equal "<span class=\"blank\">-</span>\n", elem.to_html
263
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :selected => 2, :frozen => true
264
+ assert_equal 'Fred', elem.to_html
265
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :values => [2, 3], :frozen => true
266
+ assert_equal 'Fred, Wilma', elem.to_html
267
+ end
268
+
269
+ def test_reset_options
270
+ elem = ActiveForm::Element::CheckboxGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :add_empty => true
271
+ assert_equal ["--", "Barney", "Fred", "Wilma"], elem.options.collect(&:label)
272
+ elem.reset_options!
273
+ assert_equal [], elem.options.collect(&:label)
274
+ end
275
+
276
+ def test_set_initial_value
277
+ values = { :people => 2 }
278
+ form = ActiveForm::compose :myform, :values => values do |f|
279
+ f.checkbox_group_element :people, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
280
+ end
281
+ assert_equal [2], form[:people].value
282
+ assert_equal [2], form[:people].export_value
283
+ form.values = { :people => [2, 3] }
284
+ assert_equal [2, 3], form[:people].value
285
+ assert_equal [2, 3], form[:people].export_value
286
+ expected = { "people" => [2, 3] }
287
+ assert_equal expected, form.export_values
288
+ end
289
+
290
+ def test_export_value
291
+ form = ActiveForm::compose :myform do |f|
292
+ f.checkbox_group_element :people, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
293
+ end
294
+ form[:people].selected = [2, 3]
295
+ expected = { "people" => [2, 3] }
296
+ assert_equal expected, form.export_values
297
+ end
298
+
299
+ def test_update_from_params
300
+ form = ActiveForm::compose :myform do |f|
301
+ f.checkbox_group_element :people, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
302
+ end
303
+ params = { :myform => { :people => [3] } }
304
+ form.update_from_params(params)
305
+ expected = { "people" => [3] }
306
+ assert_equal expected, form.export_values
307
+ end
308
+
309
+ def test_required_validation
310
+ form = ActiveForm::compose :myform do |f|
311
+ f.checkbox_group_element :people, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :required => true
312
+ end
313
+ assert form[:people].blank?
314
+ assert !form.validate
315
+ assert_equal ["required"], form[:people].errors.collect(&:code)
316
+ form[:people].value = 2
317
+ assert form.validate
318
+ form[:people].value = [6, 7]
319
+ assert form[:people].blank?
320
+ assert !form.validate
321
+ end
322
+
323
+ def test_option_count_validation
324
+ form = ActiveForm::compose :myform do |f|
325
+ f.checkbox_group_element :alpha, :options => ('a'..'z'), :required => true
326
+ end
327
+ assert !form.validate
328
+ assert_equal ["required"], form[:alpha].errors.collect(&:code)
329
+ assert_equal ["Alpha: can't be blank"], form[:alpha].errors.collect(&:msg)
330
+ form[:alpha].value = 'a'
331
+ assert form.validate
332
+
333
+ form = ActiveForm::compose :myform do |f|
334
+ f.checkbox_group_element :alpha, :options => ('a'..'z'), :required => 3
335
+ end
336
+ assert !form.validate
337
+ assert_equal ["required"], form[:alpha].errors.collect(&:code)
338
+ assert_equal ["Alpha: you need to select 3 items"], form[:alpha].errors.collect(&:msg)
339
+ form[:alpha].value = ['a', 'b', 'c']
340
+ assert form.validate
341
+
342
+ form = ActiveForm::compose :myform do |f|
343
+ f.checkbox_group_element :alpha, :options => ('a'..'z'), :required => 2..4 do |e|
344
+ e.required_message = "%1$s: you need to select between %3$s and %4$s items"
345
+ end
346
+ end
347
+ assert !form.validate
348
+ assert_equal ["required"], form[:alpha].errors.collect(&:code)
349
+ assert_equal ["Alpha: you need to select between 2 and 4 items"], form[:alpha].errors.collect(&:msg)
350
+ form[:alpha].value = ['a']
351
+ assert !form.validate
352
+ form[:alpha].value = ['a', 'b']
353
+ assert form.validate
354
+ form[:alpha].value = ['a', 'b', 'c']
355
+ assert form.validate
356
+ form[:alpha].value = ['a', 'b', 'c', 'd']
357
+ assert form.validate
358
+ form[:alpha].value = ['a', 'b', 'c', 'd', 'e']
359
+ assert !form.validate
360
+ end
361
+
362
+ def test_option_count_validation_with_zero_minimum
363
+ form = ActiveForm::compose :myform do |f|
364
+ f.checkbox_group_element :alpha, :options => ('a'..'z'), :required => [0, 2] do |e|
365
+ e.required_message = "%1$s: you shouldn't select more than two items"
366
+ end
367
+ end
368
+ assert_equal ["Alpha: you shouldn't select more than two items"], form[:alpha].gather_validation_advice.collect(&:msg)
369
+ form.values[:alpha] = []
370
+ assert form.validate
371
+ form.values[:alpha] = ['a']
372
+ assert form.validate
373
+ form.values[:alpha] = ['a', 'b', 'c']
374
+ assert !form.validate
375
+ assert_equal ["Alpha: you shouldn't select more than two items"], form[:alpha].errors.collect(&:msg)
376
+ end
377
+
378
+ def test_option_count_validation_with_custom_message
379
+ form = ActiveForm::compose :myform do |f|
380
+ f.checkbox_group_element :alpha, :options => ('a'..'z'), :value => ['a'], :required => [2, 8] do |e|
381
+ e.required_message = "%1$s: you need to select between %3$s and %4$s items (you selected %5$s)"
382
+ end
383
+ end
384
+ assert !form.validate
385
+ assert_equal ["Alpha: you need to select between 2 and 8 items (you selected 1)"], form[:alpha].errors.collect(&:msg)
386
+ end
387
+
388
+ end
@@ -0,0 +1,312 @@
1
+ require 'test_helper'
2
+
3
+ class TestRadioGroupElement < Test::Unit::TestCase
4
+
5
+ def test_multiple
6
+ elem = ActiveForm::Element::RadioGroup.new :choices, :options => %w{ one two three four }
7
+ assert !elem.multiple?
8
+ end
9
+
10
+ def test_element_value
11
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => %w{ Barney Fred Wilma }, :value => "Fred"
12
+ assert_equal "Fred", elem.element_value
13
+ assert elem.selected?("Fred")
14
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => %w{ Barney Fred Wilma }, :selected => "Fred"
15
+ assert_equal "Fred", elem.element_value
16
+ assert elem.selected?("Fred")
17
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => %w{ Barney Fred Wilma }, :selected => ["Fred", "Wilma"]
18
+ assert_equal "Fred", elem.element_value
19
+ assert elem.selected?("Fred")
20
+ end
21
+
22
+ def test_default_value
23
+ elem = ActiveForm::Element::RadioGroup.new :elem
24
+ assert_equal nil, elem.default_value
25
+ end
26
+
27
+ def test_fallback_value
28
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => ['this', 'that', 'other'], :default => 'no preference'
29
+ assert_equal nil, elem.value
30
+ assert_equal nil, elem.default_value
31
+ assert_equal 'no preference', elem.fallback_value
32
+ assert_equal 'no preference', elem.export_value
33
+ elem.value = 'other'
34
+ assert_equal 'other', elem.export_value
35
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => ['red', 'green', 'blue'], :default => ['red', 'green']
36
+ assert_equal nil, elem.value
37
+ assert_equal nil, elem.default_value
38
+ assert_equal 'red', elem.fallback_value
39
+ assert_equal 'red', elem.export_value
40
+ elem.value = 'blue'
41
+ assert_equal 'blue', elem.export_value
42
+ end
43
+
44
+ def test_simple_group_options_multiple
45
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => %w{ Barney Fred Wilma }, :value => "Fred"
46
+ assert_equal ["Barney", "Fred", "Wilma"], elem.options.collect(&:value)
47
+ assert_equal "Fred", elem.element_value
48
+ assert elem.selected?("Fred")
49
+ end
50
+
51
+ def test_normal_group_options_multiple
52
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => [["Barney", 1], ["Fred", 2], ["Wilma", 3]], :value => 3
53
+ assert_equal [1, 2, 3], elem.options.collect(&:value)
54
+ assert_equal 3, elem.element_value
55
+ assert elem.selected?(3)
56
+ end
57
+
58
+ def test_element_to_html
59
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :value => 2
60
+ assert_equal 2, elem.value
61
+ assert elem.selected?(2)
62
+
63
+ expected = %|<fieldset class="elem_radio_group" id="elem">
64
+ <span class="elem">
65
+ <input class="elem_radio" id="elem_barney" name="elem" type="radio" value="1"/>
66
+ <label for="elem_barney">Barney</label>
67
+ </span>
68
+ <span class="elem">
69
+ <input checked="checked" class="elem_radio" id="elem_fred" name="elem" type="radio" value="2"/>
70
+ <label for="elem_fred">Fred</label>
71
+ </span>
72
+ <span class="elem">
73
+ <input class="elem_radio" id="elem_wilma" name="elem" type="radio" value="3"/>
74
+ <label for="elem_wilma">Wilma</label>
75
+ </span>
76
+ </fieldset>\n|
77
+ assert_equal expected, elem.to_html
78
+
79
+ elem.disabled = true
80
+ elem.legend = true
81
+ elem.value = 2
82
+ expected = %|<fieldset class="elem_radio_group disabled" id="elem">
83
+ <legend>Elem</legend>
84
+ <span class="elem">
85
+ <input class="elem_radio" disabled="disabled" id="elem_barney" name="elem" type="radio" value="1"/>
86
+ <label for="elem_barney">Barney</label>
87
+ </span>
88
+ <span class="elem">
89
+ <input checked="checked" class="elem_radio" disabled="disabled" id="elem_fred" name="elem" type="radio" value="2"/>
90
+ <label for="elem_fred">Fred</label>
91
+ </span>
92
+ <span class="elem">
93
+ <input class="elem_radio" disabled="disabled" id="elem_wilma" name="elem" type="radio" value="3"/>
94
+ <label for="elem_wilma">Wilma</label>
95
+ </span>
96
+ </fieldset>\n|
97
+ assert_equal expected, elem.to_html
98
+ end
99
+
100
+ def test_element_to_html_in_columns
101
+ elem = ActiveForm::Element::RadioGroup.new :elem, :columns => 2, :options => ('a'..'c'), :value => 'b'
102
+ expected = %|<fieldset class="elem_radio_group" id="elem">
103
+ <div class="column column-1">
104
+ <span class="elem">
105
+ <input class="elem_radio" id="elem_a" name="elem" type="radio" value="a"/>
106
+ <label for="elem_a">a</label>
107
+ </span>
108
+ <span class="elem">
109
+ <input checked="checked" class="elem_radio" id="elem_b" name="elem" type="radio" value="b"/>
110
+ <label for="elem_b">b</label>
111
+ </span>
112
+ </div>
113
+ <div class="column column-2">
114
+ <span class="elem">
115
+ <input class="elem_radio" id="elem_c" name="elem" type="radio" value="c"/>
116
+ <label for="elem_c">c</label>
117
+ </span>
118
+ </div>
119
+ </fieldset>\n|
120
+ assert_equal expected, elem.to_html
121
+
122
+ elem.render_empty = true
123
+ expected = %|<fieldset class="elem_radio_group" id="elem">
124
+ <div class="column column-1">
125
+ <span class="elem">
126
+ <input class="elem_radio" id="elem_a" name="elem" type="radio" value="a"/>
127
+ <label for="elem_a">a</label>
128
+ </span>
129
+ <span class="elem">
130
+ <input checked="checked" class="elem_radio" id="elem_b" name="elem" type="radio" value="b"/>
131
+ <label for="elem_b">b</label>
132
+ </span>
133
+ </div>
134
+ <div class="column column-2">
135
+ <span class="elem">
136
+ <input class="elem_radio" id="elem_c" name="elem" type="radio" value="c"/>
137
+ <label for="elem_c">c</label>
138
+ </span>
139
+ <span class="empty-elem">
140
+ </span>
141
+ </div>
142
+ </fieldset>\n|
143
+ assert_equal expected, elem.to_html
144
+ end
145
+
146
+ def test_element_to_html_options_group
147
+ elem = ActiveForm::Element::RadioGroup.new :elem, :value => 'Wilma', :legend => true do |e|
148
+ e.option_group 'People' do |og|
149
+ og.option 'Barney'
150
+ og.option 'Fred'
151
+ og.option 'Wilma'
152
+ end
153
+ e.option_group('Animals', ['Dino', 'Pluto'])
154
+ e.option_group('Cartoons', [['Simpsons', 'si'], ['Cow&Chicken', 'cc']])
155
+ end
156
+ expected = %|<fieldset class="elem_radio_group" id="elem">
157
+ <legend>Elem</legend>
158
+ <fieldset class="options">
159
+ <legend>People</legend>
160
+ <span class="elem">
161
+ <input class="elem_radio" id="elem_barney" name="elem" type="radio" value="Barney"/>
162
+ <label for="elem_barney">Barney</label>
163
+ </span>
164
+ <span class="elem">
165
+ <input class="elem_radio" id="elem_fred" name="elem" type="radio" value="Fred"/>
166
+ <label for="elem_fred">Fred</label>
167
+ </span>
168
+ <span class="elem">
169
+ <input checked="checked" class="elem_radio" id="elem_wilma" name="elem" type="radio" value="Wilma"/>
170
+ <label for="elem_wilma">Wilma</label>
171
+ </span>
172
+ </fieldset>
173
+ <fieldset class="options">
174
+ <legend>Animals</legend>
175
+ <span class="elem">
176
+ <input class="elem_radio" id="elem_dino" name="elem" type="radio" value="Dino"/>
177
+ <label for="elem_dino">Dino</label>
178
+ </span>
179
+ <span class="elem">
180
+ <input class="elem_radio" id="elem_pluto" name="elem" type="radio" value="Pluto"/>
181
+ <label for="elem_pluto">Pluto</label>
182
+ </span>
183
+ </fieldset>
184
+ <fieldset class="options">
185
+ <legend>Cartoons</legend>
186
+ <span class="elem">
187
+ <input class="elem_radio" id="elem_simpsons" name="elem" type="radio" value="si"/>
188
+ <label for="elem_simpsons">Simpsons</label>
189
+ </span>
190
+ <span class="elem">
191
+ <input class="elem_radio" id="elem_cow_chicken" name="elem" type="radio" value="cc"/>
192
+ <label for="elem_cow_chicken">Cow&amp;Chicken</label>
193
+ </span>
194
+ </fieldset>
195
+ </fieldset>\n|
196
+ assert_equal expected, elem.to_html
197
+ end
198
+
199
+ def test_render_within_form
200
+ form = ActiveForm::compose :myform do |f|
201
+ f.radio_group_element :person, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
202
+ end
203
+ expected = %|<form action="#myform" class="active_form" id="myform" method="post">
204
+ <fieldset class="elem_radio_group" id="myform_person">
205
+ <span class="elem">
206
+ <input class="elem_radio" id="myform_person_1" name="myform[person]" type="radio" value="1"/>
207
+ <label for="myform_person_1">Barney</label>
208
+ </span>
209
+ <span class="elem">
210
+ <input class="elem_radio" id="myform_person_2" name="myform[person]" type="radio" value="2"/>
211
+ <label for="myform_person_2">Fred</label>
212
+ </span>
213
+ <span class="elem">
214
+ <input class="elem_radio" id="myform_person_3" name="myform[person]" type="radio" value="3"/>
215
+ <label for="myform_person_3">Wilma</label>
216
+ </span>
217
+ </fieldset>
218
+ </form>\n|
219
+ end
220
+
221
+ def test_render_frozen
222
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :frozen => true
223
+ assert_equal "<span class=\"blank\">-</span>\n", elem.to_html
224
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :selected => 2, :frozen => true
225
+ assert_equal 'Fred', elem.to_html
226
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :values => [2, 3], :frozen => true
227
+ assert_equal 'Fred', elem.to_html
228
+ end
229
+
230
+ def test_reset_options
231
+ elem = ActiveForm::Element::RadioGroup.new :elem, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :add_empty => true
232
+ assert_equal ["--", "Barney", "Fred", "Wilma"], elem.options.collect(&:label)
233
+ elem.reset_options!
234
+ assert_equal [], elem.options.collect(&:label)
235
+ end
236
+
237
+ def test_set_initial_value
238
+ values = { :person => 2 }
239
+ form = ActiveForm::compose :myform, :values => values do |f|
240
+ f.radio_group_element :person, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
241
+ end
242
+ assert_equal 2, form[:person].value
243
+ assert_equal 2, form[:person].export_value
244
+ form.values = { :person => 3 }
245
+ assert_equal 3, form[:person].value
246
+ assert_equal 3, form[:person].export_value
247
+ expected = { "person" => 3 }
248
+ assert_equal expected, form.export_values
249
+ end
250
+
251
+ def test_export_value
252
+ form = ActiveForm::compose :myform do |f|
253
+ f.radio_group_element :person, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
254
+ end
255
+ form[:person].selected = 3
256
+ expected = { "person" => 3 }
257
+ assert_equal expected, form.export_values
258
+ end
259
+
260
+ def test_update_from_params
261
+ form = ActiveForm::compose :myform do |f|
262
+ f.radio_group_element :person, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ]
263
+ end
264
+ params = { :myform => { :person => 3 } }
265
+ form.update_from_params(params)
266
+ expected = { "person" => 3 }
267
+ assert_equal expected, form.export_values
268
+ end
269
+
270
+ def test_required_validation
271
+ form = ActiveForm::compose :myform do |f|
272
+ f.radio_group_element :people, :options => [ ['Barney', 1], ['Fred', 2], ["Wilma", 3] ], :required => true
273
+ end
274
+ assert form[:people].blank?
275
+ assert !form.validate
276
+ assert_equal ["required"], form[:people].errors.collect(&:code)
277
+ form[:people].value = 2
278
+ assert form.validate
279
+ form[:people].value = 7
280
+ assert form[:people].blank?
281
+ assert !form.validate
282
+ end
283
+
284
+ def test_option_count_validation
285
+ # remember: you can't have multiple values for radio group
286
+ form = ActiveForm::compose :myform do |f|
287
+ f.radio_group_element :alpha, :options => ('a'..'z'), :required => true
288
+ end
289
+ assert !form.validate
290
+ assert_equal ["required"], form[:alpha].errors.collect(&:code)
291
+ assert_equal ["Alpha: can't be blank"], form[:alpha].errors.collect(&:msg)
292
+ form[:alpha].value = 'a'
293
+ assert form.validate
294
+
295
+ form = ActiveForm::compose :myform do |f|
296
+ f.radio_group_element :alpha, :options => ('a'..'z'), :required => 1
297
+ end
298
+ assert !form.validate
299
+ assert_equal ["required"], form[:alpha].errors.collect(&:code)
300
+ assert_equal ["Alpha: you need to select 1 items"], form[:alpha].errors.collect(&:msg)
301
+ form[:alpha].value = 'a'
302
+ assert form.validate
303
+ end
304
+
305
+ def test_select_first
306
+ form = ActiveForm::compose :myform do |f|
307
+ f.radio_group_element :alpha, :options => ('a'..'z'), :select_first => true
308
+ end
309
+ assert_equal 'a', form[:alpha].value
310
+ end
311
+
312
+ end