ruby-web 1.1.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 (190) hide show
  1. data/ChangeLog +474 -0
  2. data/INSTALL.txt +9 -0
  3. data/InstalledFiles +180 -0
  4. data/LICENSE.txt +74 -0
  5. data/Rakefile +529 -0
  6. data/TODO +65 -0
  7. data/doc/additional.xml +149 -0
  8. data/doc/core.xml +652 -0
  9. data/doc/credits/index.xml +52 -0
  10. data/doc/credits/php.contributors.xml +118 -0
  11. data/doc/credits/php.language-snippets.ent +622 -0
  12. data/doc/install/index.xml +136 -0
  13. data/doc/install/mac/index.xml +21 -0
  14. data/doc/install/ruby-web.install.rb.instructions.xml +7 -0
  15. data/doc/install/unix/index.xml +46 -0
  16. data/doc/install/win/apache1.xml +166 -0
  17. data/doc/install/win/apache2.xml +141 -0
  18. data/doc/install/win/iis.xml +162 -0
  19. data/doc/install/win/index.xml +24 -0
  20. data/doc/install/win/installer.xml +31 -0
  21. data/doc/install/win/manual.xml +43 -0
  22. data/doc/manual.xml +69 -0
  23. data/doc/old/apache_cgi.txt +23 -0
  24. data/doc/old/fastcgi.txt +23 -0
  25. data/doc/old/mod_ruby.txt +21 -0
  26. data/doc/old/snippets.rdoc +183 -0
  27. data/doc/old/webrick.txt +23 -0
  28. data/doc/old/windows_cgi.txt +9 -0
  29. data/doc/tutorial.xml +14 -0
  30. data/doc/xsl/manual-multi.xsl +10 -0
  31. data/doc/xsl/manual-pdf.xsl +6 -0
  32. data/doc/xsl/manual-single.xsl +6 -0
  33. data/doc/xsl/manual.css +22 -0
  34. data/install.rb +1022 -0
  35. data/lib/formatter.rb +314 -0
  36. data/lib/html-parser.rb +429 -0
  37. data/lib/htmlrepair.rb +113 -0
  38. data/lib/htmlsplit.rb +842 -0
  39. data/lib/sgml-parser.rb +332 -0
  40. data/lib/web.rb +68 -0
  41. data/lib/web/assertinclude.rb +129 -0
  42. data/lib/web/config.rb +50 -0
  43. data/lib/web/connection.rb +1070 -0
  44. data/lib/web/convenience.rb +154 -0
  45. data/lib/web/formreader.rb +318 -0
  46. data/lib/web/htmlparser/html-parser.rb +429 -0
  47. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  48. data/lib/web/htmltools/element.rb +296 -0
  49. data/lib/web/htmltools/stparser.rb +276 -0
  50. data/lib/web/htmltools/tags.rb +286 -0
  51. data/lib/web/htmltools/tree.rb +139 -0
  52. data/lib/web/htmltools/xmltree.rb +160 -0
  53. data/lib/web/htmltools/xpath.rb +71 -0
  54. data/lib/web/info.rb +63 -0
  55. data/lib/web/load.rb +210 -0
  56. data/lib/web/mime.rb +87 -0
  57. data/lib/web/phprb.rb +340 -0
  58. data/lib/web/resources/test/cookie.rb +33 -0
  59. data/lib/web/resources/test/counter.rb +20 -0
  60. data/lib/web/resources/test/multipart.rb +14 -0
  61. data/lib/web/resources/test/redirect.rb +8 -0
  62. data/lib/web/resources/test/stock.rb +33 -0
  63. data/lib/web/sapi/apache.rb +129 -0
  64. data/lib/web/sapi/fastcgi.rb +22 -0
  65. data/lib/web/sapi/install/apache.rb +180 -0
  66. data/lib/web/sapi/install/iis.rb +93 -0
  67. data/lib/web/sapi/install/macosx.rb +90 -0
  68. data/lib/web/sapi/webrick.rb +86 -0
  69. data/lib/web/session.rb +83 -0
  70. data/lib/web/shim/cgi.rb +129 -0
  71. data/lib/web/shim/rails.rb +175 -0
  72. data/lib/web/stringio.rb +78 -0
  73. data/lib/web/strscanparser.rb +24 -0
  74. data/lib/web/tagparser.rb +96 -0
  75. data/lib/web/testing.rb +666 -0
  76. data/lib/web/traceoutput.rb +75 -0
  77. data/lib/web/unit.rb +56 -0
  78. data/lib/web/upload.rb +59 -0
  79. data/lib/web/validate.rb +52 -0
  80. data/lib/web/wiki.rb +557 -0
  81. data/lib/web/wiki/linker.rb +72 -0
  82. data/lib/web/wiki/page.rb +201 -0
  83. data/lib/webunit.rb +27 -0
  84. data/lib/webunit/assert.rb +152 -0
  85. data/lib/webunit/converter.rb +154 -0
  86. data/lib/webunit/cookie.rb +118 -0
  87. data/lib/webunit/domwalker.rb +185 -0
  88. data/lib/webunit/exception.rb +14 -0
  89. data/lib/webunit/form.rb +116 -0
  90. data/lib/webunit/frame.rb +37 -0
  91. data/lib/webunit/htmlelem.rb +122 -0
  92. data/lib/webunit/image.rb +26 -0
  93. data/lib/webunit/jscript.rb +31 -0
  94. data/lib/webunit/link.rb +33 -0
  95. data/lib/webunit/params.rb +321 -0
  96. data/lib/webunit/parser.rb +229 -0
  97. data/lib/webunit/response.rb +464 -0
  98. data/lib/webunit/runtest.rb +41 -0
  99. data/lib/webunit/table.rb +148 -0
  100. data/lib/webunit/testcase.rb +45 -0
  101. data/lib/webunit/ui/cui/testrunner.rb +50 -0
  102. data/lib/webunit/utils.rb +68 -0
  103. data/lib/webunit/webunit.rb +28 -0
  104. data/test/dev/action.rb +83 -0
  105. data/test/dev/forms.rb +104 -0
  106. data/test/dev/forms2.rb +104 -0
  107. data/test/dev/parser.rb +17 -0
  108. data/test/dev/scripts/dump.rb +24 -0
  109. data/test/dev/scripts/makedist.rb +62 -0
  110. data/test/dev/scripts/uri.rb +41 -0
  111. data/test/dev/scripts/uri/common.rb +432 -0
  112. data/test/dev/scripts/uri/ftp.rb +149 -0
  113. data/test/dev/scripts/uri/generic.rb +1106 -0
  114. data/test/dev/scripts/uri/http.rb +76 -0
  115. data/test/dev/scripts/uri/https.rb +26 -0
  116. data/test/dev/scripts/uri/ldap.rb +238 -0
  117. data/test/dev/scripts/uri/mailto.rb +260 -0
  118. data/test/dev/scripts/urireg.rb +174 -0
  119. data/test/dev/simpledispatcher.rb +156 -0
  120. data/test/dev/test.action.rb +146 -0
  121. data/test/dev/test.formreader.rb +463 -0
  122. data/test/dev/test.simpledispatcher.rb +186 -0
  123. data/test/dev/webunit/conv/digit-0.rb +21 -0
  124. data/test/dev/webunit/conv/digit-1.rb +17 -0
  125. data/test/dev/webunit/conv/digit.rb +23 -0
  126. data/test/dev/webunit/conv/test_digit-0.rb +16 -0
  127. data/test/dev/webunit/conv/test_digit-1.rb +19 -0
  128. data/test/dev/webunit/conv/test_digit.rb +26 -0
  129. data/test/dev/webunit/conv/test_digit_view-0.rb +76 -0
  130. data/test/dev/webunit/conv/test_digit_view-1.rb +102 -0
  131. data/test/dev/webunit/conv/test_digit_view.rb +134 -0
  132. data/test/installation/htdocs/cgi_test.rb +296 -0
  133. data/test/installation/htdocs/test_install.rb +4 -0
  134. data/test/installation/runwebtest.rb +5 -0
  135. data/test/installation/test_cookie.rb +128 -0
  136. data/test/installation/test_form.rb +47 -0
  137. data/test/installation/test_multipart.rb +51 -0
  138. data/test/installation/test_request.rb +24 -0
  139. data/test/installation/test_response.rb +35 -0
  140. data/test/unit/htdocs/cookie.rb +32 -0
  141. data/test/unit/htdocs/multipart.rb +28 -0
  142. data/test/unit/htdocs/redirect.rb +12 -0
  143. data/test/unit/htdocs/simple.rb +13 -0
  144. data/test/unit/htdocs/stock.rb +33 -0
  145. data/test/unit/test_assert.rb +162 -0
  146. data/test/unit/test_cookie.rb +114 -0
  147. data/test/unit/test_domwalker.rb +77 -0
  148. data/test/unit/test_form.rb +42 -0
  149. data/test/unit/test_frame.rb +40 -0
  150. data/test/unit/test_htmlelem.rb +74 -0
  151. data/test/unit/test_image.rb +45 -0
  152. data/test/unit/test_jscript.rb +57 -0
  153. data/test/unit/test_link.rb +85 -0
  154. data/test/unit/test_multipart.rb +51 -0
  155. data/test/unit/test_params.rb +210 -0
  156. data/test/unit/test_parser.rb +53 -0
  157. data/test/unit/test_response.rb +150 -0
  158. data/test/unit/test_table.rb +70 -0
  159. data/test/unit/test_utils.rb +106 -0
  160. data/test/unit/test_webunit.rb +28 -0
  161. data/test/web/mod_ruby_stub.rb +39 -0
  162. data/test/web/test.assertinclude.rb +109 -0
  163. data/test/web/test.buffer.rb +182 -0
  164. data/test/web/test.code.loader.rb +78 -0
  165. data/test/web/test.config.rb +31 -0
  166. data/test/web/test.error.handling.rb +91 -0
  167. data/test/web/test.formreader-2.0.rb +352 -0
  168. data/test/web/test.load.rb +125 -0
  169. data/test/web/test.mime-type.rb +23 -0
  170. data/test/web/test.narf.cgi.rb +106 -0
  171. data/test/web/test.phprb.rb +239 -0
  172. data/test/web/test.request.rb +368 -0
  173. data/test/web/test.response.rb +637 -0
  174. data/test/web/test.ruby-web.rb +10 -0
  175. data/test/web/test.session.rb +50 -0
  176. data/test/web/test.shim.cgi.rb +96 -0
  177. data/test/web/test.tagparser.rb +65 -0
  178. data/test/web/test.template2.rb +297 -0
  179. data/test/web/test.testing2.rb +318 -0
  180. data/test/web/test.upload.rb +45 -0
  181. data/test/web/test.validate.rb +46 -0
  182. data/test/web/test.web.test.rb +495 -0
  183. data/test/wiki/test.history.rb +297 -0
  184. data/test/wiki/test.illustration_page.rb +287 -0
  185. data/test/wiki/test.linker.rb +197 -0
  186. data/test/wiki/test.tarpit.rb +56 -0
  187. data/test/wiki/test.wiki.rb +300 -0
  188. data/test/wikitestroot/admin.rb +7 -0
  189. data/test/wikitestroot/wiki.rb +6 -0
  190. metadata +234 -0
