narf 0.5.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 (657) hide show
  1. data/ChangeLog +163 -0
  2. data/InstalledFiles +2227 -0
  3. data/README +124 -0
  4. data/TODO +88 -0
  5. data/bin/narftest +17 -0
  6. data/bug.rb +9 -0
  7. data/build.rb +314 -0
  8. data/build.rb~ +314 -0
  9. data/config.save +12 -0
  10. data/doc/apache_cgi.txt +17 -0
  11. data/doc/fastcgi.txt +19 -0
  12. data/doc/mod_ruby.txt +7 -0
  13. data/doc/rdoc/classes/Web.html +366 -0
  14. data/doc/rdoc/classes/Web.src/M000002.html +15 -0
  15. data/doc/rdoc/classes/Web.src/M000003.html +15 -0
  16. data/doc/rdoc/classes/Web.src/M000004.html +15 -0
  17. data/doc/rdoc/classes/Web.src/M000005.html +15 -0
  18. data/doc/rdoc/classes/Web.src/M000006.html +20 -0
  19. data/doc/rdoc/classes/Web.src/M000007.html +18 -0
  20. data/doc/rdoc/classes/Web.src/M000008.html +18 -0
  21. data/doc/rdoc/classes/Web.src/M000009.html +18 -0
  22. data/doc/rdoc/classes/Web.src/M000010.html +15 -0
  23. data/doc/rdoc/classes/Web.src/M000011.html +15 -0
  24. data/doc/rdoc/classes/Web.src/M000012.html +15 -0
  25. data/doc/rdoc/classes/Web/CGD.html +173 -0
  26. data/doc/rdoc/classes/Web/CGD.src/M000037.html +24 -0
  27. data/doc/rdoc/classes/Web/CGD.src/M000038.html +23 -0
  28. data/doc/rdoc/classes/Web/CGD.src/M000039.html +15 -0
  29. data/doc/rdoc/classes/Web/CGD.src/M000040.html +15 -0
  30. data/doc/rdoc/classes/Web/CGD.src/M000041.html +23 -0
  31. data/doc/rdoc/classes/Web/CGI.html +946 -0
  32. data/doc/rdoc/classes/Web/CGI.src/M000051.html +15 -0
  33. data/doc/rdoc/classes/Web/CGI.src/M000052.html +24 -0
  34. data/doc/rdoc/classes/Web/CGI.src/M000053.html +15 -0
  35. data/doc/rdoc/classes/Web/CGI.src/M000054.html +15 -0
  36. data/doc/rdoc/classes/Web/CGI.src/M000055.html +15 -0
  37. data/doc/rdoc/classes/Web/CGI.src/M000056.html +15 -0
  38. data/doc/rdoc/classes/Web/CGI.src/M000057.html +17 -0
  39. data/doc/rdoc/classes/Web/CGI.src/M000058.html +34 -0
  40. data/doc/rdoc/classes/Web/CGI.src/M000059.html +22 -0
  41. data/doc/rdoc/classes/Web/CGI.src/M000060.html +15 -0
  42. data/doc/rdoc/classes/Web/CGI.src/M000061.html +15 -0
  43. data/doc/rdoc/classes/Web/CGI.src/M000062.html +19 -0
  44. data/doc/rdoc/classes/Web/CGI.src/M000063.html +18 -0
  45. data/doc/rdoc/classes/Web/CGI.src/M000064.html +19 -0
  46. data/doc/rdoc/classes/Web/CGI.src/M000065.html +15 -0
  47. data/doc/rdoc/classes/Web/CGI.src/M000066.html +15 -0
  48. data/doc/rdoc/classes/Web/CGI.src/M000067.html +15 -0
  49. data/doc/rdoc/classes/Web/CGI.src/M000068.html +13 -0
  50. data/doc/rdoc/classes/Web/CGI.src/M000069.html +13 -0
  51. data/doc/rdoc/classes/Web/CGI.src/M000070.html +13 -0
  52. data/doc/rdoc/classes/Web/CGI.src/M000071.html +13 -0
  53. data/doc/rdoc/classes/Web/CGI.src/M000072.html +19 -0
  54. data/doc/rdoc/classes/Web/CGI.src/M000073.html +15 -0
  55. data/doc/rdoc/classes/Web/CGI.src/M000074.html +19 -0
  56. data/doc/rdoc/classes/Web/CGI.src/M000075.html +15 -0
  57. data/doc/rdoc/classes/Web/CGI.src/M000076.html +15 -0
  58. data/doc/rdoc/classes/Web/CGI.src/M000077.html +15 -0
  59. data/doc/rdoc/classes/Web/CGI.src/M000078.html +20 -0
  60. data/doc/rdoc/classes/Web/CGI.src/M000079.html +36 -0
  61. data/doc/rdoc/classes/Web/CGI.src/M000080.html +19 -0
  62. data/doc/rdoc/classes/Web/CGI.src/M000081.html +18 -0
  63. data/doc/rdoc/classes/Web/CGI.src/M000082.html +15 -0
  64. data/doc/rdoc/classes/Web/CGI.src/M000083.html +17 -0
  65. data/doc/rdoc/classes/Web/CGI.src/M000084.html +15 -0
  66. data/doc/rdoc/classes/Web/CGI.src/M000085.html +16 -0
  67. data/doc/rdoc/classes/Web/CGI.src/M000086.html +15 -0
  68. data/doc/rdoc/classes/Web/CGI.src/M000087.html +15 -0
  69. data/doc/rdoc/classes/Web/CGI.src/M000088.html +15 -0
  70. data/doc/rdoc/classes/Web/CGI.src/M000089.html +16 -0
  71. data/doc/rdoc/classes/Web/CGI.src/M000090.html +15 -0
  72. data/doc/rdoc/classes/Web/CGI.src/M000091.html +15 -0
  73. data/doc/rdoc/classes/Web/CGI.src/M000092.html +15 -0
  74. data/doc/rdoc/classes/Web/CGI.src/M000093.html +15 -0
  75. data/doc/rdoc/classes/Web/CGI.src/M000094.html +15 -0
  76. data/doc/rdoc/classes/Web/CGI.src/M000095.html +15 -0
  77. data/doc/rdoc/classes/Web/CGI.src/M000096.html +19 -0
  78. data/doc/rdoc/classes/Web/CGI.src/M000097.html +15 -0
  79. data/doc/rdoc/classes/Web/CGI.src/M000098.html +15 -0
  80. data/doc/rdoc/classes/Web/CGI.src/M000099.html +43 -0
  81. data/doc/rdoc/classes/Web/CGI.src/M000100.html +18 -0
  82. data/doc/rdoc/classes/Web/CGI.src/M000101.html +20 -0
  83. data/doc/rdoc/classes/Web/CGI.src/M000102.html +15 -0
  84. data/doc/rdoc/classes/Web/CGI.src/M000103.html +15 -0
  85. data/doc/rdoc/classes/Web/CGI.src/M000104.html +15 -0
  86. data/doc/rdoc/classes/Web/CGI.src/M000105.html +24 -0
  87. data/doc/rdoc/classes/Web/CGI.src/M000106.html +24 -0
  88. data/doc/rdoc/classes/Web/CGI.src/M000107.html +22 -0
  89. data/doc/rdoc/classes/Web/CaseInsensitiveHash.html +104 -0
  90. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000118.html +15 -0
  91. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000119.html +15 -0
  92. data/doc/rdoc/classes/Web/CaseInsensitiveHash.src/M000120.html +15 -0
  93. data/doc/rdoc/classes/Web/Mime.html +122 -0
  94. data/doc/rdoc/classes/Web/Mime.src/M000118.html +15 -0
  95. data/doc/rdoc/classes/Web/Mime.src/M000119.html +15 -0
  96. data/doc/rdoc/classes/Web/Mime.src/M000120.html +23 -0
  97. data/doc/rdoc/classes/Web/Mime.src/M000121.html +15 -0
  98. data/doc/rdoc/classes/Web/Mime.src/M000122.html +15 -0
  99. data/doc/rdoc/classes/Web/Mime.src/M000123.html +23 -0
  100. data/doc/rdoc/classes/Web/Mime.src/M000124.html +15 -0
  101. data/doc/rdoc/classes/Web/Narflates.html +132 -0
  102. data/doc/rdoc/classes/Web/Parser.html +219 -0
  103. data/doc/rdoc/classes/Web/Parser.src/M000013.html +21 -0
  104. data/doc/rdoc/classes/Web/Parser.src/M000014.html +19 -0
  105. data/doc/rdoc/classes/Web/Parser.src/M000015.html +21 -0
  106. data/doc/rdoc/classes/Web/Parser.src/M000016.html +15 -0
  107. data/doc/rdoc/classes/Web/Parser.src/M000017.html +30 -0
  108. data/doc/rdoc/classes/Web/Parser.src/M000018.html +15 -0
  109. data/doc/rdoc/classes/Web/Parser.src/M000019.html +19 -0
  110. data/doc/rdoc/classes/Web/Parser.src/M000020.html +27 -0
  111. data/doc/rdoc/classes/Web/Parser.src/M000021.html +15 -0
  112. data/doc/rdoc/classes/Web/Parser.src/M000022.html +16 -0
  113. data/doc/rdoc/classes/Web/Parser.src/M000023.html +18 -0
  114. data/doc/rdoc/classes/Web/Session.html +178 -0
  115. data/doc/rdoc/classes/Web/Session.src/M000042.html +20 -0
  116. data/doc/rdoc/classes/Web/Session.src/M000043.html +19 -0
  117. data/doc/rdoc/classes/Web/Session.src/M000044.html +21 -0
  118. data/doc/rdoc/classes/Web/Session.src/M000045.html +21 -0
  119. data/doc/rdoc/classes/Web/Session.src/M000046.html +15 -0
  120. data/doc/rdoc/classes/Web/Session.src/M000047.html +17 -0
  121. data/doc/rdoc/classes/Web/Session.src/M000048.html +15 -0
  122. data/doc/rdoc/classes/Web/Session.src/M000049.html +15 -0
  123. data/doc/rdoc/classes/Web/Session.src/M000050.html +16 -0
  124. data/doc/rdoc/classes/Web/Testing.html +474 -0
  125. data/doc/rdoc/classes/Web/Testing.src/M000024.html +15 -0
  126. data/doc/rdoc/classes/Web/Testing.src/M000025.html +25 -0
  127. data/doc/rdoc/classes/Web/Testing.src/M000026.html +15 -0
  128. data/doc/rdoc/classes/Web/Testing.src/M000027.html +28 -0
  129. data/doc/rdoc/classes/Web/Testing.src/M000028.html +58 -0
  130. data/doc/rdoc/classes/Web/Testing.src/M000029.html +15 -0
  131. data/doc/rdoc/classes/Web/Testing.src/M000030.html +15 -0
  132. data/doc/rdoc/classes/Web/Testing.src/M000031.html +15 -0
  133. data/doc/rdoc/classes/Web/Testing.src/M000032.html +15 -0
  134. data/doc/rdoc/classes/Web/Testing.src/M000033.html +15 -0
  135. data/doc/rdoc/classes/Web/Testing.src/M000034.html +15 -0
  136. data/doc/rdoc/classes/Web/Testing.src/M000035.html +15 -0
  137. data/doc/rdoc/classes/Web/Testing.src/M000036.html +18 -0
  138. data/doc/rdoc/classes/Web/Upload.html +160 -0
  139. data/doc/rdoc/classes/Web/Upload.src/M000108.html +25 -0
  140. data/doc/rdoc/classes/Web/Upload.src/M000109.html +18 -0
  141. data/doc/rdoc/classes/Web/Upload.src/M000110.html +16 -0
  142. data/doc/rdoc/classes/Web/Upload.src/M000111.html +16 -0
  143. data/doc/rdoc/classes/Web/Wiki.html +249 -0
  144. data/doc/rdoc/classes/Web/Wiki.src/M000112.html +25 -0
  145. data/doc/rdoc/classes/Web/Wiki.src/M000113.html +15 -0
  146. data/doc/rdoc/classes/Web/Wiki.src/M000114.html +26 -0
  147. data/doc/rdoc/classes/Web/Wiki.src/M000115.html +21 -0
  148. data/doc/rdoc/classes/Web/Wiki.src/M000116.html +18 -0
  149. data/doc/rdoc/classes/Web/Wiki.src/M000117.html +19 -0
  150. data/doc/rdoc/created.rid +1 -0
  151. data/doc/rdoc/files/README.html +226 -0
  152. data/doc/rdoc/files/doc/apache_cgi_txt.html +82 -0
  153. data/doc/rdoc/files/doc/fastcgi_txt.html +82 -0
  154. data/doc/rdoc/files/doc/mod_ruby_txt.html +62 -0
  155. data/doc/rdoc/files/doc/webrick_txt.html +79 -0
  156. data/doc/rdoc/files/examples/examples_rdoc.html +73 -0
  157. data/doc/rdoc/files/lib/web/cgi_rb.html +75 -0
  158. data/doc/rdoc/files/lib/web/mime_rb.html +67 -0
  159. data/doc/rdoc/files/lib/web/parser_rb.html +73 -0
  160. data/doc/rdoc/files/lib/web/session_rb.html +73 -0
  161. data/doc/rdoc/files/lib/web/template_rb.html +73 -0
  162. data/doc/rdoc/files/lib/web/testing_rb.html +67 -0
  163. data/doc/rdoc/files/lib/web/upload_rb.html +73 -0
  164. data/doc/rdoc/files/lib/web/wiki_rb.html +79 -0
  165. data/doc/rdoc/files/lib/web_rb.html +116 -0
  166. data/doc/rdoc/files/lib/web_rb.src/M000001.html +15 -0
  167. data/doc/rdoc/fr_class_index.html +47 -0
  168. data/doc/rdoc/fr_file_index.html +52 -0
  169. data/doc/rdoc/fr_method_index.html +158 -0
  170. data/doc/rdoc/index.html +22 -0
  171. data/doc/rdoc/rdoc-style.css +99 -0
  172. data/doc/webrick.txt +23 -0
  173. data/examples/admin.rb +8 -0
  174. data/examples/admin.rb~ +5 -0
  175. data/examples/cookbook.rdoc +247 -0
  176. data/examples/cookbook.rdoc~ +238 -0
  177. data/examples/examples.rdoc +19 -0
  178. data/examples/examples.rdoc~ +17 -0
  179. data/examples/hello.world.rb +5 -0
  180. data/examples/hello.world.rb~ +3 -0
  181. data/examples/session.rb +34 -0
  182. data/examples/session.rb~ +31 -0
  183. data/examples/test/test.hello.world.rb +9 -0
  184. data/examples/test/test.hello.world.rb~ +9 -0
  185. data/examples/test/test.session.rb +37 -0
  186. data/examples/test/test.session.rb~ +37 -0
  187. data/examples/webunit/COPYING +340 -0
  188. data/examples/webunit/Makefile +14 -0
  189. data/examples/webunit/TIPS-ja.html +126 -0
  190. data/examples/webunit/TIPS-ja.rd +154 -0
  191. data/examples/webunit/TODO-ja.html +35 -0
  192. data/examples/webunit/TODO-ja.rd +28 -0
  193. data/examples/webunit/changes.rd +185 -0
  194. data/examples/webunit/conv/digit-0.cgi +40 -0
  195. data/examples/webunit/conv/digit-0.rb +21 -0
  196. data/examples/webunit/conv/digit-1.cgi +44 -0
  197. data/examples/webunit/conv/digit-1.rb +17 -0
  198. data/examples/webunit/conv/digit.cgi +59 -0
  199. data/examples/webunit/conv/digit.rb +23 -0
  200. data/examples/webunit/conv/test_digit-0.rb +16 -0
  201. data/examples/webunit/conv/test_digit-1.rb +19 -0
  202. data/examples/webunit/conv/test_digit.rb +26 -0
  203. data/examples/webunit/conv/test_digit_view-0.rb +76 -0
  204. data/examples/webunit/conv/test_digit_view-1.rb +102 -0
  205. data/examples/webunit/conv/test_digit_view.rb +134 -0
  206. data/examples/webunit/example.rd +37 -0
  207. data/examples/webunit/index-en.html +263 -0
  208. data/examples/webunit/index-en.rd +60 -0
  209. data/examples/webunit/index-ja.html +263 -0
  210. data/examples/webunit/index-ja.rd +60 -0
  211. data/examples/wiki.rb +7 -0
  212. data/examples/wiki.rb~ +5 -0
  213. data/install.rb +1022 -0
  214. data/lib/web.rb +290 -0
  215. data/lib/web.rb~ +290 -0
  216. data/lib/web/#assertinclude.rb# +110 -0
  217. data/lib/web/action.rb +82 -0
  218. data/lib/web/assertinclude.rb +110 -0
  219. data/lib/web/assertinclude.rb~ +110 -0
  220. data/lib/web/buffer.rb +20 -0
  221. data/lib/web/cgi.rb +641 -0
  222. data/lib/web/cgi.rb~ +640 -0
  223. data/lib/web/formreader.rb +317 -0
  224. data/lib/web/forms.rb +104 -0
  225. data/lib/web/htmlparser/html-parser.rb +429 -0
  226. data/lib/web/htmlparser/html-parser.rb~ +429 -0
  227. data/lib/web/htmlparser/sgml-parser.rb +332 -0
  228. data/lib/web/htmlparser/sgml-parser.rb~ +332 -0
  229. data/lib/web/htmltools/element.rb +296 -0
  230. data/lib/web/htmltools/element.rb~ +296 -0
  231. data/lib/web/htmltools/stparser.rb +276 -0
  232. data/lib/web/htmltools/stparser.rb~ +276 -0
  233. data/lib/web/htmltools/tags.rb +286 -0
  234. data/lib/web/htmltools/tags.rb~ +286 -0
  235. data/lib/web/htmltools/tree.rb +139 -0
  236. data/lib/web/htmltools/tree.rb~ +139 -0
  237. data/lib/web/htmltools/xmltree.rb +160 -0
  238. data/lib/web/htmltools/xmltree.rb~ +160 -0
  239. data/lib/web/htmltools/xpath.rb +71 -0
  240. data/lib/web/htmltools/xpath.rb~ +71 -0
  241. data/lib/web/mime.rb +82 -0
  242. data/lib/web/parser.rb +266 -0
  243. data/lib/web/parser.rb~ +266 -0
  244. data/lib/web/request.rb~ +238 -0
  245. data/lib/web/resources/mime.types +483 -0
  246. data/lib/web/runner.rb +26 -0
  247. data/lib/web/runner.rb~ +26 -0
  248. data/lib/web/sapi/fastcgi.rb +26 -0
  249. data/lib/web/sapi/fastcgi.rb~ +25 -0
  250. data/lib/web/sapi/mod_ruby.rb +46 -0
  251. data/lib/web/sapi/mod_ruby.rb~ +46 -0
  252. data/lib/web/sapi/webrick.rb +91 -0
  253. data/lib/web/sapi/webrick.rb~ +89 -0
  254. data/lib/web/session.rb +75 -0
  255. data/lib/web/session.rb~ +75 -0
  256. data/lib/web/simpledispatcher.rb +155 -0
  257. data/lib/web/strscanparser.rb +24 -0
  258. data/lib/web/tagparser.rb +96 -0
  259. data/lib/web/tagparser.rb~ +96 -0
  260. data/lib/web/template.rb +613 -0
  261. data/lib/web/template.rb~ +613 -0
  262. data/lib/web/testing.rb +546 -0
  263. data/lib/web/testing.rb~ +546 -0
  264. data/lib/web/traceoutput.rb +32 -0
  265. data/lib/web/unit.rb +27 -0
  266. data/lib/web/unit/assert.rb +154 -0
  267. data/lib/web/unit/converter.rb +148 -0
  268. data/lib/web/unit/cookie.rb +120 -0
  269. data/lib/web/unit/domwalker.rb +187 -0
  270. data/lib/web/unit/exception.rb +15 -0
  271. data/lib/web/unit/form.rb +118 -0
  272. data/lib/web/unit/formatter.rb +314 -0
  273. data/lib/web/unit/frame.rb +39 -0
  274. data/lib/web/unit/html-parser.rb +432 -0
  275. data/lib/web/unit/htmlelem.rb +124 -0
  276. data/lib/web/unit/htmlrepair.rb +116 -0
  277. data/lib/web/unit/htmlsplit.rb +840 -0
  278. data/lib/web/unit/image.rb +27 -0
  279. data/lib/web/unit/jscript.rb +32 -0
  280. data/lib/web/unit/link.rb +35 -0
  281. data/lib/web/unit/params.rb +323 -0
  282. data/lib/web/unit/parser.rb +226 -0
  283. data/lib/web/unit/resources/assert.html +101 -0
  284. data/lib/web/unit/resources/auth/index.html +5 -0
  285. data/lib/web/unit/resources/badtags.html +7 -0
  286. data/lib/web/unit/resources/cookie.cgi +33 -0
  287. data/lib/web/unit/resources/document.xml +13 -0
  288. data/lib/web/unit/resources/form.html +150 -0
  289. data/lib/web/unit/resources/frame-0.html +10 -0
  290. data/lib/web/unit/resources/frame-1.html +10 -0
  291. data/lib/web/unit/resources/frame.html +10 -0
  292. data/lib/web/unit/resources/image.html +17 -0
  293. data/lib/web/unit/resources/images/x.gif +0 -0
  294. data/lib/web/unit/resources/images/y.gif +0 -0
  295. data/lib/web/unit/resources/jscript-0.html +10 -0
  296. data/lib/web/unit/resources/jscript-1.html +10 -0
  297. data/lib/web/unit/resources/jscript.html +19 -0
  298. data/lib/web/unit/resources/link.html +19 -0
  299. data/lib/web/unit/resources/multipart.cgi +28 -0
  300. data/lib/web/unit/resources/multipart.html +74 -0
  301. data/lib/web/unit/resources/params.html +65 -0
  302. data/lib/web/unit/resources/redirect.cgi +13 -0
  303. data/lib/web/unit/resources/response.html +67 -0
  304. data/lib/web/unit/resources/simple.cgi +14 -0
  305. data/lib/web/unit/resources/stock.cgi +35 -0
  306. data/lib/web/unit/resources/table.html +83 -0
  307. data/lib/web/unit/response.rb +469 -0
  308. data/lib/web/unit/response.rb~ +461 -0
  309. data/lib/web/unit/runtest.rb +44 -0
  310. data/lib/web/unit/sgml-parser.rb +336 -0
  311. data/lib/web/unit/table.rb +150 -0
  312. data/lib/web/unit/testcase.rb +49 -0
  313. data/lib/web/unit/ui/cui/testrunner.rb +52 -0
  314. data/lib/web/unit/ui/cui/testrunner.rb~ +50 -0
  315. data/lib/web/unit/utils.rb +70 -0
  316. data/lib/web/unit/webunit.rb +28 -0
  317. data/lib/web/upload.rb +55 -0
  318. data/lib/web/upload.rb~ +262 -0
  319. data/lib/web/wiki.rb +506 -0
  320. data/lib/web/wiki.rb~ +506 -0
  321. data/lib/web/wiki/linker.rb +72 -0
  322. data/lib/web/wiki/linker.rb~ +72 -0
  323. data/lib/web/wiki/mime.rb~ +68 -0
  324. data/lib/web/wiki/page.rb +192 -0
  325. data/lib/web/wiki/page.rb~ +192 -0
  326. data/lib/web/wiki/resources/#edit.html# +65 -0
  327. data/lib/web/wiki/resources/admin.html +13 -0
  328. data/lib/web/wiki/resources/admin.html~ +13 -0
  329. data/lib/web/wiki/resources/asset_history.html +3 -0
  330. data/lib/web/wiki/resources/basic.html +1 -0
  331. data/lib/web/wiki/resources/default-content_editor.html +1 -0
  332. data/lib/web/wiki/resources/default-content_editor.html~ +1 -0
  333. data/lib/web/wiki/resources/edit.html +1 -1
  334. data/lib/web/wiki/resources/edit.html~ +1 -1
  335. data/lib/web/wiki/resources/ekit-content_editor.html +1 -0
  336. data/lib/web/wiki/resources/home.html +10 -0
  337. data/lib/web/wiki/resources/home.html~ +10 -0
  338. data/lib/web/wiki/resources/htmlarea/ChangeLog +1185 -0
  339. data/lib/web/wiki/resources/htmlarea/dialog.js +72 -0
  340. data/lib/web/wiki/resources/htmlarea/examples/2-areas.cgi +16 -0
  341. data/lib/web/wiki/resources/htmlarea/examples/2-areas.html +158 -0
  342. data/lib/web/wiki/resources/htmlarea/examples/context-menu.html +95 -0
  343. data/lib/web/wiki/resources/htmlarea/examples/core.html +184 -0
  344. data/lib/web/wiki/resources/htmlarea/examples/css.html +88 -0
  345. data/lib/web/wiki/resources/htmlarea/examples/custom.css +29 -0
  346. data/lib/web/wiki/resources/htmlarea/examples/full-page.html +75 -0
  347. data/lib/web/wiki/resources/htmlarea/examples/fully-loaded.html +248 -0
  348. data/lib/web/wiki/resources/htmlarea/examples/index.html +40 -0
  349. data/lib/web/wiki/resources/htmlarea/examples/spell-checker.html +132 -0
  350. data/lib/web/wiki/resources/htmlarea/examples/table-operations.html +116 -0
  351. data/lib/web/wiki/resources/htmlarea/examples/test.cgi +21 -0
  352. data/lib/web/wiki/resources/htmlarea/htmlarea.css +180 -0
  353. data/lib/web/wiki/resources/htmlarea/htmlarea.js +2175 -0
  354. data/lib/web/wiki/resources/htmlarea/images/ed_about.gif +0 -0
  355. data/lib/web/wiki/resources/htmlarea/images/ed_align_center.gif +0 -0
  356. data/lib/web/wiki/resources/htmlarea/images/ed_align_justify.gif +0 -0
  357. data/lib/web/wiki/resources/htmlarea/images/ed_align_left.gif +0 -0
  358. data/lib/web/wiki/resources/htmlarea/images/ed_align_right.gif +0 -0
  359. data/lib/web/wiki/resources/htmlarea/images/ed_blank.gif +0 -0
  360. data/lib/web/wiki/resources/htmlarea/images/ed_charmap.gif +0 -0
  361. data/lib/web/wiki/resources/htmlarea/images/ed_color_bg.gif +0 -0
  362. data/lib/web/wiki/resources/htmlarea/images/ed_color_fg.gif +0 -0
  363. data/lib/web/wiki/resources/htmlarea/images/ed_copy.gif +0 -0
  364. data/lib/web/wiki/resources/htmlarea/images/ed_custom.gif +0 -0
  365. data/lib/web/wiki/resources/htmlarea/images/ed_cut.gif +0 -0
  366. data/lib/web/wiki/resources/htmlarea/images/ed_delete.gif +0 -0
  367. data/lib/web/wiki/resources/htmlarea/images/ed_format_bold.gif +0 -0
  368. data/lib/web/wiki/resources/htmlarea/images/ed_format_italic.gif +0 -0
  369. data/lib/web/wiki/resources/htmlarea/images/ed_format_strike.gif +0 -0
  370. data/lib/web/wiki/resources/htmlarea/images/ed_format_sub.gif +0 -0
  371. data/lib/web/wiki/resources/htmlarea/images/ed_format_sup.gif +0 -0
  372. data/lib/web/wiki/resources/htmlarea/images/ed_format_underline.gif +0 -0
  373. data/lib/web/wiki/resources/htmlarea/images/ed_help.gif +0 -0
  374. data/lib/web/wiki/resources/htmlarea/images/ed_hr.gif +0 -0
  375. data/lib/web/wiki/resources/htmlarea/images/ed_html.gif +0 -0
  376. data/lib/web/wiki/resources/htmlarea/images/ed_image.gif +0 -0
  377. data/lib/web/wiki/resources/htmlarea/images/ed_indent_less.gif +0 -0
  378. data/lib/web/wiki/resources/htmlarea/images/ed_indent_more.gif +0 -0
  379. data/lib/web/wiki/resources/htmlarea/images/ed_left_to_right.gif +0 -0
  380. data/lib/web/wiki/resources/htmlarea/images/ed_link.gif +0 -0
  381. data/lib/web/wiki/resources/htmlarea/images/ed_list_bullet.gif +0 -0
  382. data/lib/web/wiki/resources/htmlarea/images/ed_list_num.gif +0 -0
  383. data/lib/web/wiki/resources/htmlarea/images/ed_paste.gif +0 -0
  384. data/lib/web/wiki/resources/htmlarea/images/ed_redo.gif +0 -0
  385. data/lib/web/wiki/resources/htmlarea/images/ed_right_to_left.gif +0 -0
  386. data/lib/web/wiki/resources/htmlarea/images/ed_save.gif +0 -0
  387. data/lib/web/wiki/resources/htmlarea/images/ed_show_border.gif +0 -0
  388. data/lib/web/wiki/resources/htmlarea/images/ed_splitcel.gif +0 -0
  389. data/lib/web/wiki/resources/htmlarea/images/ed_undo.gif +0 -0
  390. data/lib/web/wiki/resources/htmlarea/images/fullscreen_maximize.gif +0 -0
  391. data/lib/web/wiki/resources/htmlarea/images/fullscreen_minimize.gif +0 -0
  392. data/lib/web/wiki/resources/htmlarea/images/insert_table.gif +0 -0
  393. data/lib/web/wiki/resources/htmlarea/index.html +199 -0
  394. data/lib/web/wiki/resources/htmlarea/lang/b5.js +36 -0
  395. data/lib/web/wiki/resources/htmlarea/lang/cz.js +63 -0
  396. data/lib/web/wiki/resources/htmlarea/lang/da.js +38 -0
  397. data/lib/web/wiki/resources/htmlarea/lang/de.js +54 -0
  398. data/lib/web/wiki/resources/htmlarea/lang/ee.js +63 -0
  399. data/lib/web/wiki/resources/htmlarea/lang/el.js +75 -0
  400. data/lib/web/wiki/resources/htmlarea/lang/en.js +88 -0
  401. data/lib/web/wiki/resources/htmlarea/lang/es.js +51 -0
  402. data/lib/web/wiki/resources/htmlarea/lang/fi.js +46 -0
  403. data/lib/web/wiki/resources/htmlarea/lang/fr.js +61 -0
  404. data/lib/web/wiki/resources/htmlarea/lang/gb.js +36 -0
  405. data/lib/web/wiki/resources/htmlarea/lang/he.js +63 -0
  406. data/lib/web/wiki/resources/htmlarea/lang/hu.js +63 -0
  407. data/lib/web/wiki/resources/htmlarea/lang/it.js +54 -0
  408. data/lib/web/wiki/resources/htmlarea/lang/ja-euc.js +37 -0
  409. data/lib/web/wiki/resources/htmlarea/lang/ja-jis.js +37 -0
  410. data/lib/web/wiki/resources/htmlarea/lang/ja-sjis.js +37 -0
  411. data/lib/web/wiki/resources/htmlarea/lang/ja-utf8.js +37 -0
  412. data/lib/web/wiki/resources/htmlarea/lang/lt.js +55 -0
  413. data/lib/web/wiki/resources/htmlarea/lang/lv.js +55 -0
  414. data/lib/web/wiki/resources/htmlarea/lang/nb.js +36 -0
  415. data/lib/web/wiki/resources/htmlarea/lang/nl.js +90 -0
  416. data/lib/web/wiki/resources/htmlarea/lang/no.js +79 -0
  417. data/lib/web/wiki/resources/htmlarea/lang/pl.js +36 -0
  418. data/lib/web/wiki/resources/htmlarea/lang/pt_br.js +37 -0
  419. data/lib/web/wiki/resources/htmlarea/lang/ro.js +80 -0
  420. data/lib/web/wiki/resources/htmlarea/lang/ru.js +63 -0
  421. data/lib/web/wiki/resources/htmlarea/lang/se.js +38 -0
  422. data/lib/web/wiki/resources/htmlarea/lang/si.js +63 -0
  423. data/lib/web/wiki/resources/htmlarea/lang/vn.js +51 -0
  424. data/lib/web/wiki/resources/htmlarea/license.txt +30 -0
  425. data/lib/web/wiki/resources/htmlarea/plugins/CSS/css.js +116 -0
  426. data/lib/web/wiki/resources/htmlarea/plugins/CSS/lang/en.js +2 -0
  427. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/context-menu.js +416 -0
  428. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/de.js +59 -0
  429. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/el.js +57 -0
  430. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/en.js +66 -0
  431. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/lang/nl.js +66 -0
  432. data/lib/web/wiki/resources/htmlarea/plugins/ContextMenu/menu.css +64 -0
  433. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/full-page.js +143 -0
  434. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/img/docprop.gif +0 -0
  435. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/lang/en.js +25 -0
  436. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/lang/ro.js +25 -0
  437. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/popups/docprop.html +131 -0
  438. data/lib/web/wiki/resources/htmlarea/plugins/FullPage/test.html +89 -0
  439. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/img/spell-check.gif +0 -0
  440. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/cz.js +37 -0
  441. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/da.js +37 -0
  442. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/de.js +28 -0
  443. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/en.js +38 -0
  444. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/hu.js +37 -0
  445. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/it.js +28 -0
  446. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/lang/ro.js +37 -0
  447. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/readme-tech.html +114 -0
  448. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-logic.cgi +210 -0
  449. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-style.css +10 -0
  450. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-ui.html +122 -0
  451. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-check-ui.js +397 -0
  452. data/lib/web/wiki/resources/htmlarea/plugins/SpellChecker/spell-checker.js +79 -0
  453. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-delete.gif +0 -0
  454. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-insert-after.gif +0 -0
  455. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-insert-before.gif +0 -0
  456. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-merge.gif +0 -0
  457. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-prop.gif +0 -0
  458. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/cell-split.gif +0 -0
  459. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-delete.gif +0 -0
  460. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-insert-after.gif +0 -0
  461. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-insert-before.gif +0 -0
  462. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/col-split.gif +0 -0
  463. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-delete.gif +0 -0
  464. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-insert-above.gif +0 -0
  465. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-insert-under.gif +0 -0
  466. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-prop.gif +0 -0
  467. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/row-split.gif +0 -0
  468. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/img/table-prop.gif +0 -0
  469. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/cz.js +90 -0
  470. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/da.js +90 -0
  471. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/de.js +81 -0
  472. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/el.js +81 -0
  473. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/en.js +90 -0
  474. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/fi.js +66 -0
  475. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/hu.js +63 -0
  476. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/it.js +81 -0
  477. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/nl.js +90 -0
  478. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/no.js +91 -0
  479. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/lang/ro.js +90 -0
  480. data/lib/web/wiki/resources/htmlarea/plugins/TableOperations/table-operations.js +1160 -0
  481. data/lib/web/wiki/resources/htmlarea/popupdiv.js +369 -0
  482. data/lib/web/wiki/resources/htmlarea/popups/about.html +378 -0
  483. data/lib/web/wiki/resources/htmlarea/popups/blank.html +2 -0
  484. data/lib/web/wiki/resources/htmlarea/popups/custom2.html +35 -0
  485. data/lib/web/wiki/resources/htmlarea/popups/editor_help.html +16 -0
  486. data/lib/web/wiki/resources/htmlarea/popups/fullscreen.html +133 -0
  487. data/lib/web/wiki/resources/htmlarea/popups/insert_image.html +191 -0
  488. data/lib/web/wiki/resources/htmlarea/popups/insert_table.html +174 -0
  489. data/lib/web/wiki/resources/htmlarea/popups/link.html +142 -0
  490. data/lib/web/wiki/resources/htmlarea/popups/old-fullscreen.html +131 -0
  491. data/lib/web/wiki/resources/htmlarea/popups/old_insert_image.html +206 -0
  492. data/lib/web/wiki/resources/htmlarea/popups/popup.js +109 -0
  493. data/lib/web/wiki/resources/htmlarea/popups/select_color.html +347 -0
  494. data/lib/web/wiki/resources/htmlarea/popupwin.js +139 -0
  495. data/lib/web/wiki/resources/htmlarea/reference.html +523 -0
  496. data/lib/web/wiki/resources/htmlarea/release-notes.html +165 -0
  497. data/lib/web/wiki/resources/ie-content_editor.html +1 -0
  498. data/lib/web/wiki/resources/ie-content_editor.js +196 -0
  499. data/lib/web/wiki/resources/illustration.html +1 -0
  500. data/lib/web/wiki/resources/illustration.html~ +1 -0
  501. data/lib/web/wiki/resources/images.html +1 -0
  502. data/lib/web/wiki/resources/index.html +4 -0
  503. data/lib/web/wiki/resources/index.html~ +4 -0
  504. data/lib/web/wiki/resources/more_news.html +5 -0
  505. data/lib/web/wiki/resources/more_news.html~ +5 -0
  506. data/lib/web/wiki/resources/more_news_rss_0.91.html +23 -0
  507. data/lib/web/wiki/resources/narf-logo.gif +0 -0
  508. data/lib/web/wiki/resources/page_history.html +19 -0
  509. data/lib/web/wiki/resources/page_history.html~ +19 -0
  510. data/lib/web/wiki/resources/template.html +13 -0
  511. data/lib/web/wiki/resources/template.html~ +13 -0
  512. data/lib/web/wiki/resources/test_upload.gif +0 -0
  513. data/lib/web/wiki/resources/text-styles.css +1 -0
  514. data/lib/web/writableio.rb +33 -0
  515. data/narf-0.5.1.gem +0 -0
  516. data/narf.gemspec +40 -0
  517. data/narf.gemspec~ +52 -0
  518. data/pre-setup.rb +5 -0
  519. data/sapi/apache_cgi/INSTALL.txt~ +9 -0
  520. data/sapi/apache_cgi/README~ +0 -0
  521. data/sapi/apache_cgi/src/narf.c +13 -0
  522. data/sapi/fastcgi/INSTALL.txt~ +17 -0
  523. data/sapi/mod_ruby/INSTALL.txt~ +5 -0
  524. data/sapi/webrick/INSTALL.txt~ +21 -0
  525. data/sapi/webrick/run_webrick.rb~ +16 -0
  526. data/scripts/dump.rb +14 -0
  527. data/scripts/makedist.rb +49 -0
  528. data/scripts/upload.html +5 -0
  529. data/scripts/uri.rb +41 -0
  530. data/scripts/uri/common.rb +432 -0
  531. data/scripts/uri/ftp.rb +149 -0
  532. data/scripts/uri/generic.rb +1106 -0
  533. data/scripts/uri/http.rb +76 -0
  534. data/scripts/uri/https.rb +26 -0
  535. data/scripts/uri/ldap.rb +238 -0
  536. data/scripts/uri/mailto.rb +260 -0
  537. data/scripts/urireg.rb +174 -0
  538. data/test/bufferedtestrunner.rb +112 -0
  539. data/test/mod_ruby_stub.rb +39 -0
  540. data/test/mod_ruby_stub.rb~ +38 -0
  541. data/test/stringio.rb +2 -0
  542. data/test/test.action.rb +142 -0
  543. data/test/test.action.rb~ +142 -0
  544. data/test/test.app.rb +0 -0
  545. data/test/test.assertinclude.rb +109 -0
  546. data/test/test.assertinclude.rb~ +109 -0
  547. data/test/test.formreader-2.0.rb +352 -0
  548. data/test/test.formreader.rb +465 -0
  549. data/test/test.mime-type.rb +23 -0
  550. data/test/test.narf.cgi.rb +101 -0
  551. data/test/test.narf.cgi.rb~ +105 -0
  552. data/test/test.request.rb +328 -0
  553. data/test/test.request.rb~ +318 -0
  554. data/test/test.response.rb +565 -0
  555. data/test/test.response.rb~ +556 -0
  556. data/test/test.session.rb +50 -0
  557. data/test/test.simpledispatcher.rb +188 -0
  558. data/test/test.tagparser.rb +65 -0
  559. data/test/test.template.rb +831 -0
  560. data/test/test.template.rb~ +832 -0
  561. data/test/test.testing2.rb +341 -0
  562. data/test/test.web.test.rb +463 -0
  563. data/test/test.web.test.rb~ +461 -0
  564. data/test/testfiles/basictemplate.tpl +1 -0
  565. data/test/testfiles/explorer5.multipart.data +9 -0
  566. data/test/testfiles/form.html +7 -0
  567. data/test/testfiles/mozilla.multipart.data +9 -0
  568. data/test/testfiles/netscape4.multipart.data +9 -0
  569. data/test/testfiles/pic hydra.png +1 -0
  570. data/test/testfiles/post.data +1 -0
  571. data/test/testfiles/print.text +1 -0
  572. data/test/testfiles/text +1 -0
  573. data/test/webunit/dont_get_it.test_webunit.rb +27 -0
  574. data/test/webunit/ref +38 -0
  575. data/test/webunit/resources/uploadfile1.txt +1 -0
  576. data/test/webunit/resources/uploadfile2.txt +1 -0
  577. data/test/webunit/test_assert.rb +169 -0
  578. data/test/webunit/test_cookie.rb +128 -0
  579. data/test/webunit/test_cookie.rb~ +128 -0
  580. data/test/webunit/test_domwalker.rb +83 -0
  581. data/test/webunit/test_form.rb +43 -0
  582. data/test/webunit/test_form.rb~ +43 -0
  583. data/test/webunit/test_frame.rb +43 -0
  584. data/test/webunit/test_htmlelem.rb +75 -0
  585. data/test/webunit/test_image.rb +46 -0
  586. data/test/webunit/test_jscript.rb +58 -0
  587. data/test/webunit/test_link.rb +87 -0
  588. data/test/webunit/test_multipart.rb +53 -0
  589. data/test/webunit/test_multipart.rb~ +53 -0
  590. data/test/webunit/test_params.rb +212 -0
  591. data/test/webunit/test_params.rb~ +211 -0
  592. data/test/webunit/test_parser.rb +31 -0
  593. data/test/webunit/test_response.rb +145 -0
  594. data/test/webunit/test_response.rb~ +145 -0
  595. data/test/webunit/test_site/assert.html +101 -0
  596. data/test/webunit/test_site/assert.html~ +1 -0
  597. data/test/webunit/test_site/auth/index.html +5 -0
  598. data/test/webunit/test_site/auth/index.html~ +1 -0
  599. data/test/webunit/test_site/badtags.html +7 -0
  600. data/test/webunit/test_site/badtags.html~ +1 -0
  601. data/test/webunit/test_site/cookie.cgi +37 -0
  602. data/test/webunit/test_site/cookie.cgi~ +35 -0
  603. data/test/webunit/test_site/document.xml +13 -0
  604. data/test/webunit/test_site/document.xml~ +1 -0
  605. data/test/webunit/test_site/form.html +150 -0
  606. data/test/webunit/test_site/form.html~ +1 -0
  607. data/test/webunit/test_site/frame-0.html +10 -0
  608. data/test/webunit/test_site/frame-0.html~ +1 -0
  609. data/test/webunit/test_site/frame-1.html +10 -0
  610. data/test/webunit/test_site/frame-1.html~ +1 -0
  611. data/test/webunit/test_site/frame.html +10 -0
  612. data/test/webunit/test_site/frame.html~ +1 -0
  613. data/test/webunit/test_site/image.html +17 -0
  614. data/test/webunit/test_site/image.html~ +1 -0
  615. data/test/webunit/test_site/images/x.gif +0 -0
  616. data/test/webunit/test_site/images/y.gif +0 -0
  617. data/test/webunit/test_site/include.cgi~ +10 -0
  618. data/test/webunit/test_site/jscript-0.html +10 -0
  619. data/test/webunit/test_site/jscript-0.html~ +1 -0
  620. data/test/webunit/test_site/jscript-1.html +10 -0
  621. data/test/webunit/test_site/jscript-1.html~ +1 -0
  622. data/test/webunit/test_site/jscript.html +19 -0
  623. data/test/webunit/test_site/jscript.html~ +1 -0
  624. data/test/webunit/test_site/link.html +19 -0
  625. data/test/webunit/test_site/link.html~ +1 -0
  626. data/test/webunit/test_site/multipart.cgi +27 -0
  627. data/test/webunit/test_site/multipart.cgi~ +25 -0
  628. data/test/webunit/test_site/multipart.html +74 -0
  629. data/test/webunit/test_site/multipart.html~ +1 -0
  630. data/test/webunit/test_site/params.html +65 -0
  631. data/test/webunit/test_site/params.html~ +1 -0
  632. data/test/webunit/test_site/redirect.cgi +14 -0
  633. data/test/webunit/test_site/redirect.cgi~ +14 -0
  634. data/test/webunit/test_site/response.html +67 -0
  635. data/test/webunit/test_site/response.html~ +1 -0
  636. data/test/webunit/test_site/simple.cgi +17 -0
  637. data/test/webunit/test_site/simple.cgi~ +17 -0
  638. data/test/webunit/test_site/stock.cgi +36 -0
  639. data/test/webunit/test_site/stock.cgi~ +34 -0
  640. data/test/webunit/test_site/table.html +83 -0
  641. data/test/webunit/test_site/table.html~ +1 -0
  642. data/test/webunit/test_site/test.cgi~ +25 -0
  643. data/test/webunit/test_table.rb +70 -0
  644. data/test/webunit/test_utils.rb +107 -0
  645. data/test/wiki/test.history.rb +277 -0
  646. data/test/wiki/test.history.rb~ +254 -0
  647. data/test/wiki/test.illustration_page.rb +287 -0
  648. data/test/wiki/test.illustration_page.rb~ +287 -0
  649. data/test/wiki/test.linker.rb +197 -0
  650. data/test/wiki/test.tarpit.rb +40 -0
  651. data/test/wiki/test.wiki.rb +295 -0
  652. data/test/wiki/test.wiki.rb~ +295 -0
  653. data/test/wikitestroot/big_image.jpg +0 -0
  654. data/test/wikitestroot/mime.types +483 -0
  655. data/test/wikitestroot/test_upload.gif +0 -0
  656. data/vandals.test.txt +3 -0
  657. metadata +768 -0
