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
File without changes
@@ -0,0 +1,14 @@
1
+ class Book < ActiveRecord::Base
2
+
3
+ validates_presence_of :title, :isbn
4
+ validates_format_of :isbn, :with => /(\d[- ]?){9,9}([0-9xX])/
5
+
6
+ has_and_belongs_to_many :authors
7
+ belongs_to :publisher
8
+
9
+ belongs_to :categorization
10
+ has_many :categories, :through => :categorizations
11
+
12
+ acts_as_dropdown
13
+
14
+ end
@@ -0,0 +1,8 @@
1
+ awdr:
2
+ id: 1
3
+ title: Agile Web Development with Rails
4
+ isbn: 0-9766940-0-X
5
+ publication_date: 2005-08-01
6
+ publisher_id: 1
7
+ created_at: <%= 5.minutes.ago.to_s :db %>
8
+ updated_at: <%= 5.minutes.ago.to_s :db %>
File without changes
@@ -0,0 +1,2 @@
1
+ class Categorization < ActiveRecord::Base
2
+ end
File without changes
@@ -0,0 +1,8 @@
1
+ class Category < ActiveRecord::Base
2
+
3
+ belongs_to :categorization
4
+ has_many :books, :through => :categorization
5
+
6
+ acts_as_dropdown
7
+
8
+ end
@@ -0,0 +1,5 @@
1
+ class Publisher < ActiveRecord::Base
2
+
3
+ acts_as_dropdown
4
+
5
+ end
@@ -0,0 +1,10 @@
1
+ pragprog:
2
+ id: 1
3
+ name: The Pragmatic Programmers
4
+ created_at: <%= 5.minutes.ago.to_s :db %>
5
+ updated_at: <%= 5.minutes.ago.to_s :db %>
6
+ oreilly:
7
+ id: 2
8
+ name: O'Reilly
9
+ created_at: <%= 5.minutes.ago.to_s :db %>
10
+ updated_at: <%= 5.minutes.ago.to_s :db %>
@@ -0,0 +1,43 @@
1
+ ActiveRecord::Schema.define(:version => 1) do
2
+
3
+ create_table "authors", :force => true do |t|
4
+ t.column "first_name", :string
5
+ t.column "last_name", :string
6
+ t.column "birth_date", :date
7
+ t.column "created_at", :datetime
8
+ t.column "updated_at", :datetime
9
+ end
10
+
11
+ create_table "authors_books", :force => true do |t|
12
+ t.column "author_id", :integer
13
+ t.column "book_id", :integer
14
+ end
15
+
16
+ create_table "books", :force => true do |t|
17
+ t.column "title", :string
18
+ t.column "isbn", :string
19
+ t.column "publication_date", :date
20
+ t.column "publisher_id", :integer, :default => 1
21
+ t.column "created_at", :datetime
22
+ t.column "updated_at", :datetime
23
+ end
24
+
25
+ create_table "categories", :force => true do |t|
26
+ t.column "name", :string, :limit => 64
27
+ t.column "description", :string
28
+ end
29
+
30
+ create_table "categorizations", :force => true do |t|
31
+ t.column "category_id", :integer
32
+ t.column "book_id", :integer
33
+ t.column "created_at", :datetime
34
+ t.column "updated_at", :datetime
35
+ end
36
+
37
+ create_table "publishers", :force => true do |t|
38
+ t.column "name", :string
39
+ t.column "created_at", :datetime
40
+ t.column "updated_at", :datetime
41
+ end
42
+
43
+ end
@@ -0,0 +1,121 @@
1
+ require 'test_helper'
2
+
3
+ class TestModelAutoDefinition < Test::Unit::TestCase
4
+
5
+ fixtures :authors, :books, :categories, :categorizations, :publishers
6
+
7
+ def test_model_instance_attribute
8
+ book = books(:awdr)
9
+ form = ActiveForm::Model::build(book)
10
+ assert form.respond_to?(:model_instance)
11
+ assert form.respond_to?(:model_instance=)
12
+ assert_equal book, form.model_instance
13
+ end
14
+
15
+ def test_form_name_from_model
16
+ form = ActiveForm::Model::build(Book.new)
17
+ assert_equal :book_form, form.name
18
+ end
19
+
20
+ def test_form_name_from_args
21
+ form = ActiveForm::Model::build(Book.new, :myform)
22
+ assert_equal :myform, form.name
23
+ end
24
+
25
+ def test_new_record_values
26
+ form = ActiveForm::Model::build(Book.new)
27
+ assert_equal '', form[:title].export_value
28
+ assert_equal '', form[:isbn].export_value
29
+ assert_kind_of Date, form[:publication_date].export_value
30
+ assert_equal 1, form[:publisher_id].export_value
31
+ assert_kind_of Time, form[:created_at].export_value
32
+ assert_kind_of Time, form[:updated_at].export_value
33
+ end
34
+
35
+ def test_date_defaults_to_now
36
+ form = ActiveForm::Model::build(Book.new)
37
+ now_date = Date.today.to_s
38
+ assert_equal now_date, form[:publication_date].export_value.to_s
39
+ end
40
+
41
+ def test_time_defaults_to_now
42
+ form = ActiveForm::Model::build(Book.new)
43
+ now_time = Time.now.to_s.gsub(/(\d\d:\d\d):(\d\d)/, '\1:00')
44
+ assert_equal now_time, form[:created_at].export_value.to_s
45
+ assert_equal now_time, form[:updated_at].export_value.to_s
46
+ end
47
+
48
+ def test_override_time_defaults
49
+ current_time = Time.local(2004, 1, 1, 13, 15, 5)
50
+ current_time_string = current_time.to_s.gsub(/(\d\d:\d\d):(\d\d)/, '\1:00')
51
+ assert_equal "Thu Jan 01 13:15:00 +0100 2004", current_time_string
52
+ book = Book.new(:created_at => current_time)
53
+ form = ActiveForm::Model::build(book)
54
+ assert_equal current_time_string, form[:created_at].export_value.to_s
55
+ end
56
+
57
+ def test_difference_between_two_build_methods
58
+ form = ActiveForm::Model::build(Book.new)
59
+ assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :created_at, :updated_at], form.collect(&:name)
60
+ form = ActiveForm::Model::build!(Book.new)
61
+ assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :created_at, :updated_at, :submit], form.collect(&:name)
62
+ end
63
+
64
+ def test_form_elements_for_new_book
65
+ form = ActiveForm::Model::build(Book.new)
66
+ assert_kind_of ActiveForm::Definition, form
67
+ form.submit_element
68
+ assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :created_at, :updated_at, :submit], form.collect(&:name)
69
+ assert_equal ["Id", "Title", "Isbn", "Publication date", "Publisher", "Created at", "Updated at", "Submit"], form.collect(&:label)
70
+ assert_equal [:hidden, :text, :text, :select_date, :select_from_model, :select_datetime, :select_datetime, :submit], form.collect(&:element_type)
71
+ assert_equal [:integer, :string, :string, :date, :integer, :time, :time, nil], form.collect(&:type_cast)
72
+ end
73
+
74
+ def test_form_elements_for_new_author
75
+ form = ActiveForm::Model::build(Author.new)
76
+ form.submit_element
77
+ assert_equal [:id, :first_name, :last_name, :birth_date, :created_at, :updated_at, :submit], form.collect(&:name)
78
+ assert_equal ["Id", "First name", "Last name", "Birth date", "Created at", "Updated at", "Submit"], form.collect(&:label)
79
+ assert_equal [:hidden, :text, :text, :select_date, :select_datetime, :select_datetime, :submit], form.collect(&:element_type)
80
+ assert_equal [:integer, :string, :string, :date, :time, :time, nil], form.collect(&:type_cast)
81
+ end
82
+
83
+ def test_form_elements_for_book
84
+ form = ActiveForm::Model::build(books(:awdr))
85
+ assert_equal 1, form[:id].export_value
86
+ assert_equal 'Agile Web Development with Rails', form[:title].export_value
87
+ assert_equal '0-9766940-0-X', form[:isbn].export_value
88
+ assert_equal '2005-08-01', form[:publication_date].export_value.to_s
89
+ assert_equal 1, form[:publisher_id].export_value
90
+ end
91
+
92
+ def test_validate_form_with_ar_validations
93
+ form = ActiveForm::Model::build(Book.new)
94
+ assert !form.validate
95
+ assert_equal ["ar_blank", "ar_blank", "ar_invalid"], form.all_errors.collect(&:code)
96
+ assert_equal ["Title: can't be blank", "Isbn: can't be blank", "Isbn: is invalid"], form.all_errors.collect(&:message)
97
+ assert_equal ["Title: can't be blank", "Isbn: can't be blank"], form.initial_errors.collect(&:message)
98
+ assert_equal 1, form[:title].errors.length
99
+ assert_equal 2, form[:isbn].errors.length
100
+ end
101
+
102
+ def test_localization_of_ar_error_messages
103
+ translations = {
104
+ 'book_form_title_label' => 'Titel',
105
+ 'book_form_title_validates_ar_blank' => 'Geef een titel op',
106
+ 'book_form_isbn_label' => 'ISBN nummer',
107
+ 'book_form_isbn_validates_ar_blank' => 'Geef het ISBN nummer',
108
+ 'book_form_isbn_validates_ar_invalid' => 'Onjuist ISBN nummer formaat'
109
+ }
110
+ form = ActiveForm::Model::build(Book.new)
111
+ form.define_localizer { |formname, elemname, key| translations[ [formname, elemname, key].compact.join('_') ] }
112
+ assert !form.validate
113
+ expected = ["Geef een titel op", "Geef het ISBN nummer", "Onjuist ISBN nummer formaat"]
114
+ assert_equal expected, form.all_errors.collect(&:message)
115
+ end
116
+
117
+ def test_aggregations
118
+
119
+ end
120
+
121
+ end
@@ -0,0 +1,61 @@
1
+ require 'test_helper'
2
+
3
+ class TestModelLoader < Test::Unit::TestCase
4
+
5
+ fixtures :authors, :books, :categories, :categorizations, :publishers
6
+
7
+ def setup
8
+ ActiveForm::Definition.load_paths << File.join(File.dirname(__FILE__), '..', 'resources', 'models')
9
+ end
10
+
11
+ def test_load_model_form
12
+ form = ActiveForm::Model::load!(Book.new)
13
+ assert_kind_of ActiveForm::BookForm, form
14
+ assert_equal [:id, :title, :isbn, :publication_date, :publisher_id, :submit], form.collect(&:name)
15
+ assert_equal [:integer, :string, :string, :date, :integer, nil], form.collect(&:type_cast)
16
+ assert_equal [:day, :month, :year], form[:publication_date].collect(&:name)
17
+ assert_equal "", form[:title].value
18
+ assert_equal 1, form[:publisher_id].value
19
+ end
20
+
21
+ def test_load_model_for_record
22
+ form = ActiveForm::Model::load(books(:awdr))
23
+ assert_kind_of ActiveForm::BookForm, form
24
+ assert_equal 1, form[:id].export_value
25
+ assert_equal 'Agile Web Development with Rails', form[:title].export_value
26
+ assert_equal '0-9766940-0-X', form[:isbn].export_value
27
+ assert_equal '2005-08-01', form[:publication_date].export_value.to_s
28
+ assert_equal 1, form[:publisher_id].export_value
29
+ end
30
+
31
+ def test_load_specific_form
32
+ form = ActiveForm::Model::load(:register, publishers(:pragprog))
33
+ assert_kind_of ActiveForm::RegisterPublisherForm, form
34
+ assert_equal [:id, :name], form.collect(&:name)
35
+ assert_equal 1, form[:id].export_value
36
+ assert_equal 'The Pragmatic Programmers', form[:name].export_value
37
+ end
38
+
39
+ def test_difference_between_two_load_methods
40
+ form = ActiveForm::Model::load(publishers(:pragprog))
41
+ assert_equal [:id, :name, :created_at, :updated_at], form.collect(&:name)
42
+ form = ActiveForm::Model::load!(publishers(:pragprog))
43
+ assert_equal [:id, :name, :created_at, :updated_at, :submit], form.collect(&:name)
44
+ end
45
+
46
+ def test_validate_form_with_ar_validations
47
+ form = ActiveForm::Model::load(Book.new)
48
+ assert_kind_of ActiveForm::BookForm, form
49
+ assert !form.validate
50
+ assert_equal ["ar_blank", "ar_blank", "ar_invalid"], form.all_errors.collect(&:code)
51
+ assert_equal ["Title: can't be blank", "Isbn: can't be blank", "Isbn: is invalid"], form.all_errors.collect(&:message)
52
+ assert_equal ["Title: can't be blank", "Isbn: can't be blank"], form.initial_errors.collect(&:message)
53
+ assert_equal 1, form[:title].errors.length
54
+ assert_equal 2, form[:isbn].errors.length
55
+ end
56
+
57
+ def teardown
58
+ ActiveForm::Definition.load_paths.clear
59
+ end
60
+
61
+ end
@@ -0,0 +1,11 @@
1
+ ActiveForm::Element::Base::create :chunky do
2
+
3
+ def render_element(builder = create_builder)
4
+ builder.h1('Chunky Bacon!', element_attributes)
5
+ end
6
+
7
+ def default_attributes
8
+ { :id => identifier, :class => css }
9
+ end
10
+
11
+ end
@@ -0,0 +1,5 @@
1
+ ActiveForm::Definition::create :demo do |f|
2
+ f.text_element :firstname
3
+ f.text_element :lastname
4
+ f.submit_element
5
+ end
@@ -0,0 +1,8 @@
1
+ ActiveForm::Definition::create :book do |f|
2
+
3
+ f.text_element :title
4
+ f.text_element :isbn
5
+ f.select_date_element :publication_date, :format => [:day, :month, :year], :range => (2005..2010)
6
+ f.select_from_model_element :publisher_id
7
+
8
+ end
@@ -0,0 +1,5 @@
1
+ ActiveForm::Definition::create :register_publisher do |f|
2
+
3
+ f.text_element :name
4
+
5
+ end
@@ -0,0 +1,6 @@
1
+ ActiveForm::Element::Section::create :demo do |s|
2
+
3
+ s.text_element :firstname
4
+ s.text_element :lastname
5
+
6
+ end
@@ -0,0 +1,6 @@
1
+ ActiveForm::Element::Section::create :foo do |s|
2
+
3
+ s.text_element :title
4
+ s.textarea_element :body
5
+
6
+ end
@@ -0,0 +1,9 @@
1
+ ActiveForm::Validator::Base.create :foo do
2
+
3
+ default_message "%s: should be foo-matic!"
4
+
5
+ def validate
6
+ element.errors << advice[code] unless value =~ /^(foo|bar|baz|qux)+$/
7
+ end
8
+
9
+ end
@@ -0,0 +1,13 @@
1
+ ActiveForm::Widget::create :custom do |w|
2
+
3
+ w.text_element :firstname, :title => 'First Name'
4
+ w.text_element :lastname, :title => 'Last Name'
5
+
6
+ def w.render_element(builder = create_builder)
7
+ builder.table {
8
+ builder.tr { builder.td { label_for_firstname(builder) }; builder.td { label_for_lastname(builder) } }
9
+ builder.tr { builder.td { html_for_firstname(builder) }; builder.td { html_for_lastname(builder) } }
10
+ }
11
+ end
12
+
13
+ end
@@ -0,0 +1,1050 @@
1
+ require 'test_helper'
2
+
3
+ class TestActiveForm < Test::Unit::TestCase
4
+
5
+ def test_common_stub_instance_methods
6
+ assert ActiveForm::Definition.instance_methods.include?('to_html')
7
+ assert ActiveForm::Element::Base.instance_methods.include?('to_html')
8
+ assert ActiveForm::Element::Section.instance_methods.include?('to_html')
9
+ end
10
+
11
+ def test_element_module_loading
12
+ assert ActiveForm::Element::load(:text)
13
+ assert ActiveForm::Element::load(:section)
14
+ assert_raises(ActiveForm::Element::NotFoundException) do
15
+ ActiveForm::Element::load(:unknown)
16
+ end
17
+ assert ActiveForm::Element::loaded?(:text)
18
+ assert ActiveForm::Element::loaded?(:section)
19
+ assert !ActiveForm::Element::loaded?(:unknown)
20
+ end
21
+
22
+ def test_element_module_create
23
+ assert_kind_of ActiveForm::Element::Text, ActiveForm::Element::build(:text, :test_element)
24
+ assert_kind_of ActiveForm::Element::Section, ActiveForm::Element::build(:section, :test_element)
25
+ assert_nil ActiveForm::Element::build(:unknown, :test_element)
26
+ end
27
+
28
+ def test_element_module_type_existence
29
+ assert ActiveForm::Element::exists?(:text)
30
+ assert ActiveForm::Element::exists?(:section)
31
+ assert !ActiveForm::Element::exists?(:unknown)
32
+ end
33
+
34
+ def test_is_element_by_module
35
+ assert ActiveForm::Element::element?(ActiveForm::Element::Text)
36
+ assert ActiveForm::Element::element?(ActiveForm::Element::Section)
37
+ assert ActiveForm::Element::element?(ActiveForm::Definition)
38
+ assert !ActiveForm::Element::element?(ActiveForm)
39
+ end
40
+
41
+ def test_is_element_by_class
42
+ assert ActiveForm::Definition.element?
43
+ assert ActiveForm::compose(:form).element?
44
+ assert ActiveForm::Element::Base.element?
45
+ assert ActiveForm::Element::Base.new(:element).element?
46
+ assert ActiveForm::Element::Section.element?
47
+ assert ActiveForm::Element::Section.new(:section).element?
48
+ end
49
+
50
+ def test_is_container
51
+ assert ActiveForm::Definition.container?
52
+ assert ActiveForm::compose(:test_form).container?
53
+ assert !ActiveForm::Element::Base.container?
54
+ assert !ActiveForm::Element::Base.new(:test_element).container?
55
+ assert ActiveForm::Element::Section.container?
56
+ assert ActiveForm::Element::Section.new(:test_group).container?
57
+ end
58
+
59
+ def test_element_name
60
+ form = ActiveForm::compose :test_form
61
+ assert_equal :test_form, form.name
62
+ section = ActiveForm::Element::Section.new :test_group
63
+ assert_equal :test_group, section.name
64
+ elem = ActiveForm::Element::Base.new :test_element
65
+ assert_equal :test_element, elem.name
66
+ end
67
+
68
+ def test_element_type
69
+ form = ActiveForm::compose :test_form
70
+ assert_equal :form, form.element_type
71
+ section = ActiveForm::Element::Section.new :test_group
72
+ assert_equal :section, section.element_type
73
+ elem = ActiveForm::Element::Base.new :test_element
74
+ assert_equal :base, elem.element_type
75
+ elem = ActiveForm::Element::Text.new :test_element
76
+ assert_equal :text, elem.element_type
77
+ end
78
+
79
+ def test_container_reference
80
+ form = ActiveForm::compose :test_form
81
+ assert_equal nil, form.container
82
+ assert !form.contained?
83
+ elem = ActiveForm::Element::Base.new form, :element
84
+ assert_equal form, elem.container
85
+ assert elem.contained?
86
+ section = ActiveForm::Element::Section.new form, :element
87
+ assert_equal form, section.container
88
+ assert section.contained?
89
+ end
90
+
91
+ def test_standalone_identifier
92
+ form = ActiveForm::compose :test_form
93
+ assert_equal "test_form", form.identifier
94
+ section = ActiveForm::Element::Section.new :test_section
95
+ assert_equal "test_section", section.identifier
96
+ elem = ActiveForm::Element::Base.new :test_element
97
+ assert_equal "test_element", elem.identifier
98
+ end
99
+
100
+ def test_nested_identifier
101
+ form = ActiveForm::compose :form
102
+ assert_equal "form", form.identifier
103
+ section = ActiveForm::Element::Section.new(form, :section)
104
+ assert_equal "form_section", section.identifier
105
+ elem = ActiveForm::Element::Base.new(form, :element)
106
+ assert_equal "form_element", elem.identifier
107
+ end
108
+
109
+ def test_nested_section_identifier
110
+ form = ActiveForm::compose :form
111
+ assert_equal "form", form.identifier
112
+ section = ActiveForm::Element::Section.new(form, :section_a)
113
+ assert_equal "form_section_a", section.identifier
114
+ elem_a = ActiveForm::Element::Base.new(section, :element_a)
115
+ assert_equal "form_section_a_element_a", elem_a.identifier
116
+ elem_b = ActiveForm::Element::Base.new(section, :element_b)
117
+ assert_equal "form_section_a_element_b", elem_b.identifier
118
+ end
119
+
120
+ def test_nested_definition_identifier
121
+ form_a = ActiveForm::compose :form_a
122
+ assert_equal "form_a", form_a.identifier
123
+ form_b = ActiveForm::compose form_a, :form_b
124
+ assert_equal "form_a_form_b", form_b.identifier
125
+ form_c = ActiveForm::compose form_b, :form_c
126
+ assert_equal "form_a_form_b_form_c", form_c.identifier
127
+ elem = ActiveForm::Element::Base.new(form_c, :element)
128
+ assert_equal "form_a_form_b_form_c_element", elem.identifier
129
+ end
130
+
131
+ def test_nested_section_identifier
132
+ form = ActiveForm::compose :form
133
+ assert_equal "form", form.identifier
134
+ section_a = ActiveForm::Element::Section.new(form, :section_a)
135
+ assert_equal "form_section_a", section_a.identifier
136
+ section_b = ActiveForm::Element::Section.new(section_a, :section_b)
137
+ assert_equal "form_section_a_section_b", section_b.identifier
138
+ section_c = ActiveForm::Element::Section.new(section_b, :section_c)
139
+ assert_equal "form_section_a_section_b_section_c", section_c.identifier
140
+ elem = ActiveForm::Element::Base.new(section_c, :element)
141
+ assert_equal "form_section_a_section_b_section_c_element", elem.identifier
142
+ end
143
+
144
+ def test_nested_section_name
145
+ form = ActiveForm::compose :form
146
+ assert_equal "form", form.element_name
147
+ section = ActiveForm::Element::Section.new(form, :section_a)
148
+ assert_equal "form[section_a]", section.element_name
149
+ elem_a = ActiveForm::Element::Base.new(section, :element_a)
150
+ assert_equal "form[section_a][element_a]", elem_a.element_name
151
+ elem_b = ActiveForm::Element::Base.new(section, :element_b)
152
+ assert_equal "form[section_a][element_b]", elem_b.element_name
153
+ end
154
+
155
+ def test_nested_definition_name
156
+ form_a = ActiveForm::compose :form_a
157
+ assert_equal "form_a", form_a.element_name
158
+ form_b = ActiveForm::compose form_a, :form_b
159
+ assert_equal "form_a[form_b]", form_b.element_name
160
+ form_c = ActiveForm::compose form_b, :form_c
161
+ assert_equal "form_a[form_b][form_c]", form_c.element_name
162
+ elem = ActiveForm::Element::Base.new(form_c, :element)
163
+ assert_equal "form_a[form_b][form_c][element]", elem.element_name
164
+ end
165
+
166
+ def test_nested_section_name
167
+ form = ActiveForm::compose :form
168
+ assert_equal "form", form.element_name
169
+ section_a = ActiveForm::Element::Section.new(form, :section_a)
170
+ assert_equal "form[section_a]", section_a.element_name
171
+ section_b = ActiveForm::Element::Section.new(section_a, :section_b)
172
+ assert_equal "form[section_a][section_b]", section_b.element_name
173
+ section_c = ActiveForm::Element::Section.new(section_b, :section_c)
174
+ assert_equal "form[section_a][section_b][section_c]", section_c.element_name
175
+ elem = ActiveForm::Element::Base.new(section_c, :element)
176
+ assert_equal "form[section_a][section_b][section_c][element]", elem.element_name
177
+ end
178
+
179
+ def test_default_element_label
180
+ form = ActiveForm::compose :form do |f|
181
+ f.text_element :element_a
182
+ f.text_element :element_b, :label => 'B-label'
183
+ f.text_element :element_c
184
+ f.section :section_a do |s|
185
+ s.text_element :element_d
186
+ s.text_element :element_e
187
+ end
188
+ end
189
+ assert_equal 'Element A', form[:element_a].label
190
+ assert_equal 'B-label', form[:element_b].label
191
+ assert_equal 'Element D', form[:section_a][:element_d].label
192
+ assert_equal 'form[section_a][element_d]', form[:section_a][:element_d].element_name
193
+ end
194
+
195
+ def test_set_elements
196
+ elem_a = ActiveForm::Element::build(:text, :element_a)
197
+ elem_b = ActiveForm::Element::build(:text, :element_b)
198
+ elem_c = ActiveForm::Element::build(:text, :element_c)
199
+ form = ActiveForm::compose :form
200
+ form.elements = [elem_a, elem_b, elem_c]
201
+ assert_equal [:element_a, :element_b, :element_c], form.element_names
202
+ end
203
+
204
+ def test_insert_one_loose_element
205
+ form = ActiveForm::compose :form
206
+ elem_a = ActiveForm::Element::build(:text, :element_a)
207
+ assert form.insert_element(elem_a)
208
+ elem_b = ActiveForm::Element::build(:text, :element_b)
209
+ assert form.insert_element(elem_b)
210
+ assert_equal [:element_a, :element_b], form.element_names
211
+ elem_c = ActiveForm::Element::build(:text, :element_c)
212
+ elem_d = ActiveForm::Element::build(:text, :element_d)
213
+ assert form << elem_c << elem_d
214
+ assert_equal [:element_a, :element_b, :element_c, :element_d], form.element_names
215
+ end
216
+
217
+ def test_insert_multiple_loose_elements
218
+ elem_a = ActiveForm::Element::build(:text, :element_a)
219
+ elem_b = ActiveForm::Element::build(:text, :element_b)
220
+ elem_c = ActiveForm::Element::build(:text, :element_c)
221
+ form = ActiveForm::compose :form
222
+ form.insert_elements(elem_a, elem_b, elem_c)
223
+ assert_equal [:element_a, :element_b, :element_c], form.element_names
224
+ form = ActiveForm::compose :form
225
+ form.insert_elements([elem_a, elem_b, elem_c])
226
+ assert_equal [:element_a, :element_b, :element_c], form.element_names
227
+ end
228
+
229
+ def test_insert_one_element_at
230
+ elem_a = ActiveForm::Element::build(:text, :element_a)
231
+ elem_b = ActiveForm::Element::build(:text, :element_b)
232
+ elem_c = ActiveForm::Element::build(:text, :element_c)
233
+ elem_d = ActiveForm::Element::build(:text, :element_d)
234
+ form = ActiveForm::compose :form
235
+ form.insert_element(elem_a, 0)
236
+ form.insert_element(elem_b, 0)
237
+ form.insert_element(elem_c, 0)
238
+ assert_equal [:element_c, :element_b, :element_a], form.element_names
239
+ form = ActiveForm::compose :form
240
+ form.insert_element(elem_a)
241
+ form.insert_element(elem_b)
242
+ form.insert_element(elem_c, 0)
243
+ assert_equal [:element_c, :element_a, :element_b], form.element_names
244
+ form.insert_element(elem_d, 2)
245
+ assert_equal [:element_c, :element_a, :element_d, :element_b], form.element_names
246
+ end
247
+
248
+ def test_insert_multiple_elements_at
249
+ elem_a = ActiveForm::Element::build(:text, :element_a)
250
+ elem_b = ActiveForm::Element::build(:text, :element_b)
251
+ elem_c = ActiveForm::Element::build(:text, :element_c)
252
+ elem_d = ActiveForm::Element::build(:text, :element_d)
253
+ form = ActiveForm::compose :form
254
+ form.insert_elements(elem_a, elem_b)
255
+ form.insert_elements(elem_c, elem_d, 1)
256
+ assert_equal [:element_a, :element_c, :element_d, :element_b], form.element_names
257
+ end
258
+
259
+ # define element methods:
260
+
261
+ def test_define_element
262
+ form = ActiveForm::compose :form
263
+ assert form.define_element(:text, :element_a)
264
+ assert_equal 1, form.elements.length
265
+ assert_equal :element_a, form.elements.last.name
266
+ assert form.element_names.include?(:element_a)
267
+ assert form.define_element(:text, :element_b)
268
+ assert_equal 2, form.elements.length
269
+ assert_equal :element_b, form.elements.last.name
270
+ assert form.element_names.include?(:element_b)
271
+ end
272
+
273
+ def test_define_element_at
274
+ form = ActiveForm::compose :form
275
+ assert form.define_element_at(0, :text, :element_a)
276
+ assert form.define_element_at(0, :text, :element_b)
277
+ assert form.define_element_at(1, :text, :element_c)
278
+ assert form.define_element_at(2, :text, :element_d)
279
+ assert_equal [:element_b, :element_c, :element_d, :element_a], form.element_names
280
+ end
281
+
282
+ def test_define_element_at_top
283
+ form = ActiveForm::compose :form
284
+ assert form.define_element_at_top(:text, :element_a)
285
+ assert form.define_element_at_top(:text, :element_b)
286
+ assert form.define_element_at_top(:text, :element_c)
287
+ assert_equal [:element_c, :element_b, :element_a], form.element_names
288
+ end
289
+
290
+ def test_define_element_at_bottom
291
+ form = ActiveForm::compose :form
292
+ assert form.define_element_at_bottom(:text, :element_a)
293
+ assert form.define_element_at_bottom(:text, :element_b)
294
+ assert form.define_element_at_bottom(:text, :element_c)
295
+ assert_equal [:element_a, :element_b, :element_c], form.element_names
296
+ end
297
+
298
+ def test_define_element_using_syntactic_sugar
299
+ form = ActiveForm::compose :form
300
+ form.text_element :element_a, :label => 'a text element'
301
+ form.hidden_element :element_b, :label => 'a hidden element'
302
+ form.password_element :element_c, :label => 'a password element'
303
+ assert_equal [:element_a, :element_b, :element_c], form.elements.collect(&:name)
304
+ assert_equal [:text, :hidden, :password], form.elements.collect(&:element_type)
305
+ assert_equal ['a text element', 'a hidden element', 'a password element'], form.elements.collect(&:label)
306
+ end
307
+
308
+ def test_define_element_initialize_with_options_and_attributes
309
+ form = ActiveForm::compose :form
310
+ form.text_element :element_a, :label => 'test label', :css_style => 'color: red', :css_class => 'special'
311
+ assert_equal 'test label', form.elements.first.label
312
+ assert_equal 'color: red', form.elements.first.css_style.to_s
313
+ assert_equal 'special', form.elements.first.css_class.to_s
314
+ end
315
+
316
+ def test_define_element_with_block
317
+ form = ActiveForm::compose :form
318
+ form.define_element :text, :element_a do |e|
319
+ e.css_class << 'special'
320
+ e.css_style = 'color: red'
321
+ end
322
+ expected = { "type" => "text", "name"=>"form[element_a]", "class"=>"elem_text special", "id"=>"form_element_a", "style"=>"color: red", "value"=>"", "size"=>30 }
323
+ assert_equal expected, form[:element_a].element_attributes
324
+ end
325
+
326
+ def test_update_attributes_and_options_on_sample_element
327
+ form = ActiveForm::compose :form
328
+ elem = form.extended_sample_element :element_a, :label => 'test label', :css_style => 'color: red', :css_class => 'special', :flipped => true
329
+ assert elem.flipped?
330
+ assert_equal 'test label', form.elements.first.label
331
+ assert_equal 'special', form.elements.first.css_class.to_s
332
+ elem.update :label => 'changed label', :css_class => 'other', :flipped => false, :flopped => true
333
+ assert !elem.flipped?
334
+ assert elem.flopped?
335
+ assert_equal 'changed label', form.elements.first.label
336
+ assert_equal 'other', form.elements.first.css_class.to_s
337
+ end
338
+
339
+ def test_update_attributes_and_options_on_text_element
340
+ form = ActiveForm::compose :form
341
+ elem = form.text_element :element_a, :label => 'test label', :css_style => 'color: red', :css_class => 'special'
342
+ assert_equal 'test label', form.elements.first.label
343
+ assert_equal 'special', form.elements.first.css_class.to_s
344
+ elem.update :label => 'changed label', :css_class => 'other'
345
+ assert_equal 'changed label', form.elements.first.label
346
+ assert_equal 'other', form.elements.first.css_class.to_s
347
+ end
348
+
349
+ def test_update_all_elements
350
+ form = ActiveForm::compose :form do |f|
351
+ f.text_element :element_a, :label => 'one', :description => 'this is the first'
352
+ f.text_element :element_b, :label => 'two', :description => 'this is the second'
353
+ f.text_element :element_c, :label => 'three', :description => 'this is the third'
354
+ end
355
+ assert_equal ['one', 'two', 'three'], form.elements.collect(&:label)
356
+ assert_equal ['this is the first', 'this is the second', 'this is the third'], form.elements.collect(&:description)
357
+ form.update_elements(:description => nil)
358
+ assert_equal [nil, nil, nil], form.elements.collect(&:description)
359
+ form.update_elements(:label => 'new', :css_class => 'marked')
360
+ assert_equal ['new', 'new', 'new'], form.elements.collect(&:label)
361
+ assert_equal ['marked', 'marked', 'marked'], form.elements.collect { |e| e.css_class.to_s }
362
+ end
363
+
364
+ def test_update_some_elements
365
+ form = ActiveForm::compose :form do |f|
366
+ f.text_element :element_a, :label => 'one'
367
+ f.text_element :element_b, :label => 'two'
368
+ f.text_element :element_c, :label => 'three'
369
+ end
370
+ assert_equal ['one', 'two', 'three'], form.elements.collect(&:label)
371
+ form.update_elements(:element_a, :element_c, :label => 'new')
372
+ assert_equal ['new', 'two', 'new'], form.elements.collect(&:label)
373
+ form.update_elements(:element_b, :element_c, :css_class => 'marked')
374
+ assert_equal ['elem_text', 'marked', 'marked'], form.elements.collect { |e| e.css_class.to_s }
375
+ end
376
+
377
+ def test_index_of_element
378
+ form = ActiveForm::compose :form
379
+ form.define_element(:text, :element_a)
380
+ form.define_element(:text, :element_b)
381
+ form.define_element(:text, :element_c)
382
+ assert_equal 0, form.index_of_element(:element_a)
383
+ assert_equal 1, form.index_of_element(:element_b)
384
+ assert_equal 2, form.index_of_element(:element_c)
385
+ end
386
+
387
+ def test_get_element_by_index
388
+ form = ActiveForm::compose :form
389
+ elem_a = form.define_element(:text, :element_a)
390
+ elem_b = form.define_element(:text, :element_b)
391
+ elem_c = form.define_element(:text, :element_c)
392
+ assert_equal elem_a, form.get_element_by_index(0)
393
+ assert_equal elem_b, form.get_element_by_index(1)
394
+ assert_equal elem_c, form.get_element_by_index(2)
395
+ end
396
+
397
+ def test_if_container_element_exists
398
+ form = ActiveForm::compose :form
399
+ form.define_element(:text, :element_a)
400
+ form.define_element(:text, :element_b)
401
+ assert form.element_exists?(:element_a)
402
+ assert form.element_exists?(:element_b)
403
+ assert !form.element_exists?(:unknown)
404
+ end
405
+
406
+ def test_reset_elements
407
+ form = ActiveForm::compose :form
408
+ form.define_element(:text, :element_a)
409
+ form.define_element(:text, :element_b)
410
+ assert_equal [:element_a, :element_b], form.element_names
411
+ assert_equal 2, form.elements.length
412
+ assert_equal 2, form.name_to_index_lookup.length
413
+ form.reset_elements!
414
+ assert_equal [], form.element_names
415
+ assert_equal 0, form.elements.length
416
+ assert_equal 0, form.name_to_index_lookup.length
417
+ end
418
+
419
+ def test_name_to_index_lookup_assignment_fails
420
+ form = ActiveForm::compose :form
421
+ assert_raises(NoMethodError) { form.name_to_index_lookup = Hash.new }
422
+ end
423
+
424
+ def test_container_set_and_replace_element
425
+ form = ActiveForm::compose :form
426
+ elem_a = form.define_element(:text, :element_a)
427
+ elem_b = form.define_element(:text, :element_b)
428
+ assert_equal [elem_a, elem_b], form.elements
429
+ good_replacement = ActiveForm::Element::build(:section, :element_b)
430
+ assert form.set_element(:element_b, good_replacement)
431
+ assert_equal [elem_a, good_replacement], form.elements
432
+ new_replacement = ActiveForm::Element::build(:text, :element_a)
433
+ form[:element_a] = new_replacement
434
+ assert_equal [new_replacement, good_replacement], form.elements
435
+ bad_replacement = ActiveForm::Element::build(:section, :element_c)
436
+ assert_raises(ActiveForm::Element::MismatchException) { form.set_element(:element_b, bad_replacement) }
437
+ end
438
+
439
+ def test_container_get_element
440
+ form = ActiveForm::compose :form
441
+ elem_a = form.define_element(:text, :element_a)
442
+ elem_b = form.define_element(:text, :element_b)
443
+ elem_c = form.define_element(:text, :element_c)
444
+ assert_equal elem_a, form.get_element(:element_a)
445
+ assert_equal elem_b, form.get_element(:element_b)
446
+ assert_equal elem_c, form.get_element(:element_c)
447
+ end
448
+
449
+ def test_container_get_element_with_hash_syntax
450
+ form = ActiveForm::compose :form
451
+ elem_a = form.define_element(:text, :element_a)
452
+ elem_b = form.define_element(:text, :element_b)
453
+ elem_c = form.define_element(:text, :element_c)
454
+ assert_equal elem_a, form[:element_a]
455
+ assert_equal elem_b, form[:element_b]
456
+ assert_equal elem_c, form[:element_c]
457
+ end
458
+
459
+ def test_container_get_element_at
460
+ form = ActiveForm::compose :form
461
+ elem_a = form.define_element(:text, :element_a)
462
+ elem_b = form.define_element(:text, :element_b)
463
+ elem_c = form.define_element(:text, :element_c)
464
+ assert_equal elem_a, form.element_at(0)
465
+ assert_equal elem_b, form.element_at(1)
466
+ assert_equal elem_c, form.element_at(2)
467
+ end
468
+
469
+ def test_container_remove_element
470
+ form = ActiveForm::compose :form do |f|
471
+ f.define_element(:text, :element_a)
472
+ f.define_element(:text, :element_b)
473
+ f.define_element(:text, :element_c)
474
+ f.define_element(:text, :element_d)
475
+ end
476
+ assert_equal [:element_a, :element_b, :element_c, :element_d], form.collect(&:name)
477
+ expected = {:element_a=>0, :element_c=>2, :element_b=>1, :element_d=>3}
478
+ assert_equal expected, form.name_to_index_lookup
479
+ assert form.remove_element(:element_b)
480
+ assert_equal [:element_a, :element_c, :element_d], form.collect(&:name)
481
+ expected = {:element_a=>0, :element_c=>1, :element_d=>2}
482
+ assert form.remove_elements(:element_a, :element_d)
483
+ assert_equal [:element_c], form.collect(&:name)
484
+ expected = {:element_c=>0}
485
+ end
486
+
487
+ def test_container_remove_element_at
488
+ form = ActiveForm::compose :form do |f|
489
+ f.define_element(:text, :element_a)
490
+ f.define_element(:text, :element_b)
491
+ f.define_element(:text, :element_c)
492
+ f.define_element(:text, :element_d)
493
+ end
494
+ assert_equal [:element_a, :element_b, :element_c, :element_d], form.collect(&:name)
495
+ expected = {:element_a=>0, :element_c=>2, :element_b=>1, :element_d=>3}
496
+ assert_equal expected, form.name_to_index_lookup
497
+ assert form.remove_element_at(1)
498
+ assert_equal [:element_a, :element_c, :element_d], form.collect(&:name)
499
+ expected = {:element_a=>0, :element_c=>1, :element_d=>2}
500
+ assert form.remove_elements_at(0, 2)
501
+ assert_equal [:element_c], form.collect(&:name)
502
+ expected = {:element_c=>0}
503
+ end
504
+
505
+ def test_container_remove_elements_of_type
506
+ form = ActiveForm::compose :form do |f|
507
+ f.define_element(:text, :element_a)
508
+ f.define_element(:password, :element_b)
509
+ f.define_element(:textarea, :element_c)
510
+ f.define_element(:submit, :element_d)
511
+ end
512
+ assert_equal [:element_a, :element_b, :element_c, :element_d], form.collect(&:name)
513
+ form.remove_elements_of_type(:text)
514
+ assert_equal [:element_b, :element_c, :element_d], form.collect(&:name)
515
+ form.remove_elements_of_type(:submit, :textarea)
516
+ assert_equal [:element_b], form.collect(&:name)
517
+ end
518
+
519
+ # value handling
520
+
521
+ def test_unbound_element_value
522
+ elem = ActiveForm::Element::build(:text, :elem_a)
523
+ elem.element_value = 'one'
524
+ assert_equal 'one', elem.element_value
525
+ end
526
+
527
+ def test_bound_element_value
528
+ form = ActiveForm::compose :form
529
+ elem = form.text_element :elem_a
530
+ expected = {"elem_a"=>nil}
531
+ assert_equal expected, form.values
532
+ elem.element_value = 'value'
533
+ expected = { "elem_a" => 'value' }
534
+ assert_equal expected, form.values
535
+ form.values[:elem_a] = 'changed'
536
+ assert_equal 'changed', elem.element_value
537
+ end
538
+
539
+ def test_assign_values
540
+ values = { :elem_b => "two", :elem_a => "one" }
541
+ form = ActiveForm::compose :form, :values => values do |f|
542
+ f.text_element :elem_a
543
+ f.text_element :elem_b
544
+ end
545
+ assert_equal 'one', form[:elem_a].element_value
546
+ assert_equal 'two', form[:elem_b].element_value
547
+
548
+ form[:elem_a].element_value = 'new'
549
+ assert_equal 'new', form[:elem_a].element_value
550
+ values[:elem_b] = 'other'
551
+ assert_equal 'other', form[:elem_b].element_value
552
+ form[:elem_b].element_value = 'changed'
553
+ assert_equal 'changed', values[:elem_b]
554
+ end
555
+
556
+ # formatting and casting
557
+
558
+ def test_define_formatting_filter
559
+ filter = lambda { |value| value.join(' ') }
560
+ elem = ActiveForm::Element::build :text, :elem_a, :formatting_filter => filter
561
+ assert_equal 'a b c', elem.formatting_filter(['a', 'b', 'c'])
562
+ elem = ActiveForm::Element::build :text, :elem_a do |e|
563
+ filter = e.define_formatting_filter { |value| value.join('-') }
564
+ end
565
+ assert_equal 'a-b-c', elem.formatting_filter(['a', 'b', 'c'])
566
+ end
567
+
568
+ def test_define_casting_filter
569
+ filter = lambda { |value| value.split(' ') }
570
+ elem = ActiveForm::Element::build :text, :elem_a, :casting_filter => filter
571
+ assert_equal ['a', 'b', 'c'], elem.casting_filter('a b c')
572
+ elem = ActiveForm::Element::build :text, :elem_a do |e|
573
+ filter = e.define_casting_filter { |value| value.split('-') }
574
+ end
575
+ assert_equal ['a', 'b', 'c'], elem.casting_filter('a-b-c')
576
+ end
577
+
578
+ def test_internal_element_value
579
+ form = ActiveForm::compose :contact_form do |f|
580
+ f.text_element :firstname, :value => %w{ F r e d } do |e|
581
+ e.define_formatting_filter { |value| value.join }
582
+ e.define_casting_filter { |value| value.split('') }
583
+ end
584
+ f.text_element :lastname, :value => 'flintstone' do |e|
585
+ e.define_formatting_filter { |value| value.upcase }
586
+ e.define_casting_filter { |value| value.downcase }
587
+ end
588
+ end
589
+ assert_equal ["F", "r", "e", "d"], form[:firstname].element_value
590
+ assert_equal 'Fred', form[:firstname].formatted_value
591
+ form[:firstname].value = 'Barney'
592
+ assert_equal ["B", "a", "r", "n", "e", "y"], form[:firstname].element_value
593
+ assert_equal 'Barney', form[:firstname].formatted_value
594
+
595
+ assert_equal 'flintstone', form[:lastname].element_value
596
+ assert_equal 'FLINTSTONE', form[:lastname].formatted_value
597
+ form[:lastname].value = 'RUBBLE'
598
+ assert_equal 'rubble', form[:lastname].element_value
599
+ assert_equal 'RUBBLE', form[:lastname].formatted_value
600
+ end
601
+
602
+ def test_nested_value_assignment
603
+ values = ActiveForm::Values.new
604
+ values[:section_a] = {}
605
+ values[:section_a][:section_b] = {}
606
+ values[:section_a][:section_b][:section_c] = {}
607
+ values[:section_a][:section_b][:section_c][:element] = 'test value'
608
+
609
+ form = ActiveForm::compose :form, :values => values do |f|
610
+ f.section :section_a do |ga|
611
+ ga.section :section_b do |gb|
612
+ gb.section :section_c do |gc|
613
+ elem = gc.text_element :element
614
+ end
615
+ end
616
+ end
617
+ end
618
+
619
+ assert_equal :element, form[:section_a][:section_b][:section_c][:element].name
620
+ assert_equal :section_c, form[:section_a][:section_b][:section_c].name
621
+ assert_equal :section_b, form[:section_a][:section_b].name
622
+ assert_equal :section_a, form[:section_a].name
623
+
624
+ assert_equal values[:section_a][:section_b][:section_c][:element], form[:section_a][:section_b][:section_c][:element].element_value
625
+ assert_equal values[:section_a][:section_b][:section_c], form[:section_a][:section_b][:section_c].element_value
626
+ assert_equal values[:section_a][:section_b], form[:section_a][:section_b].element_value
627
+ assert_equal values[:section_a], form[:section_a].element_value
628
+ assert_equal values, form.element_value
629
+
630
+ assert_equal values[:section_a][:section_b][:section_c][:element], form[:section_a][:section_b][:section_c][:element].values
631
+ assert_equal values[:section_a][:section_b][:section_c], form[:section_a][:section_b][:section_c].values
632
+ assert_equal values[:section_a][:section_b], form[:section_a][:section_b].values
633
+ assert_equal values[:section_a], form[:section_a].values
634
+ assert_equal values, form.values
635
+
636
+ values[:section_a][:section_b][:section_c][:element] = 'changed value'
637
+ assert_equal 'changed value', form[:section_a][:section_b][:section_c][:element].element_value
638
+ expected = { "element" => "changed value" }
639
+ assert_equal expected, form[:section_a][:section_b][:section_c].element_value
640
+
641
+ form[:section_a][:section_b][:section_c][:element].element_value = 'new value'
642
+ assert_equal 'new value', form[:section_a][:section_b][:section_c][:element].element_value
643
+ assert_equal 'new value', values[:section_a][:section_b][:section_c][:element]
644
+ expected = { "element" => "new value" }
645
+ assert_equal expected, form[:section_a][:section_b][:section_c].element_value
646
+
647
+ new_values = { "section_c" => { "element" => "other value" } }
648
+ form[:section_a][:section_b].update_values(new_values)
649
+ assert_equal new_values, form[:section_a][:section_b].values
650
+ assert_equal "other value", form[:section_a][:section_b][:section_c][:element].element_value
651
+
652
+ new_values = ActiveForm::Values.new
653
+ new_values[:section_a] = {}
654
+ new_values[:section_a][:section_b] = {}
655
+ new_values[:section_a][:section_b][:section_c] = {}
656
+ new_values[:section_a][:section_b][:section_c][:element] = 'updated value'
657
+
658
+ form.update_values(new_values)
659
+ assert_equal values[:section_a][:section_b][:section_c][:element], form[:section_a][:section_b][:section_c][:element].element_value
660
+
661
+ form.update_values({}, true)
662
+ assert_equal nil, form[:section_a][:section_b][:section_c][:element].element_value
663
+ expected = { "element" => nil }
664
+ assert_equal expected, form[:section_a][:section_b][:section_c].element_value
665
+ expected = { "section_c"=> { "element" => nil } }
666
+ assert_equal expected , form[:section_a][:section_b].element_value
667
+ expected = { "section_b" => { "section_c"=> { "element" => nil } } }
668
+ assert_equal expected, form[:section_a].element_value
669
+ expected = { "section_a" => { "section_b" => { "section_c"=> { "element" => nil } } } }
670
+ assert_equal expected, form.element_value
671
+
672
+ new_values = { "section_c" => { "element" => "other value" } }
673
+ form[:section_a][:section_b].update_values(new_values)
674
+ assert_equal new_values, form[:section_a][:section_b].values
675
+ assert_equal "other value", form[:section_a][:section_b][:section_c][:element].element_value
676
+ end
677
+
678
+ def test_more_nested_tests_one
679
+
680
+ values = ActiveForm::Values.new
681
+
682
+ form = ActiveForm::compose :form, :values => values do |f|
683
+ f.section :section_a do |ga|
684
+ ga.section :section_b do |gb|
685
+ gb.section :section_c do |gc|
686
+ gc.text_element :element do |e|
687
+ e.define_formatting_filter { |value| value.join }
688
+ e.define_casting_filter { |value| value.is_a?(Array) ? value : value.split('') }
689
+ end
690
+ end
691
+ end
692
+ end
693
+ end
694
+
695
+ params = Hash.new
696
+ params[:form] = {}
697
+ params[:form][:section_a] = {}
698
+ params[:form][:section_a][:section_b] = {}
699
+ params[:form][:section_a][:section_b][:section_c] = {}
700
+ params[:form][:section_a][:section_b][:section_c][:element] = 'Fred'
701
+
702
+ form[:section_a][:section_b][:section_c][:element].element_value = ["B", "a", "r", "n", "e", "y"]
703
+
704
+ assert_equal ["B", "a", "r", "n", "e", "y"], form[:section_a][:section_b][:section_c][:element].element_value
705
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["B", "a", "r", "n", "e", "y"]}}}}
706
+ assert_equal expected, form.values
707
+
708
+ form.update_from_params(params)
709
+
710
+ assert_equal ["F", "r", "e", "d"], form[:section_a][:section_b][:section_c][:element].element_value
711
+ assert_equal 'Fred', form[:section_a][:section_b][:section_c][:element].formatted_value
712
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["F", "r", "e", "d"]}}}}
713
+ assert_equal expected, form.values
714
+
715
+ form[:section_a][:section_b][:section_c][:element].element_value = ["B", "a", "r", "n", "e", "y"]
716
+
717
+ assert_equal ["B", "a", "r", "n", "e", "y"], form[:section_a][:section_b][:section_c][:element].element_value
718
+ assert_equal 'Barney', form[:section_a][:section_b][:section_c][:element].formatted_value
719
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["B", "a", "r", "n", "e", "y"]}}}}
720
+ assert_equal expected, form.values
721
+
722
+ params[:form][:section_a][:section_b][:section_c][:element] = 'Betty'
723
+ form.update_from_params(params)
724
+
725
+ assert_equal ["B", "e", "t", "t", "y"], form[:section_a][:section_b][:section_c][:element].element_value
726
+ assert_equal 'Betty', form[:section_a][:section_b][:section_c][:element].formatted_value
727
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["B", "e", "t", "t", "y"]}}}}
728
+ assert_equal expected, form.values
729
+
730
+ form[:section_a][:section_b][:section_c][:element].element_value = 'Wilma'
731
+
732
+ assert_equal ["W", "i", "l", "m", "a"], form[:section_a][:section_b][:section_c][:element].element_value
733
+ assert_equal 'Wilma', form[:section_a][:section_b][:section_c][:element].formatted_value
734
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>["W", "i", "l", "m", "a"]}}}}
735
+ assert_equal expected, form.values
736
+
737
+ form[:section_a][:section_b][:section_c][:element].element_value = ['P', 'e', 'b', 'b', 'l', 'e', 's']
738
+
739
+ ref = form[:section_a][:section_b][:section_c][:element]
740
+
741
+ assert_equal ['P', 'e', 'b', 'b', 'l', 'e', 's'], form[:section_a][:section_b][:section_c][:element].element_value
742
+ assert_equal 'Pebbles', form[:section_a][:section_b][:section_c][:element].formatted_value
743
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>['P', 'e', 'b', 'b', 'l', 'e', 's']}}}}
744
+ assert_equal ['P', 'e', 'b', 'b', 'l', 'e', 's'], ref.element_value
745
+ assert_equal expected, form.values
746
+
747
+ form.params = {"form"=>{"section_a"=>{"section_b"=>{"section_c"=>{"element"=>'Other'}}}}}
748
+ assert_equal 'Other', form[:section_a][:section_b][:section_c][:element].formatted_value
749
+ assert_equal ["O", "t", "h", "e", "r"], form[:section_a][:section_b][:section_c][:element].element_value
750
+ assert_equal ["O", "t", "h", "e", "r"], ref.element_value
751
+ end
752
+
753
+ def test_more_nested_tests
754
+
755
+ values = ActiveForm::Values.new
756
+
757
+ form = ActiveForm::compose :form, :values => values do |f|
758
+ f.section :section_a do |ga|
759
+ ga.section :section_b do |gb|
760
+ gb.section :section_c do |gc|
761
+ gc.text_element :element do |e|
762
+ e.define_formatting_filter { |value| value.to_s }
763
+ e.define_casting_filter { |value| value.to_i }
764
+ end
765
+ end
766
+ end
767
+ end
768
+ end
769
+
770
+ params = Hash.new
771
+ params[:form] = {}
772
+ params[:form][:section_a] = {}
773
+ params[:form][:section_a][:section_b] = {}
774
+ params[:form][:section_a][:section_b][:section_c] = {}
775
+ params[:form][:section_a][:section_b][:section_c][:element] = '123'
776
+
777
+ form[:section_a][:section_b][:section_c][:element].element_value = 456
778
+
779
+ assert_equal 456, form[:section_a][:section_b][:section_c][:element].element_value
780
+ assert_equal '456', form[:section_a][:section_b][:section_c][:element].formatted_value
781
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>456}}}}
782
+ assert_equal expected, form.values
783
+
784
+ form.update_from_params(params)
785
+
786
+ assert_equal 123, form[:section_a][:section_b][:section_c][:element].element_value
787
+ assert_equal '123', form[:section_a][:section_b][:section_c][:element].formatted_value
788
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>123}}}}
789
+ assert_equal expected, form.values
790
+
791
+ form[:section_a][:section_b][:section_c][:element].element_value = '456'
792
+
793
+ expected = {"section_b"=>{"section_c"=>{"element"=>456}}}
794
+ assert_equal expected, form[:section_a].element_value
795
+
796
+ assert_equal 456, form[:section_a][:section_b][:section_c][:element].element_value
797
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>456}}}}
798
+ assert_equal expected, form.values
799
+
800
+ params[:form][:section_a][:section_b][:section_c][:element] = '789'
801
+ form.update_from_params(params)
802
+
803
+ assert_equal 789, form[:section_a][:section_b][:section_c][:element].element_value
804
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>789}}}}
805
+ assert_equal expected, form.values
806
+
807
+ form[:section_a][:section_b][:section_c][:element].element_value = '007'
808
+
809
+ assert_equal 7, form[:section_a][:section_b][:section_c][:element].element_value
810
+ expected = {"section_a"=>{"section_b"=>{"section_c"=>{"element"=>7}}}}
811
+ assert_equal expected, form.values
812
+ end
813
+
814
+ def test_custom_value_object
815
+ obj = CustomValueObject.new
816
+ form = ActiveForm::compose :form, :binding => obj do |f|
817
+ f.text_element :name
818
+ f.text_element :city
819
+ end
820
+
821
+ obj.value['name'] = 'Fred Flintstone'
822
+ obj.value['city'] = 'Bedrock'
823
+
824
+ assert_equal 'Fred Flintstone', form[:name].element_value
825
+ assert_equal 'Bedrock', form[:city].element_value
826
+
827
+ form[:city].element_value = 'Yellowstone'
828
+ assert_equal 'Yellowstone', form[:city].element_value
829
+ assert_equal 'Yellowstone', obj.value['city']
830
+
831
+ form.params = { "form" => { "city" => "Bricktown" } }
832
+ assert_equal 'Bricktown', form[:city].element_value
833
+ assert_equal 'Bricktown', obj.value['city']
834
+ end
835
+
836
+ def test_custom_value_object_binding
837
+ form = ActiveForm::compose :form do |f|
838
+ f.text_element :name
839
+ f.text_element :city
840
+ end
841
+
842
+ obj = form.bind_to(CustomValueObject.new)
843
+ form.params = { "form" => { "name" => "Fred Flintstone", "city" => "Bricktown" } }
844
+
845
+ assert_equal 'Fred Flintstone', form[:name].element_value
846
+ assert_equal 'Fred Flintstone', obj.value['name']
847
+ assert_equal 'Bricktown', form[:city].element_value
848
+ assert_equal 'Bricktown', obj.value['city']
849
+ end
850
+
851
+ def test_default_fallback_value
852
+ form = ActiveForm::compose :form do |f|
853
+ f.text_element :name, :default => 'anonymous'
854
+ f.text_element :language, :default => 'EN', :value => 'NL'
855
+ end
856
+ assert_equal nil, form[:name].value
857
+ assert_equal 'anonymous', form[:name].fallback_value
858
+ assert_equal 'anonymous', form[:name].export_value
859
+ assert_equal 'NL', form[:language].value
860
+ assert_equal 'EN', form[:language].fallback_value
861
+ assert_equal 'NL', form[:language].export_value
862
+ form[:language].value = nil
863
+ assert_equal nil, form[:language].value
864
+ assert_equal 'EN', form[:language].fallback_value
865
+ assert_equal 'EN', form[:language].export_value
866
+ form[:language].value = " "
867
+ assert_equal ' ', form[:language].value
868
+ assert_equal 'EN', form[:language].fallback_value
869
+ assert_equal 'EN', form[:language].export_value
870
+ end
871
+
872
+ def test_export_values_with_default_values
873
+ form = ActiveForm::compose :form do |f|
874
+ f.text_element :name, :default => 'anonymous'
875
+ f.section :details do |s|
876
+ s.text_element :city
877
+ s.text_element :district
878
+ s.text_element :country, :default => 'US'
879
+ s.section :specs do |gg|
880
+ gg.text_element :specification, :default => 'special'
881
+ end
882
+ end
883
+ end
884
+ assert_equal nil, form[:name].value
885
+ assert_equal 'anonymous', form[:name].fallback_value
886
+ assert_equal 'anonymous', form[:name].export_value
887
+
888
+ expected = {"name"=>nil, "details"=>{"city"=>nil, "specs"=>{"specification"=>nil}, "district"=>nil, "country"=>nil}}
889
+ assert_equal expected, form.values
890
+
891
+ expected = {"name"=>"anonymous", "details"=>{"city"=>nil, "specs"=>{"specification"=>"special"}, "district"=>nil, "country"=>"US"}}
892
+ assert_equal expected, form.export_values
893
+
894
+ form[:details][:country].value = 'BE'
895
+ expected = {"name"=>"anonymous", "details"=>{"city"=>nil, "specs"=>{"specification"=>"special"}, "district"=>nil, "country"=>"BE"}}
896
+ assert_equal expected, form.values(true) # equivalent to export_values
897
+
898
+ form[:name].value = 'Fred Flintstone'
899
+ assert_equal 'Fred Flintstone', form[:name].value
900
+ assert_equal 'anonymous', form[:name].fallback_value
901
+ assert_equal 'Fred Flintstone', form[:name].export_value
902
+ end
903
+
904
+ def test_localizer
905
+ translations = {
906
+ 'contact_form_firstname_label' => 'Voornaam',
907
+ 'contact_form_lastname_label' => 'Achternaam',
908
+ 'contact_form_country_label' => 'Land',
909
+ 'contact_form_password_label' => 'Wachtwoord',
910
+ 'contact_form_password_new_label' => 'Nieuw wachtwoord',
911
+ 'contact_form_password_confirm_label' => 'Wachtwoord bevestiging'
912
+ }
913
+ form = ActiveForm::compose :contact_form do |f|
914
+ f.define_localizer { |formname, elemname, key| translations[ [formname, elemname, key].compact.join('_') ] }
915
+ f.text_element :firstname
916
+ f.text_element :lastname
917
+ f.text_element :country
918
+ f.section :password do |s|
919
+ s.password_element :new
920
+ s.password_element :confirm
921
+ end
922
+ end
923
+ assert form.localized?
924
+ assert form[:firstname].localized?
925
+ assert form[:password][:confirm].localized?
926
+ form.elements.each do |e|
927
+ assert_equal translations[e.identifier + '_label'], e.label
928
+ end
929
+ end
930
+
931
+ def test_localizer_fallback
932
+ translations = {
933
+ 'contact_form_firstname_title' => 'Uw voornaam',
934
+ 'contact_form_firstname_label' => 'Voornaam',
935
+ 'contact_form_lastname_label' => 'Achternaam',
936
+ 'contact_form_country_label' => nil
937
+ }
938
+ form = ActiveForm::compose :contact_form do |f|
939
+ f.define_localizer { |formname, elemname, key| translations[ [formname, elemname, key].compact.join('_') ] }
940
+ f.text_element :firstname, :title => 'Your firstname'
941
+ f.text_element :lastname, :title => 'Your familyname'
942
+ f.text_element :country
943
+ f.password_element :password
944
+ end
945
+ assert form.localized?
946
+ assert_equal 'Uw voornaam', form[:firstname].title
947
+ assert_equal 'Voornaam', form[:firstname].label
948
+ assert_equal 'Achternaam', form[:lastname].label
949
+ assert_equal 'Your familyname', form[:lastname].title
950
+ assert_equal 'Country', form[:country].label
951
+ assert_equal 'Password', form[:password].label
952
+ end
953
+
954
+ def test_form_submitted
955
+ form = ActiveForm::compose :form do |f|
956
+ f.text_element :name
957
+ f.text_element :language
958
+ f.submit_element :send
959
+ end
960
+ assert !form.submitted?
961
+ # coming from click on submit button
962
+ form[:send].value = 'Send'
963
+ assert form.submitted?
964
+ end
965
+
966
+ def test_render_individual_element
967
+ form = ActiveForm::compose :form do |f|
968
+ f.text_element :name
969
+ f.text_element :language
970
+ f.submit_element :send
971
+ end
972
+ expected = %|<label for="form_name">Name</label>\n|
973
+ assert_equal expected, form.label_for_name
974
+ expected = %|<input class="elem_text" id="form_name" name="form[name]" size="30" type="text"/>\n|
975
+ assert_equal expected, form.html_for_name
976
+ assert_equal form[:language].to_html, form.html_for_language
977
+ assert_equal form[:send].to_html, form.html_for_send
978
+ end
979
+
980
+ end
981
+
982
+ # class TestHtmlRendering < Test::Unit::TestCase
983
+ #
984
+ # def test_truth
985
+ #
986
+ # form = ActiveForm::compose :form do |f|
987
+ # f.text_element :elem_a
988
+ # f.text_element :elem_b
989
+ # f.section :section, :class => 'specialsection' do |s|
990
+ # g.text_element :elem_a, :style => 'color: red' do |e|
991
+ # e.define_formatting_filter { |value| value.join(', ') }
992
+ # e.define_casting_filter { |value| value.split(/,\s+/) }
993
+ # end
994
+ # g.text_element :elem_b, :class => 'specialelem'
995
+ # g.section :section do |s|
996
+ # g.text_element :elem_a, :disabled => true
997
+ # g.text_element :elem_b, :readonly => true
998
+ # end
999
+ # end
1000
+ # end
1001
+ #
1002
+ # form.define_form :one do |f|
1003
+ # f.text_element :sub_a
1004
+ # f.text_element :sub_b
1005
+ # end
1006
+ #
1007
+ # form.define_form :two do |f|
1008
+ # f.text_element :sub_a
1009
+ # f.text_element :sub_b do |e|
1010
+ # e.onblur = "alert('yes!')"
1011
+ # end
1012
+ # end
1013
+ #
1014
+ # ActiveForm::Definition.define_container_wrapper do |builder, elem, render|
1015
+ # builder.form(elem.element_attributes) {
1016
+ # builder.table(:border => 1) {
1017
+ # builder.thead { builder.tr { builder.th(elem.label, :colspan => 2) } }
1018
+ # builder.tbody { elem.render_elements(builder) }
1019
+ # }
1020
+ # builder << elem.script_tag
1021
+ # }
1022
+ # end
1023
+ #
1024
+ # ActiveForm::Definition.define_element_wrapper do |builder, elem, render|
1025
+ # style = StyleAttribute.new
1026
+ # style << 'margin: 20px'
1027
+ # style << 'display: none' if elem.hidden?
1028
+ # builder.tr { builder.td { builder.table(:border => 1, :style => style, &render) } }
1029
+ # end
1030
+ #
1031
+ # ActiveForm::Element::Base.define_element_wrapper do |builder, elem, render|
1032
+ # builder.tr(:class => 'label') { builder.td(:colspan => 2) { elem.render_label(builder) } }
1033
+ # builder.tr(:id => "elem_#{elem.identifier}", :class => elem.css, :style => elem.style) { builder.td(:class => 'elem', :colspan => 2, &render) }
1034
+ # end
1035
+ #
1036
+ # ActiveForm::Element::Section.define_element_wrapper do |builder, elem, render|
1037
+ # builder.tr { builder.td { builder.table(:border => 1, :style => 'background: orange; margin: 20px', &render) } }
1038
+ # end
1039
+ #
1040
+ # form.update_from_params(:form => { :elem_a => 'test', :elem_b => 'tester', :section => { :elem_a => 'one, two, three' }, :two => { :sub_a => 'subvalue' } })
1041
+ #
1042
+ # #form.display
1043
+ #
1044
+ # ActiveForm::Definition.reset_element_wrapper
1045
+ # ActiveForm::Definition.reset_container_wrapper
1046
+ # ActiveForm::Element::Base.reset_element_wrapper
1047
+ # ActiveForm::Element::Section.reset_element_wrapper
1048
+ # end
1049
+ #
1050
+ # end