ruby-web 1.1.1

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