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
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