active_form 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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