@@ -0,0 +1,463 @@
1
+ require 'strscan'
2
+
3
+ def resolve array, name, anAlias = ""
4
+ Web::Scope.new(array).resolve name, anAlias
5
+ end
6
+
7
+ class TestConvertArrayToSymbol < Test::Unit::TestCase
8
+ def test_simple_hash
9
+ hash = { "name" => "value" }
10
+
11
+ var = resolve( hash, "name" )
12
+ assert_equal "name", var.canonical_name
13
+ assert_equal "value", var.value
14
+ end
15
+
16
+ def test_simple_array
17
+ array = ["patrick", "tom"]
18
+ var = resolve( array, "[0]" )
19
+ assert_equal "[0]", var.canonical_name
20
+ assert_equal "patrick", var.value
21
+ end
22
+
23
+
24
+ class Trivial
25
+ attr_accessor :name
26
+ def initialize( name )
27
+ @name = name
28
+ end
29
+
30
+ def == (other)
31
+ (other.kind_of? Trivial) && (self.name == other.name)
32
+ end
33
+ end
34
+
35
+ def test_simple_object
36
+ object = Trivial.new( "value" )
37
+
38
+ var = resolve( object, "name" )
39
+
40
+ assert_equal "name", var.canonical_name
41
+ assert_equal "value", var.value
42
+ end
43
+
44
+
45
+ def test_nested_hash
46
+ array = { "name" => { "name2" , "value" } }
47
+
48
+ var = resolve( array, "name.name2" )
49
+ assert_equal "name.name2", var.canonical_name
50
+ assert_equal "value", var.value
51
+ end
52
+
53
+ def test_nested_object
54
+ object = Trivial.new( Trivial.new( "nested" ) )
55
+
56
+ var = resolve( object, "name.name" )
57
+ assert_equal "name.name", var.canonical_name
58
+ assert_equal "nested", var.value
59
+ end
60
+
61
+ def test_missing_method_on_object
62
+ object = Trivial.new( "value" )
63
+
64
+ assert_raises( Web::Scope::VarNotFoundException ) {
65
+ var = resolve( object, "missing_method" )
66
+ }
67
+ end
68
+
69
+ def test_missing_method_falls_back_to_parent_scope
70
+ array = {
71
+ "name" => [Trivial.new("nested")],
72
+ "hash" => {"name" => "hash_value"},
73
+ "object" => Trivial.new( "object_value" ) }
74
+
75
+ var = resolve( array, "name" )
76
+
77
+ looped = false
78
+ var.each do |i|
79
+ var = i.resolve("name")
80
+ assert_equal "name[0].name", var.canonical_name
81
+ assert_equal "nested", var.value
82
+
83
+ var = i.resolve( "hash.name" )
84
+ assert_equal "hash.name", var.canonical_name
85
+ assert_equal "hash_value", var.value
86
+
87
+ var = i.resolve("object.name")
88
+ assert_equal "object.name", var.canonical_name
89
+ assert_equal "object_value", var.value
90
+
91
+ assert_raises( Web::Scope::VarNotFoundException ) {
92
+ i.resolve( "missing_method" )
93
+ }
94
+
95
+ looped = true
96
+ end
97
+ assert looped
98
+ end
99
+
100
+
101
+ def test_nested_nested_hash
102
+ array = { "name" => { "name2" => { "name3" , "value" } } }
103
+
104
+ var = resolve( array, "name.name2.name3" )
105
+ assert_equal "name.name2.name3", var.canonical_name
106
+ assert_equal "value", var.value
107
+ end
108
+
109
+ def test_nested_array
110
+ array = { "name" => [{ "name2" , "value" }]}
111
+
112
+ var = resolve( array, "name[0].name2" )
113
+ assert_equal "name[0].name2", var.canonical_name
114
+ assert_equal "value", var.value
115
+ end
116
+
117
+ def test_top_level_array
118
+ array = [{ "name2" , "value" }]
119
+
120
+ var = resolve( array, "[0].name2" )
121
+ assert_equal "[0].name2", var.canonical_name
122
+ assert_equal "value", var.value
123
+ end
124
+
125
+ def test_each
126
+ array = { "name" => [{ "name2" , "value" }]}
127
+
128
+ var = resolve( array, "name" ,"item")
129
+
130
+ looped = false
131
+ var.each do |i|
132
+ var = i.resolve("item.name2")
133
+ assert_equal "name[0].name2", var.canonical_name
134
+ assert_equal "value", var.value
135
+ looped = true
136
+ end
137
+ assert looped
138
+ end
139
+
140
+
141
+ def test_nested_each
142
+ array = { "name" => [{ "name2" => [ { "name3" =>"value" } ] } ] }
143
+
144
+ var = resolve( array, "name" ,"item")
145
+
146
+ looped = false
147
+ loopedj = false
148
+ var.each do |i|
149
+ jvar = i.resolve("item.name2","itemj")
150
+ assert_equal "name[0].name2", jvar.canonical_name
151
+
152
+ jvar.each do |j|
153
+ var = j.resolve("itemj.name3")
154
+ assert_equal "name[0].name2[0].name3", var.canonical_name
155
+ assert_equal "value", var.value
156
+ loopedj = true
157
+ end
158
+
159
+ looped = true
160
+ end
161
+ assert looped
162
+ assert loopedj
163
+ end
164
+
165
+
166
+ def test_nested_each_from_same_scope
167
+ array = { "name" => [{ "name1" => "value" }],
168
+ "name2" => [{ "name3" => "value" }] }
169
+
170
+ var = resolve( array, "name" ,"item")
171
+
172
+ looped = false
173
+ loopedj = false
174
+ var.each do |i|
175
+ jvar = i.resolve("name2","itemj")
176
+ assert_equal "name2", jvar.canonical_name
177
+
178
+ varx = i.resolve("item.name1")
179
+ assert_equal "name[0].name1", varx.canonical_name
180
+ assert_equal "value", varx.value
181
+
182
+
183
+ jvar.each do |j|
184
+ var = j.resolve("itemj.name3")
185
+ assert_equal "name2[0].name3", var.canonical_name
186
+ assert_equal "value", var.value
187
+
188
+ var = j.resolve("item.name1")
189
+ assert_equal "name[0].name1", var.canonical_name
190
+ assert_equal "value", var.value
191
+ loopedj = true
192
+ end
193
+
194
+ looped = true
195
+ end
196
+ assert looped
197
+ assert loopedj
198
+ end
199
+
200
+ def test_3nested_eachs_from_same_scope
201
+ array = { "name" => [{ "name1" => "value" }],
202
+ "name2" => [{ "name3" => "value" }],
203
+ "name4" => [{ "name5" => "value" }]
204
+ }
205
+
206
+ var = resolve( array, "name" ,"item")
207
+
208
+ looped = false
209
+ loopedj = false
210
+ loopedk = false
211
+ var.each do |i|
212
+ jvar = i.resolve("name2","itemj")
213
+ assert_equal "name2", jvar.canonical_name
214
+
215
+ jvar.each do |j|
216
+ var = j.resolve("itemj.name3")
217
+ assert_equal "name2[0].name3", var.canonical_name
218
+ assert_equal "value", var.value
219
+
220
+ var = j.resolve("item.name1")
221
+ assert_equal "name[0].name1", var.canonical_name
222
+ assert_equal "value", var.value
223
+
224
+ kvar = j.resolve("name4", "itemk")
225
+ assert_equal "name4", kvar.canonical_name
226
+ kvar.each do |k|
227
+ var = k.resolve( "itemk.name5")
228
+ assert_equal "name4[0].name5", var.canonical_name
229
+ assert_equal "value", var.value
230
+
231
+ var = k.resolve("itemj.name3")
232
+ assert_equal "name2[0].name3", var.canonical_name
233
+ assert_equal "value", var.value
234
+
235
+ var = k.resolve("item.name1")
236
+ assert_equal "name[0].name1", var.canonical_name
237
+ assert_equal "value", var.value
238
+
239
+ loopedk = true
240
+ end
241
+
242
+ loopedj = true
243
+
244
+ end
245
+
246
+ looped = true
247
+ end
248
+ assert looped
249
+ assert loopedj
250
+ assert loopedk
251
+ end
252
+
253
+
254
+ def test_nested_scope
255
+ array = {
256
+ "name" =>
257
+ [{ "name2" => "value" }],
258
+ "name3" => "value3",
259
+ "name4" => { "name" => "value4" },
260
+ "name5" => [{ "name" => "value5" }] }
261
+
262
+ var = resolve( array, "name" )
263
+
264
+ looped = false
265
+ var.each do |i|
266
+ var = i.resolve("name2")
267
+ assert_equal "name[0].name2", var.canonical_name
268
+ assert_equal "value", var.value
269
+
270
+ var = i.resolve("name3")
271
+ assert_equal "name3", var.canonical_name
272
+ assert_equal "value3", var.value
273
+
274
+ var = i.resolve("name4.name")
275
+ assert_equal "name4.name", var.canonical_name
276
+ assert_equal "value4", var.value
277
+
278
+ var = i.resolve("name5[0].name")
279
+ assert_equal "name5[0].name", var.canonical_name
280
+ assert_equal "value5", var.value
281
+ looped = true
282
+
283
+ end
284
+ assert looped
285
+ end
286
+
287
+ # update
288
+ def test_update
289
+ initial = { "name" => "oldvalue" }
290
+
291
+ submitted = { "name" => "newvalue" }
292
+
293
+ Web::Scope.new(initial).update( submitted )
294
+
295
+ assert_equal( initial, submitted )
296
+ end
297
+
298
+ def test_update_object
299
+ initial = Trivial.new("oldvalue")
300
+
301
+ submitted = { "name" => "newvalue" }
302
+
303
+ Web::Scope.new(initial).update( submitted )
304
+
305
+ assert_equal( Trivial.new("newvalue"), initial )
306
+ end
307
+
308
+ def test_update_ignores_extra_submissions
309
+ initial = { "name" => "oldvalue" }
310
+
311
+ submitted = { "name" => "newvalue", "something" => "else" }
312
+
313
+ Web::Scope.new(initial).update( submitted )
314
+
315
+ assert_equal( {"name" => "newvalue"}, initial )
316
+ end
317
+
318
+ def test_update_nested
319
+ initial = { "people" => { "sally" => "happy", "dave" => "sad" } }
320
+ submitted = { "people.sally" => "angry", "people.fool" => "ignored" }
321
+
322
+ Web::Scope.new(initial).update( submitted )
323
+
324
+ assert_equal( { "people" => { "sally" => "angry", "dave" => "sad" } },
325
+ initial )
326
+ end
327
+
328
+ def test_update_array
329
+ initial = ["sally", "dave"]
330
+ submitted = { "[0]" => "tom" }
331
+
332
+ Web::Scope.new(initial).update( submitted )
333
+
334
+ assert_equal( ["tom","dave"], initial )
335
+ end
336
+
337
+ class Restricted
338
+ attr_reader :name
339
+ def initialize( name )
340
+ @name = name
341
+ end
342
+ def == (other)
343
+ (other.kind_of? Restricted) && (self.name == other.name)
344
+ end
345
+ end
346
+
347
+ def test_fail_invalid_assignment
348
+ initial = Restricted.new( "value" )
349
+ submitted = { "name" => "new value" }
350
+
351
+ assert_raises( if (RUBY_VERSION =~ /1\.7/ || RUBY_VERSION =~ /1\.8/ )
352
+ NoMethodError # the 1.7-8 exception has a better name
353
+ else
354
+ NameError
355
+ end ) {
356
+ update( initial, submitted )
357
+ }
358
+ end
359
+
360
+ # Error reporting
361
+
362
+
363
+ # replace code in parser
364
+
365
+ # Then we can evaluate arbitrary expressions in a page, and test what the results were
366
+ # update the the results with values submitted from a form
367
+ end
368
+
369
+
370
+
371
+ #Two Tables:
372
+ #VariableTable
373
+ #.resolve("name.value")
374
+ #.canonical_name
375
+
376
+
377
+
378
+ class TestMultiHashTree2 < Test::Unit::TestCase
379
+ def test_flatten_single
380
+ assert_equal({"a"=>"b"}, Web::Testing::MultiHashTree::flatten({ "a" => "b"}))
381
+ end
382
+
383
+ def test_flatten_single
384
+ assert_equal({"a"=>["b"]}, Web::Testing::MultiHashTree::flatten({ "a" => ["b"]}))
385
+ end
386
+
387
+ def test_flatten_multiple
388
+ assert_equal( {"a[]"=>["b", "c"]}, Web::Testing::MultiHashTree::flatten({"a[]"=>["b", "c"]}) )
389
+ end
390
+
391
+ def test_flatten_hash
392
+ assert_equal( {"top.b" => "c", "top.x" => "y"}, Web::Testing::MultiHashTree::flatten({"top"=>{"b"=>"c","x"=>"y"}}))
393
+ end
394
+
395
+ def test_flatten_array
396
+ assert_equal( { "items[0].a" => "b",
397
+ "items[1].c" => "d" }, Web::Testing::MultiHashTree::flatten({ "items" => [
398
+ { "a" => "b"} ,
399
+ { "c" => "d"} ] }
400
+ ) )
401
+ end
402
+ end
403
+
404
+ class TestMultiHashTree3 < Test::Unit::TestCase
405
+ def test_add_simple
406
+ fs = Web::Testing::MultiHashTree.new
407
+ fs.push_field "name","value"
408
+ fs.push_field "name2","value2"
409
+
410
+ assert_equal({ "name" => ["value"],
411
+ "name2" => ["value2"] }, fs.fields)
412
+ end
413
+
414
+ def test_construct_from_hash
415
+ fs = Web::Testing::MultiHashTree.new({ "name" => ["value"] , "name2" => ["value2"] })
416
+
417
+ assert_equal({ "name" => ["value"],
418
+ "name2" => ["value2"] }, fs.fields)
419
+ end
420
+
421
+ def test_add_array
422
+ fs = Web::Testing::MultiHashTree.new
423
+ fs.push_field "name[]","value"
424
+ fs.push_field "name[]","value2"
425
+
426
+ assert_equal({ "name[]" => [ "value", "value2" ] }, fs.fields)
427
+
428
+ end
429
+
430
+ def test_add_hashed
431
+ fs = Web::Testing::MultiHashTree.new
432
+ fs.push_field "name.a","value"
433
+ fs.push_field "name.b","value2"
434
+
435
+ assert_equal({ "name" => { "a" => ["value"], "b" => ["value2"]}}, fs.fields)
436
+ end
437
+
438
+ def test_nested_hash
439
+ fs = Web::Testing::MultiHashTree.new
440
+ fs.push_field "name.a.c","value"
441
+ fs.push_field "name.b","value2"
442
+
443
+ assert_equal({ "name" => { "a" => { "c" => ["value"]} , "b" => ["value2"]}}, fs.fields)
444
+ end
445
+
446
+
447
+ def test_add_array
448
+ fs = Web::Testing::MultiHashTree.new
449
+ fs.push_field "name[0].a","value"
450
+ fs.push_field "name[1].a","value2"
451
+
452
+ assert_equal({ "name" => [ { "a" => ["value"] } , { "a" => ["value2"] }]}, fs.fields)
453
+ end
454
+
455
+ def test_add_hash_in_array
456
+ fs = Web::Testing::MultiHashTree.new
457
+ fs.push_field "name[0].a.b","value"
458
+ fs.push_field "name[1].a.b","value2"
459
+
460
+ assert_equal({ "name" => [ { "a" => { "b" => ["value"] } } , { "a" => { "b" => ["value2"] }}]}, fs.fields)
461
+ end
462
+
463
+ end