@@ -0,0 +1,142 @@
1
+ module Web
2
+ class Action
3
+ def Action.clear_actions
4
+ @@all_actions = []
5
+ end
6
+ end
7
+ end
8
+
9
+ class TestAction < Test::Unit::TestCase
10
+ def set_up
11
+ end
12
+
13
+ def teardown
14
+ @output = @cgi = @action = @stored_pattern = nil
15
+ Web::Action.clear_actions
16
+ end
17
+
18
+ def output
19
+ @output ||= ""
20
+ end
21
+
22
+ def cgi params={}
23
+ Web::CGI.new( :out => output, :params => params )
24
+ end
25
+
26
+ def stored_pattern pattern={}
27
+ @stored_pattern ||= pattern
28
+ end
29
+
30
+ def action( pattern=stored_pattern, &function )
31
+ @action ||= Web::Action.new( pattern, &function )
32
+ end
33
+
34
+ def test_failed_match_on_blank_cgi
35
+ action( "name" => // )
36
+ assert_equal( false, action.applies?(cgi) )
37
+ end
38
+
39
+ def test_fails_with_different_params
40
+ action "name" => //
41
+ assert_equal( false, action.applies?(cgi( {"not" => "me"} )) )
42
+ end
43
+
44
+ def test_matchs_by_param_present
45
+ action "name" => //
46
+ assert action.applies?(cgi( {"name" => "something"}) )
47
+ end
48
+
49
+ def test_matches_exact_param
50
+ action "name" => "patrick"
51
+ assert action.applies?(cgi( {"name" => "patrick" } ))
52
+ assert_equal( false, action.applies?(cgi( {"name" => "patrick.may"} ) ))
53
+ end
54
+
55
+ def test_matches_pattern
56
+ action "name" => /patrick|tom/
57
+ assert action.applies?(cgi( {"name" => "patrick the great" } ))
58
+ assert action.applies?(cgi( {"name" => "tom the silly" } ))
59
+ end
60
+
61
+ def test_match_is_not_anal
62
+ action "name" => //
63
+ assert action.applies?(cgi( {"name" => "something", "ignore" => "me"} ))
64
+ end
65
+
66
+ def test_runs_block
67
+ action_ran_flag = false
68
+ action( "name" => // ) {
69
+ action_ran_flag = true
70
+ }
71
+
72
+ action.run
73
+
74
+ assert action_ran_flag
75
+ end
76
+
77
+ def test_guards_block
78
+ Web::Action.new.run
79
+ end
80
+
81
+ def test_passes_cgi_in_with_run
82
+ action_ran_flag = false
83
+ action( "name" => // ){ |cgi|
84
+ action_ran_flag = cgi.has_key? "flag"
85
+ }
86
+
87
+ action.run cgi( "flag" => "it ran" )
88
+
89
+ assert action_ran_flag
90
+ end
91
+
92
+ def test_pick_action_picks_the_most_specific_action
93
+ one = Web::Action.new( "name" => // )
94
+ second = Web::Action.new( "name" => "patrick" )
95
+ third = Web::Action.new( "name" => /patrick|tom/ )
96
+
97
+ assert_equal( second, Web::Action.pick( cgi({ "name" => "patrick"}) ) )
98
+ end
99
+
100
+ def test_set_default_action
101
+ default = Web::Action.new
102
+ another = Web::Action.new( "this" => "that", "here" => "there" )
103
+ assert_equal( default, Web::Action.pick( cgi ) )
104
+ end
105
+
106
+ # this test causes no initial default action
107
+ # def test_raises_exception_if_no_action_is_found
108
+ # assert_raises(Web::Exception){
109
+ # Web::Action.pick cgi
110
+ # }
111
+ # end
112
+
113
+ def test_doesnt_raise_exception_if_no_exception_is_found
114
+ Web::Action.pick(cgi).run
115
+ end
116
+
117
+ def test_blank_action_doesnt_mask_default
118
+ Web::Action.pick(cgi).run
119
+
120
+ default = Web::Action.new
121
+
122
+ assert_equal( default, Web::Action.pick(cgi) )
123
+ end
124
+
125
+ def test_run
126
+ cgi_params = { "name" => "patrick" }
127
+ test_params = {}
128
+
129
+ Web::Action.new { |cgi|
130
+ test_params = cgi.multiple_params
131
+ }
132
+
133
+ Web::Action.run :params => cgi_params, :out => ""
134
+
135
+ assert_equal( cgi_params, test_params )
136
+ end
137
+
138
+ def todo_test_subclassing_action
139
+
140
+ end
141
+
142
+ end
File without changes
@@ -0,0 +1,109 @@
1
+ class TestHashCompare < Test::Unit::TestCase
2
+ def test_includes_same
3
+ assert_includes( {"a" => "aa"} , {"a" => "aa"} )
4
+ end
5
+
6
+ def test_includes_missing
7
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
8
+ assert_includes( { "a" => "aa", "b" => "bb" } , {"a" => "aa"} )
9
+ }
10
+ assert e.to_s.index( "Missing from actual: b => \"bb\"" )
11
+ end
12
+
13
+ def test_includes_different
14
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
15
+ assert_includes( {"a" => "aa"} , { "a" => "bb" } )
16
+ }
17
+ assert e.to_s.index("Difference: required <a => \"aa\"> was <a => \"bb\">" )
18
+ end
19
+
20
+ def test_includes_multi_level
21
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
22
+ assert_includes( {"a" => { "a" => "aa", "b" => "bb" }} , { "a" => { "a" => "aa", "b" => "cc"}} )
23
+ }
24
+ assert e.to_s.index("Difference: required <a.b => \"bb\"> was <a.b => \"cc\">")
25
+ end
26
+
27
+ def test_includes_array_with_difference
28
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
29
+ assert_includes( {"a" => [{ "a" => "aa" }, {"b" => "bb" }]},{ "a" => [ {"a" => "aa"}, {"b" => "cc"}]})
30
+ }
31
+ assert e.to_s.index("Difference: required <a[1].b => \"bb\"> was <a[1].b => \"cc\">")
32
+ end
33
+
34
+ def test_includes_array_with_items_missing
35
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
36
+ assert_includes( { "a" => [ {"a" => "aa"}, {"b" => "cc"}]} , {"a" => [{ "a" => "aa" }]} )
37
+ }
38
+ assert e.to_s.index("Missing from actual: a[1] => {\"b\"=>\"cc\"}")
39
+ end
40
+
41
+ def test_includes_hash_when_should_not
42
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
43
+ assert_includes( {"a" => "b"} , { "a" => { "a" => "aa", "b" => "cc"}} )
44
+ }
45
+ assert e.to_s.index("Difference: required <a => \"b\"> was <a => {\"a\"=>\"aa\", \"b\"=>\"cc\"}>")
46
+ end
47
+
48
+ def test_does_not_include_hash_when_it_should
49
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
50
+ assert_includes( { "a" => { "a" => "aa" , "b" => "cc"}}, {"a" => "b"} )
51
+ }
52
+ assert e.to_s.index("Difference: required <a => {\"a\"=>\"aa\", \"b\"=>\"cc\"}> was <a => \"b\">")
53
+ end
54
+
55
+ def test_includes_array_when_should_not
56
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
57
+ assert_includes( {"a" => "a"}, { "a" => [ {"a" => "aa"}, {"b" => "cc"}]} )
58
+ }
59
+ assert e.to_s.index("Difference: required <a => \"a\"> was <a => [{\"a\"=>\"aa\"}, {\"b\"=>\"cc\"}]>")
60
+ end
61
+
62
+ def test_does_not_include_array_when_it_should
63
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
64
+ assert_includes( {"a" => "b"} , { "a" => { "a" => "aa" , "b" => "cc"}} )
65
+ }
66
+ assert e.to_s.index("Difference: required <a => \"b\"> was <a => {\"a\"=>\"aa\", \"b\"=>\"cc\"}>" )
67
+ end
68
+
69
+ def test_assert_includes
70
+ assert_includes( {"a" => { "a" => "aa" }}, { "a" => { "a" => "aa" , "b" => "aa"}} )
71
+ end
72
+
73
+ def test_assert_includes2
74
+ assert_raises (Test::Unit::AssertionFailedError) {
75
+ assert_includes( { "a" => { "a" => "aa" , "b" => "cc"}}, {"a" => { "c" => "bb" },"b" => { "c" => "bb" }})
76
+ }
77
+ end
78
+
79
+ def test_assert_includes_array
80
+ assert_includes( ["a"],[ "a","b"] )
81
+ end
82
+
83
+ def test_demonstrate_failure
84
+ assert_raises (Test::Unit::AssertionFailedError) {
85
+ assert_includes(["a","b"],[ "a"])
86
+ }
87
+ end
88
+
89
+ class Trivial
90
+ attr_accessor :name
91
+ def initialize( name )
92
+ @name = name
93
+ end
94
+ end
95
+
96
+ def test_compare_object_tree_to_hash
97
+ assert_includes({"name" => "patrick"}, Trivial.new("patrick"))
98
+ end
99
+
100
+ def test_compare_object_tree_to_hash
101
+ assert_includes({"name" => { "name" => "patrick" }}, Trivial.new(Trivial.new("patrick")))
102
+ end
103
+
104
+
105
+ # TODO:
106
+ # reports an error if either item is not a hash
107
+ # improve error reporting when comparing a hash to an array and vice versa
108
+ # add an enhanced version of assert equals
109
+ end
@@ -0,0 +1,109 @@
1
+ class TestHashCompare < Test::Unit::TestCase
2
+ def test_includes_same
3
+ assert_includes( {"a" => "aa"} , {"a" => "aa"} )
4
+ end
5
+
6
+ def test_includes_missing
7
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
8
+ assert_includes( { "a" => "aa", "b" => "bb" } , {"a" => "aa"} )
9
+ }
10
+ assert_equal "Missing from actual: b => \"bb\".", e.to_s
11
+ end
12
+
13
+ def test_includes_different
14
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
15
+ assert_includes( {"a" => "aa"} , { "a" => "bb" } )
16
+ }
17
+ assert_equal "Difference: required <a => \"aa\"> was <a => \"bb\">.", e.to_s
18
+ end
19
+
20
+ def test_includes_multi_level
21
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
22
+ assert_includes( {"a" => { "a" => "aa", "b" => "bb" }} , { "a" => { "a" => "aa", "b" => "cc"}} )
23
+ }
24
+ assert_equal "Difference: required <a.b => \"bb\"> was <a.b => \"cc\">.", e.to_s
25
+ end
26
+
27
+ def test_includes_array_with_difference
28
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
29
+ assert_includes( {"a" => [{ "a" => "aa" }, {"b" => "bb" }]},{ "a" => [ {"a" => "aa"}, {"b" => "cc"}]})
30
+ }
31
+ assert_equal "Difference: required <a[1].b => \"bb\"> was <a[1].b => \"cc\">.", e.to_s
32
+ end
33
+
34
+ def test_includes_array_with_items_missing
35
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
36
+ assert_includes( { "a" => [ {"a" => "aa"}, {"b" => "cc"}]} , {"a" => [{ "a" => "aa" }]} )
37
+ }
38
+ assert_equal "Missing from actual: a[1] => {\"b\"=>\"cc\"}.", e.to_s
39
+ end
40
+
41
+ def test_includes_hash_when_should_not
42
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
43
+ assert_includes( {"a" => "b"} , { "a" => { "a" => "aa", "b" => "cc"}} )
44
+ }
45
+ assert_equal "Difference: required <a => \"b\"> was <a => {\"a\"=>\"aa\", \"b\"=>\"cc\"}>.", e.to_s
46
+ end
47
+
48
+ def test_does_not_include_hash_when_it_should
49
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
50
+ assert_includes( { "a" => { "a" => "aa" , "b" => "cc"}}, {"a" => "b"} )
51
+ }
52
+ assert_equal "Difference: required <a => {\"a\"=>\"aa\", \"b\"=>\"cc\"}> was <a => \"b\">.", e.to_s
53
+ end
54
+
55
+ def test_includes_array_when_should_not
56
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
57
+ assert_includes( {"a" => "a"}, { "a" => [ {"a" => "aa"}, {"b" => "cc"}]} )
58
+ }
59
+ assert_equal "Difference: required <a => \"a\"> was <a => [{\"a\"=>\"aa\"}, {\"b\"=>\"cc\"}]>.", e.to_s
60
+ end
61
+
62
+ def test_does_not_include_array_when_it_should
63
+ e = assert_raises( Test::Unit::AssertionFailedError ) {
64
+ assert_includes( {"a" => "b"} , { "a" => { "a" => "aa" , "b" => "cc"}} )
65
+ }
66
+ assert_equal "Difference: required <a => \"b\"> was <a => {\"a\"=>\"aa\", \"b\"=>\"cc\"}>.", e.to_s
67
+ end
68
+
69
+ def test_assert_includes
70
+ assert_includes( {"a" => { "a" => "aa" }}, { "a" => { "a" => "aa" , "b" => "aa"}} )
71
+ end
72
+
73
+ def test_assert_includes2
74
+ assert_raises (Test::Unit::AssertionFailedError) {
75
+ assert_includes( { "a" => { "a" => "aa" , "b" => "cc"}}, {"a" => { "c" => "bb" },"b" => { "c" => "bb" }})
76
+ }
77
+ end
78
+
79
+ def test_assert_includes_array
80
+ assert_includes( ["a"],[ "a","b"] )
81
+ end
82
+
83
+ def test_demonstrate_failure
84
+ assert_raises (Test::Unit::AssertionFailedError) {
85
+ assert_includes(["a","b"],[ "a"])
86
+ }
87
+ end
88
+
89
+ class Trivial
90
+ attr_accessor :name
91
+ def initialize( name )
92
+ @name = name
93
+ end
94
+ end
95
+
96
+ def test_compare_object_tree_to_hash
97
+ assert_includes({"name" => "patrick"}, Trivial.new("patrick"))
98
+ end
99
+
100
+ def test_compare_object_tree_to_hash
101
+ assert_includes({"name" => { "name" => "patrick" }}, Trivial.new(Trivial.new("patrick")))
102
+ end
103
+
104
+
105
+ # TODO:
106
+ # reports an error if either item is not a hash
107
+ # improve error reporting when comparing a hash to an array and vice versa
108
+ # add an enhanced version of assert equals
109
+ end
@@ -0,0 +1,352 @@
1
+
2
+ class TestFormReader2 < Test::Unit::TestCase
3
+ # for each kind of html element
4
+ # * test the parsed html element handles "assert_include" properly
5
+ # * test submit the html element
6
+ # a few important bits:
7
+ # * handle multiple elements in a form properly.
8
+ # i.e. just because a field isn't name="field[]"
9
+ # doesn't mean that multiple params on a field are lost.
10
+ # also, you should be able to have multiple elements with the
11
+ # same name, but different types
12
+ # this should work exactly the same for simple text elements.
13
+ # this will work very differently for select elements,
14
+ # testing of which IMHO is broken
15
+ #
16
+ # More notes from patrick:
17
+ # There are two dimensions of "multiples" on a form
18
+ # * single or multiple elements in the html
19
+ # * a request by the programmer that elements be returned as a array or as a string
20
+ #
21
+ # I have some simple templating constructs in here to help write the tests.
22
+ # I'm not using Narflates b/c this templating is only to support these tests;
23
+ # the FormReader code works on just html
24
+ #
25
+
26
+ include Web::Testing
27
+
28
+ def setup
29
+ @parser = nil
30
+ end
31
+
32
+ def make_form( content )
33
+ @parser = FormReader.new( "<form name='aForm'>" + content + "</form>" )
34
+ end
35
+
36
+ def get_fields
37
+ @parser.get_fields( "aForm" )
38
+ end
39
+
40
+ def merge_fields( edited_fields={} )
41
+ @parser.merge_fields( "aForm", edited_fields )
42
+ end
43
+
44
+ def get_options
45
+ @parser.get_options( "aForm" )
46
+ end
47
+
48
+ def test_blank_form
49
+ make_form ""
50
+ assert_equal( {}, get_fields )
51
+ assert_equal( {}, merge_fields )
52
+ assert_raises( Web::Testing::FieldNotFoundException ) {
53
+ merge_fields( "missing" => "element" )
54
+ }
55
+ end
56
+
57
+
58
+ # -----------------------------------------
59
+ # the text elements should behave similarly
60
+ # -----------------------------------------
61
+
62
+ def test_plain_input
63
+ do_text_tests <<-HTML
64
+ <input name="{name}" value="{value}">
65
+ HTML
66
+ end
67
+
68
+ def test_text
69
+ do_text_tests <<-HTML
70
+ <input type="text" name="{name}" value="{value}">
71
+ HTML
72
+ end
73
+
74
+ def test_password
75
+ do_text_tests <<-HTML
76
+ <input type="password" name="{name}" value="{value}">
77
+ HTML
78
+ end
79
+
80
+ def test_textarea
81
+ do_text_tests <<-HTML
82
+ <textarea name="{name}">
83
+ {value}
84
+ </textarea>
85
+ HTML
86
+ end
87
+
88
+ def test_hidden
89
+ do_text_tests <<-HTML
90
+ <input type="hidden" name="{name}" value="{value}">
91
+ HTML
92
+ end
93
+
94
+ def make_text_field( pattern, name, value )
95
+ pattern.gsub( /\{name\}/i, name ).gsub( /\{value\}/i, value )
96
+ end
97
+
98
+ def do_text_tests( field_pattern )
99
+ make_form( make_text_field( field_pattern, "atextfield", "avalue" ) )
100
+
101
+ assert_includes( { "atextfield" => "avalue" }, get_fields )
102
+ assert_equal( { "atextfield" => ["avalue"] }, merge_fields )
103
+
104
+ assert_equal( { "atextfield" => ["other"] },
105
+ merge_fields( "atextfield" => "other" ) )
106
+ assert_equal( { "atextfield" => ["other"] },
107
+ merge_fields( :atextfield => "other" ) )
108
+
109
+ assert_raises( FormMergeError ) {
110
+ merge_fields( "atextfield" => [ "one", "two" ] )
111
+ }
112
+
113
+ # multiple elements. Note that it doesn't matters
114
+ # how the programmer wants the cgi to return results,
115
+ # s/he still tests multiple elements the same
116
+ # i.e. "field" and "field[]" behave the same
117
+ # when asserting content on a form or merging elements
118
+ make_form( make_text_field( field_pattern, "atextfield[]", "two" ) +
119
+ make_text_field( field_pattern, "atextfield[]", "one" ) )
120
+
121
+ assert_includes( { "atextfield[]" => ["two", "one"] }, get_fields )
122
+ assert_equal( { "atextfield[]" => ["two", "one"] }, merge_fields )
123
+
124
+ make_form( make_text_field( field_pattern, "atextfield", "two" ) +
125
+ make_text_field( field_pattern, "atextfield", "one" ) )
126
+
127
+ assert_includes( { "atextfield" =>["two", "one"] }, get_fields )
128
+ assert_equal( { "atextfield" => ["two", "one"] }, merge_fields )
129
+
130
+ # if you merge a multiple with a string,
131
+ # the string replaces the first element
132
+ # in the multiple
133
+ assert_equal( { "atextfield" => ["first", "one"] },
134
+ merge_fields( :atextfield => "first" ) )
135
+ assert_equal( { "atextfield" => ["first", "second"] },
136
+ merge_fields( :atextfield => ["first", "second"] ) )
137
+ assert_raises( FormMergeError ) {
138
+ merge_fields( :atextfield => ["first", "second", "third"] )
139
+ }
140
+
141
+ end
142
+
143
+ # -----------------------------------------
144
+ # file uploads may be odd
145
+ # -----------------------------------------
146
+
147
+ def test_file
148
+ make_form( make_file_field( "file" ) )
149
+ assert_includes( { "file" => "" }, get_fields )
150
+ ### do browsers send the file field when
151
+ ### nothing was entered?
152
+ assert_equal( {"file" => [""] }, merge_fields )
153
+
154
+ upload = Web::Upload.new( File.new( "test/testfiles/text" ),
155
+ "content-type",
156
+ "original-filename" )
157
+ assert_equal( { "file" => [upload] },
158
+ merge_fields( :file => upload ) )
159
+ end
160
+
161
+ def make_file_field( name )
162
+ "<input type=\"file\" name=\"#{name}\">"
163
+ end
164
+
165
+ # -----------------------------------------
166
+ # use the same api for:
167
+ # single selects and radio buttons
168
+ # multi selects and checkboxes
169
+ # since they more or less are used
170
+ # to say same thing on a form
171
+ # -----------------------------------------
172
+
173
+ def test_select
174
+ do_select_tests <<-HTML
175
+ <select name="{name}">
176
+ {option}<option {checked}selected{endchecked}>{value}</option>{endoption}
177
+ </select>
178
+ HTML
179
+
180
+ do_select_tests <<-HTML
181
+ <select name="{name}">
182
+ {option}<option value="{value}" {checked}selected{endchecked}></option>{endoption}
183
+ </select>
184
+ HTML
185
+ do_multiselect_tests <<-HTML
186
+ <select name="{name}" multiple>
187
+ {option}<option {checked}selected{endchecked}>{value}</option>{endoption}
188
+ </select>
189
+ HTML
190
+
191
+ # select field + select field = two different select fields
192
+
193
+ end
194
+
195
+ def test_radio_and_checkbox
196
+ do_select_tests <<-HTML
197
+ {option}<input type="radio" name="{name}" value="{value}" {checked}checked{endchecked}>{endoption}
198
+ HTML
199
+
200
+ do_select_tests <<-HTML
201
+ <select name="{name}">
202
+ {option}<option value="{value}" {checked}selected{endchecked}></option>{endoption}
203
+ </select>
204
+ HTML
205
+
206
+ do_multiselect_tests <<-HTML
207
+ <select name="{name}" multiple>
208
+ {option}<option {checked}selected{endchecked}>{value}</option>{endoption}
209
+ </select>
210
+ HTML
211
+
212
+ # select field + select field = two different select fields
213
+
214
+ # checkboxes + checkboxes = one big group of checkboxes
215
+ # that can return multiple values
216
+
217
+ # radio buttons + radio buttons = one big group of radio buttons
218
+ # that can return one value
219
+
220
+ # checkboxes + radio buttons = ?????
221
+ end
222
+
223
+ def make_select_field( pattern, name, values )
224
+ pattern.gsub!( /\{NAME\}/i, name )
225
+ pattern =~ /\{OPTION\}(.*)\{ENDOPTION\}/si
226
+ option_pattern = $1
227
+ options = ""
228
+ values.each{ |k,v|
229
+ options += option_pattern.gsub( /\{VALUE\}/i, k ). \
230
+ gsub( if v
231
+ /\{CHECKED\}|\{ENDCHECKED\}/i
232
+ else
233
+ /\{CHECKED\}.*\{ENDCHECKED\}/i
234
+ end, "" )
235
+ }
236
+ pattern.gsub( /\{OPTION\}.*\{ENDOPTION\}/i, options )
237
+ end
238
+
239
+
240
+ def do_select_tests( pattern )
241
+ make_form( make_select_field( pattern,
242
+ "field",
243
+ {"first" => true,
244
+ "second" => false } ) )
245
+
246
+ assert_includes( { "field" => "first" }, get_fields )
247
+ assert_equal( { "field" => ["first"] }, merge_fields )
248
+ assert_equal( { "field" => ["second"] },
249
+ merge_fields( "field" => select("second") ) )
250
+ assert_raises( FormMergeError ) {
251
+ merge_fields( "field" => select("missing value") )
252
+ }
253
+
254
+ assert_raises( FormMergeError ) {
255
+ merge_fields( "field" => select("first", "second") )
256
+ }
257
+
258
+ end
259
+
260
+ def do_multiselect_tests( pattern )
261
+ make_form( make_select_field( pattern,
262
+ "field",
263
+ {"first" => true,
264
+ "second" => false,
265
+ "third" => true } ) )
266
+ assert_includes( { "field" => ["first", "third"] }, get_fields )
267
+ assert_includes( { "field" => ["first", "second", "third"] }, get_options )
268
+ assert_equal( { "field" => ["first", "third"] }, merge_fields )
269
+
270
+ # three cases for merge_fields with selects:
271
+ # using the select function:
272
+ # * a single text value adds to the selected values
273
+ assert_equal( { "field" => ["first", "second", "third" ] },
274
+ merge_fields( "field" => select("second") ) )
275
+ # * an multiples add to the selected values
276
+ assert_equal( { "field" => ["first", "second", "third" ] },
277
+ merge_fields( "field" => select("second","third") ) )
278
+
279
+ # * a hash turns values on and off
280
+ assert_equal( { "field" => ["second", "third"] },
281
+ merge_fields( "field" => {"first" => false,
282
+ "second" => true } ) )
283
+ assert_equal( { "field" => ["second", "third"] },
284
+ merge_fields( "field" => select("first" => false,
285
+ "second" => true ) ) )
286
+
287
+
288
+ assert_raises( FormMergeError ) {
289
+ merge_fields( "field" => "not using select method" )
290
+ }
291
+
292
+ assert_raises( FormMergeError ) {
293
+ merge_fields( "field" => select("missing value") )
294
+ }
295
+
296
+ #assert_raises( FormMergeError ) {
297
+ # merge_fields( "field" => ["first", "second"] )
298
+ #}
299
+
300
+ end
301
+
302
+ # -----------------------------------------
303
+ # test checkboxes as booleans
304
+ # -----------------------------------------
305
+
306
+ def test_boolean_checkbox
307
+ html = ""
308
+
309
+ {"first" => true,
310
+ "second" => false,
311
+ "third" => true }.each{ |k, v|
312
+
313
+ html += "<input type=\"checkbox\" name=\"#{k}\"";
314
+ html += " checked" if (v)
315
+ html += ">";
316
+
317
+ }
318
+
319
+ make_form( html )
320
+
321
+ assert_includes( {"first" => [true ],
322
+ "second" => [false],
323
+ "third" => [true ] }, get_fields )
324
+ assert_equal( {"first" => [true ],
325
+ "third" => [true ] }, merge_fields )
326
+
327
+ # how to check a checkbox...
328
+ assert_equal( {"first" => [true ],
329
+ "second" => [true],
330
+ "third" => [true ] },
331
+ merge_fields( "second" => true ) )
332
+
333
+ # how to uncheck a check box
334
+ assert_equal( {"second" => [true],
335
+ "third" => [true ] },
336
+ merge_fields( "first" => false,
337
+ "second" => true ) )
338
+
339
+ end
340
+
341
+ # -----------------------------------------
342
+ # test blending different kinds
343
+ # of elements into the same
344
+ # "field" or "field[]"
345
+ # -----------------------------------------
346
+
347
+ # -----------------------------------------
348
+ # test fields with narflate style names,
349
+ # i.e. "field[1].name" / etc
350
+ # -----------------------------------------
351
+
352
+ end