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,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,159 @@
1
+ require 'test_helper'
2
+
3
+ ActiveForm::Element::Base::create :sample_input do
4
+
5
+ def render_element(builder = create_builder)
6
+ builder.input(element_attributes)
7
+ builder.input(element_attributes)
8
+ builder.input(element_attributes)
9
+ end
10
+
11
+ end
12
+
13
+ ActiveForm::Element::modify :sample_input do
14
+
15
+ def render_element(builder = create_builder)
16
+ builder.textarea(formatted_value, element_attributes)
17
+ end
18
+
19
+ end
20
+
21
+ class TestBaseElement < Test::Unit::TestCase
22
+
23
+ def test_standard_attributes
24
+ assert ActiveForm::Element::Base.element_attribute_names.include?(:title)
25
+ assert ActiveForm::Element::Base.element_attribute_names.include?(:lang)
26
+ elem = ActiveForm::Element::Base.new :elem
27
+ assert elem.respond_to?(:title=)
28
+ assert elem.respond_to?(:style=)
29
+ assert elem.respond_to?(:class=)
30
+ assert elem.respond_to?(:lang=)
31
+ assert_equal Hash.new, elem.attributes
32
+ expected = {"name"=>"elem", "class"=>"elem_base", "id"=>"elem"}
33
+ assert_equal expected, elem.element_attributes
34
+ end
35
+
36
+ def test_set_standard_attributes
37
+ elem = ActiveForm::Element::Base.new :elem, :title => 'My Element', :lang => 'nl-nl', :unknown => 'will be skipped'
38
+ expected = {"title"=>"My Element", "lang"=>"nl-nl"}
39
+ assert_equal expected, elem.attributes
40
+ expected = {"name"=>"elem", "class"=>"elem_base", "title"=>"My Element", "id"=>"elem", "lang"=>"nl-nl"}
41
+ assert_equal expected, elem.element_attributes
42
+ end
43
+
44
+ def test_set_custom_attributes
45
+ elem = ActiveForm::Element::Base.new :elem, :unknown => 'will be skipped'
46
+ expected = {}
47
+ assert_equal expected, elem.attributes
48
+ elem.attributes[:custom] = 'attribute'
49
+ expected = {"custom"=>"attribute"}
50
+ assert_equal expected, elem.attributes
51
+ end
52
+
53
+ def test_standard_option_flags
54
+ elem = ActiveForm::Element::Base.new :elem
55
+ [:frozen, :hidden, :disabled, :readonly, :required].each do |method|
56
+ assert ActiveForm::Element::Base.element_option_flag_names.include?(method)
57
+ assert elem.respond_to?("#{method}")
58
+ assert elem.respond_to?("#{method}=")
59
+ assert elem.respond_to?("#{method}?")
60
+ end
61
+ end
62
+
63
+ def test_option_flags_in_css_class
64
+ elem = ActiveForm::Element::Base.new :elem, :frozen => true, :hidden => true, :disabled => true, :readonly => true, :required => true
65
+ elem.css_class += "special"
66
+ assert_equal "elem_base special", elem.css_class.to_s
67
+ assert_equal "frozen hidden disabled readonly required", elem.runtime_css_class.to_s
68
+ assert_equal "elem_base special frozen hidden disabled readonly required", elem.css
69
+ end
70
+
71
+ def test_option_flags_in_css_style
72
+ elem = ActiveForm::Element::Base.new :elem, :frozen => true, :hidden => true, :disabled => true, :required => true
73
+ assert_equal "", elem.css_style.to_s
74
+ assert_equal "display: none", elem.style
75
+ assert_equal elem.runtime_css_style.to_s, elem.style
76
+ end
77
+
78
+ def test_label_css
79
+ elem = ActiveForm::Element::Base.new :elem, :hidden => true
80
+ assert_equal "hidden", elem.label_css
81
+ elem = ActiveForm::Element::Base.new :elem, :hidden => true, :required => true
82
+ assert_equal "hidden required", elem.label_css
83
+ [:frozen, :readonly, :disabled].each do |flag|
84
+ elem = ActiveForm::Element::Base.new :elem, flag => true
85
+ assert_equal "inactive", elem.label_css
86
+ end
87
+ end
88
+
89
+ def test_frozen_flag_inheritance
90
+ form = ActiveForm::compose :form
91
+ elem = form.text_element :elem
92
+ section = form.section :section, :frozen => true
93
+ nested = section.text_element :nested
94
+ assert !form.frozen?; assert !elem.frozen?; assert section.frozen?; assert nested.frozen?
95
+ elem.frozen = true
96
+ assert !form.frozen?; assert elem.frozen?; assert section.frozen?; assert nested.frozen?
97
+ elem.frozen = false
98
+ assert !form.frozen?; assert !elem.frozen?; assert section.frozen?; assert nested.frozen?
99
+ form.frozen = true
100
+ assert form.frozen?; assert elem.frozen?; assert section.frozen?; assert nested.frozen?
101
+ end
102
+
103
+ def test_render_label
104
+ elem = ActiveForm::Element::Base.new :elem, :label => 'My Element'
105
+ assert elem.labelled?
106
+ assert_equal %|<label for="elem">My Element</label>\n|, elem.render_label
107
+ elem.hidden = true
108
+ assert_equal %|<label class="hidden" for="elem">My Element</label>\n|, elem.render_label
109
+ elem.hidden = false; elem.required = true; elem.frozen = true
110
+ assert_equal %|<label class="inactive required" for="elem">My Element</label>\n|, elem.render_label
111
+ end
112
+
113
+ def test_frozen_element
114
+ elem = ActiveForm::Element::Base.new :elem, :frozen => true
115
+ assert elem.frozen?
116
+ assert_equal "elem_base", elem.css_class.to_s
117
+ assert_equal "frozen", elem.runtime_css_class.to_s
118
+ assert_equal "elem_base frozen", elem.css
119
+ assert_equal %|<label class="inactive" for="elem">Elem</label>\n|, elem.render_label
120
+ elem.frozen = false
121
+ assert !elem.frozen?
122
+ assert_equal "elem_base", elem.css
123
+ assert_equal %|<label for="elem">Elem</label>\n|, elem.render_label
124
+ end
125
+
126
+ def test_render_input
127
+ elem = ActiveForm::Element::Base.new :elem
128
+ assert_equal elem.render_element, elem.render_input
129
+ elem = ActiveForm::Element::Base.new :elem, :frozen => true
130
+ assert elem.frozen?
131
+ assert_equal elem.render_frozen, elem.render_input
132
+ end
133
+
134
+ def test_element_to_html
135
+ elem = ActiveForm::Element::Base.new :elem
136
+ expected = %|<span class="elem_base" id="elem">Elem</span>\n|
137
+ assert_equal expected, elem.to_html
138
+ end
139
+
140
+ def test_to_label
141
+ elem = ActiveForm::Element::Base.new :elem, :label => 'My Element'
142
+ assert_equal elem.render_label, elem.to_label
143
+ end
144
+
145
+ def test_to_input
146
+ elem = ActiveForm::Element::Base.new :elem
147
+ assert_equal elem.render_element, elem.to_input
148
+ elem = ActiveForm::Element::Base.new :elem, :frozen => true
149
+ assert elem.frozen?
150
+ assert_equal elem.render_frozen, elem.to_input
151
+ end
152
+
153
+ def test_modified_element_class_definition
154
+ elem = ActiveForm::Element::SampleInput.new :elem, :value => 'Some text...'
155
+ expected = %|<textarea class="elem_sample_input" id="elem" name="elem">Some text...</textarea>\n|
156
+ assert_equal expected, elem.to_html
157
+ end
158
+
159
+ end
@@ -0,0 +1,81 @@
1
+ require 'test_helper'
2
+
3
+ ActiveForm::Element::Builder::create :some_snippet do |builder, elem|
4
+
5
+ builder.h1('A preset element')
6
+ builder.p('Just an example of what you can do...')
7
+
8
+ end
9
+
10
+ class TestBuilderElement < Test::Unit::TestCase
11
+
12
+ def test_element_to_html
13
+ elem = ActiveForm::Element::Builder.new :elem, :html => 'raw html string'
14
+ assert_equal %|raw html string\n|, elem.to_html
15
+
16
+ elem = ActiveForm::Element::Builder.new :elem do |builder, e|
17
+ builder.div('built with block')
18
+ end
19
+ assert_equal %|<div>built with block</div>\n|, elem.to_html
20
+
21
+ elem = ActiveForm::Element::Builder.new :elem, :html => 'raw html string and builder block' do |builder, e|
22
+ builder.div(e.value)
23
+ end
24
+ assert_equal %|<div>raw html string and builder block</div>\n|, elem.to_html
25
+ end
26
+
27
+ def test_build_html
28
+ form = ActiveForm::compose :form do |f|
29
+ f.html :named do |builder, e|
30
+ builder.h1('My Pretty form')
31
+ builder.dl {
32
+ e.container.get_elements_of_type(:text).each do |e|
33
+ builder.dt(e.label)
34
+ builder.dd(e.value)
35
+ end
36
+ }
37
+ end
38
+ f.text_element :name
39
+ f.text_element :city
40
+ f.html { |builder, e| builder.hr }
41
+ end
42
+ form.values = { :name => 'Fred', :city => 'Bedrock' }
43
+ expected = %|<form action="#form" class="active_form" id="form" method="post">
44
+ <h1>My Pretty form</h1>
45
+ <dl>
46
+ <dt>Name</dt>
47
+ <dd>Fred</dd>
48
+ <dt>City</dt>
49
+ <dd>Bedrock</dd>
50
+ </dl>
51
+ <input class="elem_text" id="form_name" name="form[name]" size="30" type="text" value="Fred"/>
52
+ <input class="elem_text" id="form_city" name="form[city]" size="30" type="text" value="Bedrock"/>
53
+ <hr/>
54
+ </form>\n|
55
+ assert_equal expected, form.to_html
56
+ end
57
+
58
+ def test_add_raw_string
59
+ form = ActiveForm::compose :form
60
+ form << '<h1>My Form</h1>'
61
+ form.text_element :name
62
+ form << '<hr />'
63
+ expected = %|<form action="#form" class="active_form" id="form" method="post">
64
+ <h1>My Form</h1>
65
+ <input class="elem_text" id="form_name" name="form[name]" size="30" type="text"/>
66
+ <hr />
67
+ </form>\n|
68
+ assert_equal expected, form.to_html
69
+ end
70
+
71
+ def test_add_predefined_html_snippet_element
72
+ form = ActiveForm::compose :form
73
+ form.some_snippet_element
74
+ expected = %|<form action="#form" class="active_form" id="form" method="post">
75
+ <h1>A preset element</h1>
76
+ <p>Just an example of what you can do...</p>
77
+ </form>\n|
78
+ assert_equal expected, form.to_html
79
+ end
80
+
81
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ class TestButtonElement < Test::Unit::TestCase
4
+
5
+ def test_element_to_html
6
+ elem = ActiveForm::Element::Button.new :elem, :label => 'Do it!'
7
+ assert !elem.labelled?
8
+ expected = %|<input class="elem_button" id="elem" name="elem" type="button" value="Do it!"/>\n|
9
+ assert_equal expected, elem.to_html
10
+ end
11
+
12
+ end
@@ -0,0 +1,233 @@
1
+ require 'test_helper'
2
+
3
+ class TestCheckboxElement < Test::Unit::TestCase
4
+
5
+ def test_standard_values
6
+ elem = ActiveForm::Element::Checkbox.new :elem
7
+ assert_equal nil, elem.fallback_value
8
+ assert_equal 1, elem.checked_value
9
+ assert_equal nil, elem.export_value
10
+ elem.checked = true
11
+ assert_equal 1, elem.export_value
12
+ expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="1"/>\n|
13
+ assert_equal expected, elem.to_html
14
+ end
15
+
16
+ def test_element_to_html
17
+ elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
18
+ assert !elem.checked?
19
+ assert_equal nil, elem.value
20
+ expected = %|<input class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
21
+ assert_equal expected, elem.to_html
22
+
23
+ elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes', :checked => true
24
+ assert elem.checked?
25
+ assert_equal 'yes', elem.value
26
+ expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
27
+ assert_equal expected, elem.to_html
28
+ end
29
+
30
+ def test_set_options
31
+ elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
32
+ assert !elem.checked?
33
+ expected = %|<input class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
34
+ assert_equal expected, elem.to_html
35
+
36
+ elem.value = 'yes'
37
+ assert elem.checked?
38
+ expected = %|<input checked="checked" class="elem_checkbox" id="elem" name="elem" type="checkbox" value="yes"/>\n|
39
+ assert_equal expected, elem.to_html
40
+ end
41
+
42
+ def test_unknown_value
43
+ elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
44
+ elem.value = 'unknown'
45
+ assert !elem.checked?
46
+ assert_equal nil, elem.element_value
47
+
48
+ elem.value = 'yes'
49
+ assert elem.checked?
50
+ assert_equal 'yes', elem.element_value
51
+
52
+ elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
53
+ elem.value = 'unknown'
54
+ assert !elem.checked?
55
+ assert_equal 'no', elem.element_value
56
+
57
+ elem.value = 'yes'
58
+ assert elem.checked?
59
+ assert_equal 'yes', elem.element_value
60
+ end
61
+
62
+ def test_set_checked
63
+ elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no'], :checked => true
64
+ assert elem.checked?
65
+ assert_equal 'yes', elem.checked_value
66
+ assert_equal 'no', elem.fallback_value
67
+ assert_equal 'yes', elem.export_value
68
+ assert_equal 'yes', elem.element_value
69
+
70
+ elem.checked = false
71
+ assert !elem.checked?
72
+ assert_equal 'yes', elem.checked_value
73
+ assert_equal 'no', elem.fallback_value
74
+ assert_equal 'no', elem.export_value
75
+ assert_equal 'no', elem.element_value
76
+
77
+ elem.checked = true
78
+ assert elem.checked?
79
+ assert_equal 'yes', elem.checked_value
80
+ assert_equal 'no', elem.fallback_value
81
+ assert_equal 'yes', elem.export_value
82
+ assert_equal 'yes', elem.element_value
83
+ end
84
+
85
+ def test_on_off_value
86
+ elem = ActiveForm::Element::Checkbox.new :elem, :options => ['yes', 'no']
87
+ assert !elem.checked?
88
+ assert_equal 'yes', elem.checked_value
89
+ assert_equal 'no', elem.fallback_value
90
+ assert_equal 'no', elem.export_value
91
+ assert_equal 'no', elem.element_value
92
+
93
+ elem.update_from_params('yes')
94
+ assert elem.checked?
95
+ assert_equal 'yes', elem.element_value
96
+
97
+ elem.update_from_params('no')
98
+ assert !elem.checked?
99
+ assert_equal 'no', elem.element_value
100
+
101
+ elem.update_from_params(nil)
102
+ assert !elem.checked?
103
+ assert_equal 'no', elem.element_value
104
+ end
105
+
106
+ def test_update_from_params
107
+ form = ActiveForm::compose :myform do |f|
108
+ f.text_element :first_name
109
+ f.text_element :last_name
110
+ f.checkbox_element :confirm, :options => ['yes', 'no'], :value => 'yes'
111
+ f.submit_element :send
112
+ end
113
+ assert form[:confirm].checked?
114
+
115
+ params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'yes' } }
116
+ form.update_from_params(params)
117
+ assert form[:confirm].checked?
118
+
119
+ params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'no' } }
120
+ form.update_from_params(params)
121
+ assert !form[:confirm].checked?
122
+ form[:confirm].checked = true
123
+
124
+ params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => nil } }
125
+ form.update_from_params(params)
126
+ assert !form[:confirm].checked?
127
+ form[:confirm].checked = true
128
+
129
+ params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => nil } }
130
+ form.update_from_params(params)
131
+ assert !form[:confirm].checked?
132
+ form[:confirm].checked = true
133
+
134
+ params = { :myform => { :first_name => 'Fred', :last_name => 'Flintstone' } }
135
+ form.update_from_params(params)
136
+ assert !form[:confirm].checked?
137
+ end
138
+
139
+ def test_if_checked
140
+ elem = ActiveForm::Element::Checkbox.new :elem, :option => 'yes'
141
+ assert_equal 'yes', elem.checked_value
142
+ assert_equal nil, elem.fallback_value
143
+ assert_equal nil, elem.export_value
144
+ assert_equal nil, elem.element_value
145
+ assert !elem.active?
146
+ assert !elem.checked?
147
+ assert !elem.selected?
148
+
149
+ elem.update_from_params('yes')
150
+ assert elem.active?
151
+ assert elem.checked?
152
+ assert elem.selected?
153
+ assert_equal 'yes', elem.element_value
154
+
155
+ elem.update_from_params('no')
156
+ assert !elem.checked?
157
+ assert_equal nil, elem.element_value
158
+
159
+ elem.update_from_params(nil)
160
+ assert !elem.checked?
161
+ assert_equal nil, elem.element_value
162
+ end
163
+
164
+ def test_required_validation
165
+ form = ActiveForm::compose :myform do |f|
166
+ f.text_element :first_name
167
+ f.text_element :last_name
168
+ f.checkbox_element :confirm, :options => ['yes', 'no'], :required => true
169
+ f.submit_element :send
170
+ end
171
+
172
+ assert_equal 0, form[:confirm].element_errors.length
173
+ assert_equal '', form[:confirm].validation_advice
174
+
175
+ validator = form[:confirm].validators.detect { |v| v.code == 'required' }
176
+ assert_kind_of ActiveForm::Validator::Proc, validator
177
+ assert !form.validate
178
+ expected = %|<div class="validation-advice advice-confirm" id="advice-validate-confirm-myform_confirm">Confirm: validation failed</div>\n|
179
+ assert_equal expected, form[:confirm].validation_advice
180
+
181
+ form[:confirm].value = 'no'
182
+ assert !form.validate
183
+ assert_equal expected, form[:confirm].validation_advice
184
+
185
+ form[:confirm].value = 'yes'
186
+ assert form.validate
187
+ assert_equal '', form[:confirm].validation_advice
188
+
189
+ form[:confirm].required_message = 'you need to confirm this'
190
+ assert_equal 'you need to confirm this', validator.message
191
+
192
+ form[:confirm].required = false
193
+ validator = form[:confirm].validators.detect { |v| v.code == 'required' }
194
+ assert_equal nil, validator
195
+ end
196
+
197
+ def test_set_values_beforehand
198
+ person = { :first_name => 'Fred', :last_name => 'Flintstone', :confirm => 'yes' }
199
+
200
+ form = ActiveForm::compose :myform, :values => person do |f|
201
+ f.text_element :first_name, :required => true
202
+ f.text_element :last_name, :required => true
203
+ f.checkbox_element :confirm, :options => ['yes', 'no'], :required => true
204
+ f.submit_element :send
205
+ end
206
+
207
+ assert form[:confirm].checked?
208
+ expected = %|<input checked="checked" class="elem_checkbox required" id="myform_confirm" name="myform[confirm]" type="checkbox" value="yes"/>\n|
209
+ assert_equal expected, form[:confirm].to_html
210
+ end
211
+
212
+ def test_add_multiple_radio_elements
213
+ form = ActiveForm::compose :myform do |f|
214
+ f.checkbox_element :elem_a, :option => 'A', :group => :choice
215
+ f.checkbox_element :elem_b, :option => 'B', :group => :choice, :checked => true
216
+ end
217
+ assert !form[:elem_a].checked?
218
+ assert form[:elem_b].checked?
219
+
220
+ assert_equal 'A', form[:elem_a].checked_value
221
+ assert_equal 'B', form[:elem_b].checked_value
222
+
223
+ assert_equal 'myform[choice][]', form[:elem_a].element_name
224
+ assert_equal 'myform[choice][]', form[:elem_b].element_name
225
+
226
+ assert_equal 'myform_elem_a', form[:elem_a].identifier
227
+ assert_equal 'myform_elem_b', form[:elem_b].identifier
228
+
229
+ expected = { "choice" => ["B"] }
230
+ assert_equal expected, form.export_values
231
+ end
232
+
233
+ end