stupidedi 1.1.0

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 (500) hide show
  1. data/README.md +215 -0
  2. data/Rakefile +108 -0
  3. data/bin/edi-ed +71 -0
  4. data/bin/edi-pp +81 -0
  5. data/doc/Defining.md +0 -0
  6. data/doc/Generating.md +321 -0
  7. data/doc/LICENSE.md +0 -0
  8. data/doc/Navigating.md +645 -0
  9. data/doc/Parsing.md +0 -0
  10. data/doc/Serializing.md +7 -0
  11. data/doc/Tokenizing.md +0 -0
  12. data/doc/Validating.md +0 -0
  13. data/doc/design/Parser.md +0 -0
  14. data/doc/design/Reader.md +0 -0
  15. data/lib/ruby/array.rb +164 -0
  16. data/lib/ruby/blank.rb +67 -0
  17. data/lib/ruby/enumerable.rb +35 -0
  18. data/lib/ruby/exception.rb +33 -0
  19. data/lib/ruby/hash.rb +4 -0
  20. data/lib/ruby/instance_exec.rb +26 -0
  21. data/lib/ruby/module.rb +79 -0
  22. data/lib/ruby/object.rb +63 -0
  23. data/lib/ruby/string.rb +73 -0
  24. data/lib/ruby/symbol.rb +24 -0
  25. data/lib/ruby/to_d.rb +81 -0
  26. data/lib/ruby/to_date.rb +33 -0
  27. data/lib/ruby/to_time.rb +24 -0
  28. data/lib/ruby/try.rb +43 -0
  29. data/lib/stupidedi/blank_slate.rb +11 -0
  30. data/lib/stupidedi/builder/builder_dsl.rb +281 -0
  31. data/lib/stupidedi/builder/constraint_table.rb +418 -0
  32. data/lib/stupidedi/builder/generation.rb +112 -0
  33. data/lib/stupidedi/builder/instruction.rb +102 -0
  34. data/lib/stupidedi/builder/instruction_table.rb +204 -0
  35. data/lib/stupidedi/builder/navigation.rb +655 -0
  36. data/lib/stupidedi/builder/state_machine.rb +55 -0
  37. data/lib/stupidedi/builder/states/abstract_state.rb +332 -0
  38. data/lib/stupidedi/builder/states/failure_state.rb +69 -0
  39. data/lib/stupidedi/builder/states/functional_group_state.rb +97 -0
  40. data/lib/stupidedi/builder/states/initial_state.rb +63 -0
  41. data/lib/stupidedi/builder/states/interchange_state.rb +94 -0
  42. data/lib/stupidedi/builder/states/loop_state.rb +79 -0
  43. data/lib/stupidedi/builder/states/table_state.rb +96 -0
  44. data/lib/stupidedi/builder/states/transaction_set_state.rb +112 -0
  45. data/lib/stupidedi/builder/states/transmission_state.rb +59 -0
  46. data/lib/stupidedi/builder/tokenization.rb +196 -0
  47. data/lib/stupidedi/builder.rb +23 -0
  48. data/lib/stupidedi/color.rb +93 -0
  49. data/lib/stupidedi/config/code_list_config.rb +42 -0
  50. data/lib/stupidedi/config/editor_config.rb +51 -0
  51. data/lib/stupidedi/config/functional_group_config.rb +62 -0
  52. data/lib/stupidedi/config/interchange_config.rb +79 -0
  53. data/lib/stupidedi/config/transaction_set_config.rb +91 -0
  54. data/lib/stupidedi/config.rb +101 -0
  55. data/lib/stupidedi/editor/00501.rb +341 -0
  56. data/lib/stupidedi/editor/005010/N2.rb +0 -0
  57. data/lib/stupidedi/editor/005010/N3.rb +0 -0
  58. data/lib/stupidedi/editor/005010/N4.rb +63 -0
  59. data/lib/stupidedi/editor/005010/NM1.rb +0 -0
  60. data/lib/stupidedi/editor/005010.rb +469 -0
  61. data/lib/stupidedi/editor/X222-HC837.rb +195 -0
  62. data/lib/stupidedi/editor/abstract_ed.rb +36 -0
  63. data/lib/stupidedi/editor/claim_ack.rb +9 -0
  64. data/lib/stupidedi/editor/implementation_ack.rb +213 -0
  65. data/lib/stupidedi/editor/interchange_ack.rb +9 -0
  66. data/lib/stupidedi/editor/result.rb +100 -0
  67. data/lib/stupidedi/editor/result_set.rb +69 -0
  68. data/lib/stupidedi/editor/transaction_set_ed.rb +275 -0
  69. data/lib/stupidedi/editor/transmission_ed.rb +90 -0
  70. data/lib/stupidedi/editor.rb +37 -0
  71. data/lib/stupidedi/either.rb +287 -0
  72. data/lib/stupidedi/exceptions/invalid_element_error.rb +8 -0
  73. data/lib/stupidedi/exceptions/invalid_schema_error.rb +8 -0
  74. data/lib/stupidedi/exceptions/output_error.rb +8 -0
  75. data/lib/stupidedi/exceptions/parse_error.rb +8 -0
  76. data/lib/stupidedi/exceptions/stupidedi_error.rb +8 -0
  77. data/lib/stupidedi/exceptions/tokenize_error.rb +8 -0
  78. data/lib/stupidedi/exceptions/zipper_error.rb +8 -0
  79. data/lib/stupidedi/exceptions.rb +11 -0
  80. data/lib/stupidedi/guides/005010/X214-HN277.rb +409 -0
  81. data/lib/stupidedi/guides/005010/X221-HP835.rb +613 -0
  82. data/lib/stupidedi/guides/005010/X221A1-HP835.rb +613 -0
  83. data/lib/stupidedi/guides/005010/X222-HC837P.rb +2291 -0
  84. data/lib/stupidedi/guides/005010/X222A1-HC837P.rb +2297 -0
  85. data/lib/stupidedi/guides/005010/X231-FA999.rb +123 -0
  86. data/lib/stupidedi/guides/005010/X231A1-FA999.rb +119 -0
  87. data/lib/stupidedi/guides/005010/element_reqs.rb +38 -0
  88. data/lib/stupidedi/guides/005010/guide_builder.rb +180 -0
  89. data/lib/stupidedi/guides/005010/segment_reqs.rb +32 -0
  90. data/lib/stupidedi/guides/005010.rb +64 -0
  91. data/lib/stupidedi/guides.rb +5 -0
  92. data/lib/stupidedi/inspect.rb +26 -0
  93. data/lib/stupidedi/reader/input/abstract_input.rb +133 -0
  94. data/lib/stupidedi/reader/input/delegated_input.rb +111 -0
  95. data/lib/stupidedi/reader/input/file_input.rb +155 -0
  96. data/lib/stupidedi/reader/input.rb +30 -0
  97. data/lib/stupidedi/reader/position.rb +69 -0
  98. data/lib/stupidedi/reader/result.rb +168 -0
  99. data/lib/stupidedi/reader/segment_dict.rb +175 -0
  100. data/lib/stupidedi/reader/separators.rb +85 -0
  101. data/lib/stupidedi/reader/stream_reader.rb +172 -0
  102. data/lib/stupidedi/reader/token_reader.rb +466 -0
  103. data/lib/stupidedi/reader/tokens/component_element_tok.rb +56 -0
  104. data/lib/stupidedi/reader/tokens/composite_element_tok.rb +64 -0
  105. data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +64 -0
  106. data/lib/stupidedi/reader/tokens/segment_tok.rb +51 -0
  107. data/lib/stupidedi/reader/tokens/simple_element_tok.rb +63 -0
  108. data/lib/stupidedi/reader.rb +121 -0
  109. data/lib/stupidedi/schema/abstract_def.rb +74 -0
  110. data/lib/stupidedi/schema/abstract_use.rb +73 -0
  111. data/lib/stupidedi/schema/code_list.rb +94 -0
  112. data/lib/stupidedi/schema/element_def.rb +173 -0
  113. data/lib/stupidedi/schema/element_req.rb +56 -0
  114. data/lib/stupidedi/schema/element_use.rb +251 -0
  115. data/lib/stupidedi/schema/functional_group_def.rb +114 -0
  116. data/lib/stupidedi/schema/interchange_def.rb +93 -0
  117. data/lib/stupidedi/schema/loop_def.rb +152 -0
  118. data/lib/stupidedi/schema/repeat_count.rb +85 -0
  119. data/lib/stupidedi/schema/segment_def.rb +108 -0
  120. data/lib/stupidedi/schema/segment_req.rb +43 -0
  121. data/lib/stupidedi/schema/segment_use.rb +98 -0
  122. data/lib/stupidedi/schema/syntax_note.rb +63 -0
  123. data/lib/stupidedi/schema/table_def.rb +139 -0
  124. data/lib/stupidedi/schema/transaction_set_def.rb +88 -0
  125. data/lib/stupidedi/schema.rb +28 -0
  126. data/lib/stupidedi/sets/absolute_set.rb +297 -0
  127. data/lib/stupidedi/sets/abstract_set.rb +174 -0
  128. data/lib/stupidedi/sets/null_set.rb +125 -0
  129. data/lib/stupidedi/sets/relative_complement.rb +137 -0
  130. data/lib/stupidedi/sets/relative_set.rb +269 -0
  131. data/lib/stupidedi/sets/universal_set.rb +104 -0
  132. data/lib/stupidedi/sets.rb +57 -0
  133. data/lib/stupidedi/tail_call.rb +109 -0
  134. data/lib/stupidedi/thread_local.rb +174 -0
  135. data/lib/stupidedi/values/abstract_element_val.rb +19 -0
  136. data/lib/stupidedi/values/abstract_val.rb +130 -0
  137. data/lib/stupidedi/values/composite_element_val.rb +95 -0
  138. data/lib/stupidedi/values/functional_group_val.rb +102 -0
  139. data/lib/stupidedi/values/interchange_val.rb +86 -0
  140. data/lib/stupidedi/values/invalid_envelope_val.rb +61 -0
  141. data/lib/stupidedi/values/invalid_segment_val.rb +78 -0
  142. data/lib/stupidedi/values/loop_val.rb +70 -0
  143. data/lib/stupidedi/values/repeated_element_val.rb +105 -0
  144. data/lib/stupidedi/values/segment_val.rb +104 -0
  145. data/lib/stupidedi/values/segment_val_group.rb +20 -0
  146. data/lib/stupidedi/values/simple_element_val.rb +80 -0
  147. data/lib/stupidedi/values/table_val.rb +66 -0
  148. data/lib/stupidedi/values/transaction_set_val.rb +66 -0
  149. data/lib/stupidedi/values/transmission_val.rb +52 -0
  150. data/lib/stupidedi/values.rb +21 -0
  151. data/lib/stupidedi/version.rb +3 -0
  152. data/lib/stupidedi/versions/functional_groups/004010/element_defs.rb +54 -0
  153. data/lib/stupidedi/versions/functional_groups/004010/element_reqs.rb +18 -0
  154. data/lib/stupidedi/versions/functional_groups/004010/element_types/date_val.rb +527 -0
  155. data/lib/stupidedi/versions/functional_groups/004010/element_types/fixnum_val.rb +335 -0
  156. data/lib/stupidedi/versions/functional_groups/004010/element_types/float_val.rb +299 -0
  157. data/lib/stupidedi/versions/functional_groups/004010/element_types/identifier_val.rb +287 -0
  158. data/lib/stupidedi/versions/functional_groups/004010/element_types/string_val.rb +338 -0
  159. data/lib/stupidedi/versions/functional_groups/004010/element_types/time_val.rb +309 -0
  160. data/lib/stupidedi/versions/functional_groups/004010/element_types.rb +124 -0
  161. data/lib/stupidedi/versions/functional_groups/004010/functional_group_def.rb +30 -0
  162. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GE.rb +20 -0
  163. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GS.rb +27 -0
  164. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SE.rb +20 -0
  165. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/ST.rb +20 -0
  166. data/lib/stupidedi/versions/functional_groups/004010/segment_defs.rb +23 -0
  167. data/lib/stupidedi/versions/functional_groups/004010/segment_reqs.rb +18 -0
  168. data/lib/stupidedi/versions/functional_groups/004010/syntax_notes.rb +174 -0
  169. data/lib/stupidedi/versions/functional_groups/004010.rb +38 -0
  170. data/lib/stupidedi/versions/functional_groups/005010/element_defs.rb +1405 -0
  171. data/lib/stupidedi/versions/functional_groups/005010/element_reqs.rb +18 -0
  172. data/lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb +577 -0
  173. data/lib/stupidedi/versions/functional_groups/005010/element_types/fixnum_val.rb +322 -0
  174. data/lib/stupidedi/versions/functional_groups/005010/element_types/float_val.rb +354 -0
  175. data/lib/stupidedi/versions/functional_groups/005010/element_types/identifier_val.rb +368 -0
  176. data/lib/stupidedi/versions/functional_groups/005010/element_types/operators.rb +117 -0
  177. data/lib/stupidedi/versions/functional_groups/005010/element_types/string_val.rb +398 -0
  178. data/lib/stupidedi/versions/functional_groups/005010/element_types/time_val.rb +327 -0
  179. data/lib/stupidedi/versions/functional_groups/005010/element_types.rb +132 -0
  180. data/lib/stupidedi/versions/functional_groups/005010/functional_group_def.rb +30 -0
  181. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK1.rb +21 -0
  182. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK2.rb +21 -0
  183. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK9.rb +28 -0
  184. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AMT.rb +21 -0
  185. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BHT.rb +24 -0
  186. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BPR.rb +49 -0
  187. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CAS.rb +56 -0
  188. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CL1.rb +22 -0
  189. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLM.rb +41 -0
  190. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLP.rb +34 -0
  191. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CN1.rb +24 -0
  192. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR1.rb +32 -0
  193. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR2.rb +35 -0
  194. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR3.rb +25 -0
  195. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CRC.rb +26 -0
  196. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTP.rb +36 -0
  197. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTX.rb +24 -0
  198. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CUR.rb +57 -0
  199. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DMG.rb +34 -0
  200. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN1.rb +22 -0
  201. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN2.rb +24 -0
  202. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTM.rb +24 -0
  203. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTP.rb +21 -0
  204. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/FRM.rb +25 -0
  205. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GE.rb +20 -0
  206. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GS.rb +27 -0
  207. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HCP.rb +39 -0
  208. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HI.rb +31 -0
  209. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HL.rb +22 -0
  210. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK3.rb +22 -0
  211. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK4.rb +22 -0
  212. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK5.rb +24 -0
  213. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/K3.rb +21 -0
  214. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LIN.rb +69 -0
  215. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LQ.rb +22 -0
  216. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LX.rb +19 -0
  217. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MEA.rb +39 -0
  218. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MIA.rb +45 -0
  219. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MOA.rb +28 -0
  220. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N1.rb +24 -0
  221. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N2.rb +20 -0
  222. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N3.rb +20 -0
  223. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N4.rb +30 -0
  224. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NM1.rb +35 -0
  225. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NTE.rb +20 -0
  226. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/OI.rb +24 -0
  227. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PAT.rb +31 -0
  228. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PER.rb +32 -0
  229. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PLB.rb +40 -0
  230. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PRV.rb +26 -0
  231. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PS1.rb +21 -0
  232. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PWK.rb +30 -0
  233. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/QTY.rb +25 -0
  234. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/RDM.rb +23 -0
  235. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/REF.rb +23 -0
  236. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SBR.rb +28 -0
  237. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SE.rb +20 -0
  238. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/ST.rb +21 -0
  239. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/STC.rb +30 -0
  240. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV1.rb +44 -0
  241. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV2.rb +29 -0
  242. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV3.rb +30 -0
  243. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV5.rb +29 -0
  244. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVC.rb +26 -0
  245. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVD.rb +24 -0
  246. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TOO.rb +21 -0
  247. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TRN.rb +22 -0
  248. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS2.rb +40 -0
  249. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS3.rb +45 -0
  250. data/lib/stupidedi/versions/functional_groups/005010/segment_defs.rb +227 -0
  251. data/lib/stupidedi/versions/functional_groups/005010/segment_reqs.rb +18 -0
  252. data/lib/stupidedi/versions/functional_groups/005010/syntax_notes.rb +165 -0
  253. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/FA999.rb +38 -0
  254. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HB271.rb +85 -0
  255. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HC837.rb +163 -0
  256. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HI278.rb +64 -0
  257. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HN277.rb +74 -0
  258. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HP835.rb +68 -0
  259. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HR276.rb +57 -0
  260. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HS270.rb +53 -0
  261. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/RA820.rb +240 -0
  262. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs.rb +68 -0
  263. data/lib/stupidedi/versions/functional_groups/005010.rb +38 -0
  264. data/lib/stupidedi/versions/functional_groups.rb +8 -0
  265. data/lib/stupidedi/versions/interchanges/00401/element_defs.rb +224 -0
  266. data/lib/stupidedi/versions/interchanges/00401/interchange_def.rb +45 -0
  267. data/lib/stupidedi/versions/interchanges/00401/segment_defs/IEA.rb +20 -0
  268. data/lib/stupidedi/versions/interchanges/00401/segment_defs/ISA.rb +34 -0
  269. data/lib/stupidedi/versions/interchanges/00401/segment_defs/TA1.rb +23 -0
  270. data/lib/stupidedi/versions/interchanges/00401/segment_defs.rb +28 -0
  271. data/lib/stupidedi/versions/interchanges/00401.rb +23 -0
  272. data/lib/stupidedi/versions/interchanges/00501/element_defs.rb +269 -0
  273. data/lib/stupidedi/versions/interchanges/00501/interchange_def.rb +47 -0
  274. data/lib/stupidedi/versions/interchanges/00501/segment_defs/IEA.rb +20 -0
  275. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISA.rb +34 -0
  276. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISB.rb +18 -0
  277. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISE.rb +18 -0
  278. data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA1.rb +23 -0
  279. data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA3.rb +18 -0
  280. data/lib/stupidedi/versions/interchanges/00501/segment_defs.rb +37 -0
  281. data/lib/stupidedi/versions/interchanges/00501.rb +23 -0
  282. data/lib/stupidedi/versions/interchanges.rb +8 -0
  283. data/lib/stupidedi/versions.rb +6 -0
  284. data/lib/stupidedi/writer/claredi.rb +142 -0
  285. data/lib/stupidedi/writer/default.rb +124 -0
  286. data/lib/stupidedi/writer.rb +6 -0
  287. data/lib/stupidedi/zipper/abstract_cursor.rb +351 -0
  288. data/lib/stupidedi/zipper/dangling_cursor.rb +103 -0
  289. data/lib/stupidedi/zipper/edited_cursor.rb +157 -0
  290. data/lib/stupidedi/zipper/memoized_cursor.rb +131 -0
  291. data/lib/stupidedi/zipper/path.rb +124 -0
  292. data/lib/stupidedi/zipper/root_cursor.rb +120 -0
  293. data/lib/stupidedi/zipper.rb +25 -0
  294. data/lib/stupidedi.rb +66 -0
  295. data/spec/examples/integration/generating.example +551 -0
  296. data/spec/examples/integration/navigating.example +214 -0
  297. data/spec/examples/integration/parsing.example +445 -0
  298. data/spec/examples/ruby/array.example +476 -0
  299. data/spec/examples/ruby/blank.example +62 -0
  300. data/spec/examples/ruby/count.example +68 -0
  301. data/spec/examples/ruby/object.example +99 -0
  302. data/spec/examples/ruby/string.example +111 -0
  303. data/spec/examples/ruby/symbol.example +117 -0
  304. data/spec/examples/ruby/to_d.example +90 -0
  305. data/spec/examples/ruby/try.example +50 -0
  306. data/spec/examples/stupidedi/either.example +375 -0
  307. data/spec/examples/stupidedi/reader/failure.example +68 -0
  308. data/spec/examples/stupidedi/reader/input/delegated_input.example +292 -0
  309. data/spec/examples/stupidedi/reader/separators.example +73 -0
  310. data/spec/examples/stupidedi/reader/stream_reader.example +48 -0
  311. data/spec/examples/stupidedi/reader/success.example +34 -0
  312. data/spec/examples/stupidedi/reader/token_reader.example +775 -0
  313. data/spec/examples/stupidedi/reader.example +168 -0
  314. data/spec/examples/stupidedi/sets/absolute_set.example +1577 -0
  315. data/spec/examples/stupidedi/sets/null_set.example +2 -0
  316. data/spec/examples/stupidedi/sets/relative_set.example +2 -0
  317. data/spec/examples/stupidedi/sets/universal_set.example +1 -0
  318. data/spec/examples/stupidedi/versions/005010/element_types/an.example +201 -0
  319. data/spec/examples/stupidedi/versions/005010/element_types/dt.example +258 -0
  320. data/spec/examples/stupidedi/versions/005010/element_types/id.example +192 -0
  321. data/spec/examples/stupidedi/versions/005010/element_types/nn.example +177 -0
  322. data/spec/examples/stupidedi/versions/005010/element_types/r.example +178 -0
  323. data/spec/examples/stupidedi/versions/005010/element_types/tm.example +2 -0
  324. data/spec/examples/stupidedi/zipper/abstract_cursor.example +417 -0
  325. data/spec/examples/stupidedi/zipper.example +9 -0
  326. data/spec/fixtures/X186-AG824/1-bad.txt +21 -0
  327. data/spec/fixtures/X186-AG824/1-good.txt +17 -0
  328. data/spec/fixtures/X186-AG824/2-bad.txt +26 -0
  329. data/spec/fixtures/X186-AG824/2-good.txt +21 -0
  330. data/spec/fixtures/X186-AG824/3-bad.txt +87 -0
  331. data/spec/fixtures/X186-AG824/3-good.txt +61 -0
  332. data/spec/fixtures/X212-HN277/1-bad.txt +54 -0
  333. data/spec/fixtures/X212-HN277/1-good.txt +46 -0
  334. data/spec/fixtures/X212-HN277/2-bad.txt +37 -0
  335. data/spec/fixtures/X212-HN277/2-good.txt +29 -0
  336. data/spec/fixtures/X212-HN277/3-bad.txt +22 -0
  337. data/spec/fixtures/X212-HN277/3-good.txt +17 -0
  338. data/spec/fixtures/X212-HN277/4-bad.txt +30 -0
  339. data/spec/fixtures/X212-HN277/4-good.txt +24 -0
  340. data/spec/fixtures/X212-HR276/1-bad.txt +53 -0
  341. data/spec/fixtures/X212-HR276/1-good.txt +46 -0
  342. data/spec/fixtures/X212-HR276/2-bad.txt +45 -0
  343. data/spec/fixtures/X212-HR276/2-good.txt +38 -0
  344. data/spec/fixtures/X212-HR276/3-bad.txt +32 -0
  345. data/spec/fixtures/X212-HR276/3-good.txt +26 -0
  346. data/spec/fixtures/X212-HR276/4-bad.txt +32 -0
  347. data/spec/fixtures/X212-HR276/4-good.txt +26 -0
  348. data/spec/fixtures/X214-HN277/1-bad.txt +58 -0
  349. data/spec/fixtures/X214-HN277/1-good.txt +47 -0
  350. data/spec/fixtures/X214-HN277/2-bad.txt +34 -0
  351. data/spec/fixtures/X214-HN277/2-good.txt +22 -0
  352. data/spec/fixtures/X214-HN277/3-bad.txt +64 -0
  353. data/spec/fixtures/X214-HN277/3-good.txt +54 -0
  354. data/spec/fixtures/X214-HN277/4-bad.txt +77 -0
  355. data/spec/fixtures/X214-HN277/4-good.txt +63 -0
  356. data/spec/fixtures/X216-HI278/1-bad.txt +42 -0
  357. data/spec/fixtures/X216-HI278/1-good.txt +27 -0
  358. data/spec/fixtures/X216-HI278/2-bad.txt +43 -0
  359. data/spec/fixtures/X216-HI278/2-good.txt +29 -0
  360. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1.txt +24 -0
  361. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1_Clean.txt +20 -0
  362. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2.txt +46 -0
  363. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2_Clean.txt +30 -0
  364. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3.txt +38 -0
  365. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3_Clean.txt +24 -0
  366. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a.txt +39 -0
  367. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a_Clean.txt +24 -0
  368. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b.txt +43 -0
  369. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b_Clean.txt +25 -0
  370. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5.txt +63 -0
  371. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5_Clean.txt +41 -0
  372. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6.txt +36 -0
  373. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6_Clean.txt +20 -0
  374. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r.txt +34 -0
  375. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r_Clean.txt +23 -0
  376. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r.txt +46 -0
  377. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r_Clean.txt +31 -0
  378. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r.txt +44 -0
  379. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r_Clean.txt +26 -0
  380. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4ar_Clean.txt +28 -0
  381. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4br_Clean.txt +35 -0
  382. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r.txt +60 -0
  383. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r_Clean.txt +42 -0
  384. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r.txt +40 -0
  385. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r_Clean.txt +24 -0
  386. data/spec/fixtures/X218-RA820/1-bad.txt +31 -0
  387. data/spec/fixtures/X218-RA820/1-good.txt +25 -0
  388. data/spec/fixtures/X218-RA820/2-bad.txt +37 -0
  389. data/spec/fixtures/X218-RA820/2-good.txt +29 -0
  390. data/spec/fixtures/X218-RA820/3-bad.txt +29 -0
  391. data/spec/fixtures/X218-RA820/3-good.txt +23 -0
  392. data/spec/fixtures/X218-RA820/4-bad.txt +36 -0
  393. data/spec/fixtures/X218-RA820/4-good.txt +27 -0
  394. data/spec/fixtures/X220-BE834/1-bad.txt +35 -0
  395. data/spec/fixtures/X220-BE834/1-good.txt +29 -0
  396. data/spec/fixtures/X220-BE834/10-bad.txt +26 -0
  397. data/spec/fixtures/X220-BE834/10-good.txt +19 -0
  398. data/spec/fixtures/X220-BE834/2-bad.txt +31 -0
  399. data/spec/fixtures/X220-BE834/2-good.txt +23 -0
  400. data/spec/fixtures/X220-BE834/3-bad.txt +36 -0
  401. data/spec/fixtures/X220-BE834/3-good.txt +26 -0
  402. data/spec/fixtures/X220-BE834/4-bad.txt +27 -0
  403. data/spec/fixtures/X220-BE834/4-good.txt +21 -0
  404. data/spec/fixtures/X220-BE834/5-bad.txt +26 -0
  405. data/spec/fixtures/X220-BE834/5-good.txt +17 -0
  406. data/spec/fixtures/X220-BE834/6-bad.txt +25 -0
  407. data/spec/fixtures/X220-BE834/6-good.txt +20 -0
  408. data/spec/fixtures/X220-BE834/7-bad.txt +25 -0
  409. data/spec/fixtures/X220-BE834/7-good.txt +20 -0
  410. data/spec/fixtures/X220-BE834/8-bad.txt +25 -0
  411. data/spec/fixtures/X220-BE834/8-good.txt +20 -0
  412. data/spec/fixtures/X220-BE834/9-bad.txt +27 -0
  413. data/spec/fixtures/X220-BE834/9-good.txt +21 -0
  414. data/spec/fixtures/X221-HP835/1-bad.txt +58 -0
  415. data/spec/fixtures/X221-HP835/1-good.txt +40 -0
  416. data/spec/fixtures/X221-HP835/2-bad.txt +51 -0
  417. data/spec/fixtures/X221-HP835/2-good.txt +40 -0
  418. data/spec/fixtures/X221-HP835/3a-bad.txt +78 -0
  419. data/spec/fixtures/X221-HP835/3a-good.txt +49 -0
  420. data/spec/fixtures/X221-HP835/3b-bad.txt +60 -0
  421. data/spec/fixtures/X221-HP835/3b-good.txt +32 -0
  422. data/spec/fixtures/X221-HP835/3c-bad.txt +55 -0
  423. data/spec/fixtures/X221-HP835/3c-good.txt +34 -0
  424. data/spec/fixtures/X222-HC837/1-bad.txt +60 -0
  425. data/spec/fixtures/X222-HC837/1-good.txt +53 -0
  426. data/spec/fixtures/X222-HC837/10a-bad.txt +52 -0
  427. data/spec/fixtures/X222-HC837/10a-good.txt +40 -0
  428. data/spec/fixtures/X222-HC837/10b-bad.txt +99 -0
  429. data/spec/fixtures/X222-HC837/10b-good.txt +80 -0
  430. data/spec/fixtures/X222-HC837/10c-bad.txt +105 -0
  431. data/spec/fixtures/X222-HC837/10c-good.txt +80 -0
  432. data/spec/fixtures/X222-HC837/11-bad.txt +69 -0
  433. data/spec/fixtures/X222-HC837/11-good.txt +45 -0
  434. data/spec/fixtures/X222-HC837/12-bad.txt +73 -0
  435. data/spec/fixtures/X222-HC837/12-good.txt +51 -0
  436. data/spec/fixtures/X222-HC837/13-bad.txt +64 -0
  437. data/spec/fixtures/X222-HC837/13-good.txt +46 -0
  438. data/spec/fixtures/X222-HC837/3a-bad.txt +83 -0
  439. data/spec/fixtures/X222-HC837/3a-good.txt +59 -0
  440. data/spec/fixtures/X222-HC837/3b-bad.txt +97 -0
  441. data/spec/fixtures/X222-HC837/3b-good.txt +70 -0
  442. data/spec/fixtures/X222-HC837/3c-bad.txt +95 -0
  443. data/spec/fixtures/X222-HC837/3c-good.txt +74 -0
  444. data/spec/fixtures/X222-HC837/4-bad.txt +67 -0
  445. data/spec/fixtures/X222-HC837/4-good.txt +48 -0
  446. data/spec/fixtures/X222-HC837/5-bad.txt +73 -0
  447. data/spec/fixtures/X222-HC837/5-good.txt +60 -0
  448. data/spec/fixtures/X222-HC837/6-bad.txt +50 -0
  449. data/spec/fixtures/X222-HC837/6-good.txt +39 -0
  450. data/spec/fixtures/X222-HC837/7-bad.txt +93 -0
  451. data/spec/fixtures/X222-HC837/7-good.txt +78 -0
  452. data/spec/fixtures/X222-HC837/8-bad.txt +64 -0
  453. data/spec/fixtures/X222-HC837/8-good.txt +52 -0
  454. data/spec/fixtures/X222-HC837/9-bad.txt +56 -0
  455. data/spec/fixtures/X222-HC837/9-good.txt +38 -0
  456. data/spec/fixtures/X223-HC837/1-bad.txt +66 -0
  457. data/spec/fixtures/X223-HC837/1-good.txt +53 -0
  458. data/spec/fixtures/X223-HC837/2-bad.txt +69 -0
  459. data/spec/fixtures/X223-HC837/2-good.txt +60 -0
  460. data/spec/fixtures/X223-HC837/3-bad.txt +89 -0
  461. data/spec/fixtures/X223-HC837/3-good.txt +61 -0
  462. data/spec/fixtures/X223-HC837/4-bad.txt +60 -0
  463. data/spec/fixtures/X223-HC837/4-good.txt +40 -0
  464. data/spec/fixtures/X223-HC837/5-bad.txt +75 -0
  465. data/spec/fixtures/X223-HC837/5-good.txt +58 -0
  466. data/spec/fixtures/X224-HC837/1-bad.txt +54 -0
  467. data/spec/fixtures/X224-HC837/1-good.txt +44 -0
  468. data/spec/fixtures/X224-HC837/2a-bad.txt +52 -0
  469. data/spec/fixtures/X224-HC837/2a-good.txt +42 -0
  470. data/spec/fixtures/X224-HC837/2b-bad.txt +67 -0
  471. data/spec/fixtures/X224-HC837/2b-good.txt +52 -0
  472. data/spec/fixtures/X224-HC837/3-bad.txt +67 -0
  473. data/spec/fixtures/X224-HC837/3-good.txt +51 -0
  474. data/spec/fixtures/X224-HC837/4-bad.txt +49 -0
  475. data/spec/fixtures/X224-HC837/4-good.txt +40 -0
  476. data/spec/fixtures/X230-FA997/1-bad.txt +19 -0
  477. data/spec/fixtures/X230-FA997/1-good.txt +16 -0
  478. data/spec/fixtures/X231-FA999/1-bad.txt +20 -0
  479. data/spec/fixtures/X231-FA999/1-good.txt +20 -0
  480. data/spec/fixtures/X279-HB271/1-bad.txt +36 -0
  481. data/spec/fixtures/X279-HB271/1-good.txt +30 -0
  482. data/spec/fixtures/X279-HB271/2-bad.txt +22 -0
  483. data/spec/fixtures/X279-HB271/2-good.txt +16 -0
  484. data/spec/fixtures/X279-HB271/3-bad.txt +44 -0
  485. data/spec/fixtures/X279-HB271/3-good.txt +36 -0
  486. data/spec/fixtures/X279-HS270/1-bad.txt +29 -0
  487. data/spec/fixtures/X279-HS270/1-good.txt +23 -0
  488. data/spec/fixtures/X279-HS270/2-bad.txt +32 -0
  489. data/spec/fixtures/X279-HS270/2-good.txt +25 -0
  490. data/spec/spec_helper.rb +34 -0
  491. data/spec/support/fixtures.rb +26 -0
  492. data/spec/support/matchers/either_matchers.rb +26 -0
  493. data/spec/support/matchers/navigation_matchers.rb +247 -0
  494. data/spec/support/node.rb +41 -0
  495. data/spec/support/quickcheck/characters.rb +28 -0
  496. data/spec/support/quickcheck/property.rb +105 -0
  497. data/spec/support/quickcheck/serialized_edi.rb +399 -0
  498. data/spec/support/quickcheck.rb +302 -0
  499. data/spec/support/rcov.rb +34 -0
  500. metadata +577 -0
@@ -0,0 +1,476 @@
1
+ require 'spec_helper'
2
+
3
+ describe Array do
4
+ include QuickCheck::Macro
5
+
6
+ # Creates an array with length `2*n-1` containing elements
7
+ # 1, 2, 3, ..., n-1, n, n-1, ..., 3, 2, 1
8
+ def mkarray(n)
9
+ (1..n).to_a.bind{|as| as.concat(as.init.reverse) }
10
+ end
11
+
12
+ describe "#defined_at?(n)" do
13
+ context "on an empty array" do
14
+ property("is false") do
15
+ integer
16
+ end.check{|n| [].should_not be_defined_at(n) }
17
+ end
18
+ end
19
+
20
+ describe "#head" do
21
+ context "of an empty array" do
22
+ it "is an error" do
23
+ lambda { [].head }.should raise_error
24
+ end
25
+ end
26
+
27
+ context "of a one-element array" do
28
+ it "is the first element" do
29
+ [1].head.should == 1
30
+ end
31
+
32
+ property("is the first element") do
33
+ integer
34
+ end.check{|x| [x].head.should == x }
35
+ end
36
+
37
+ context "of a two-element array" do
38
+ it "is the first element" do
39
+ [1, 2].head.should == 1
40
+ end
41
+
42
+ property("is the first element") do
43
+ [integer, integer]
44
+ end.check{|x,y| [x,y].head.should == x }
45
+ end
46
+ end
47
+
48
+ describe "#tail(n)" do
49
+ context "of an empty array" do
50
+ it "is an empty array" do
51
+ [].tail.should == []
52
+ end
53
+ end
54
+
55
+ context "of a one-element array" do
56
+ it "is an empty array" do
57
+ [1].tail.should == []
58
+ end
59
+
60
+ property("is an empty array") do
61
+ integer
62
+ end.check{|x| [x].tail.should == [] }
63
+ end
64
+
65
+ context "of a two-element array" do
66
+ it "contains only the second element" do
67
+ [1, 2].tail.should == [2]
68
+ end
69
+
70
+ property("contains only the second element") do
71
+ [integer, integer]
72
+ end.check{|x,y| [x,y].tail.should == [y] }
73
+ end
74
+ end
75
+
76
+ describe "#init(n)" do
77
+ context "of an empty array" do
78
+ it "is an empty array" do
79
+ [].init.should == []
80
+ end
81
+ end
82
+
83
+ context "of a one-element array" do
84
+ it "is an empty array" do
85
+ [1].init.should == []
86
+ end
87
+
88
+ property("is an empty array") do
89
+ integer
90
+ end.check{|x| [x].init.should == [] }
91
+ end
92
+
93
+ context "of a two-element array" do
94
+ it "contains only the first element" do
95
+ [1, 2].init.should == [1]
96
+ end
97
+
98
+ property("contains only the first element") do
99
+ [integer, integer]
100
+ end.check{|x,y| [x,y].init.should == [x] }
101
+ end
102
+ end
103
+
104
+ describe "#drop(n)" do
105
+ context "of an empty array" do
106
+ it "is an empty array" do
107
+ [].drop(10).should == []
108
+ end
109
+
110
+ property("is an empty array") do
111
+ integer.abs
112
+ end.check{|n| [].drop(n).should == [] }
113
+ end
114
+
115
+ context "a negative number of elements" do
116
+ property("raises an error") do
117
+ integer.abs
118
+ end.check do |n|
119
+ lambda { %w(a b).drop(-n) }.should raise_error
120
+ end
121
+ end
122
+
123
+ context "zero elements" do
124
+ it "returns the original array" do
125
+ %w(a b).drop(0).should == %w(a b)
126
+ end
127
+
128
+ property("returns the original array") do
129
+ with(:size, between(0, 25)) { array { integer }}
130
+ end.check do |as|
131
+ as.drop(0).should == as
132
+ end
133
+ end
134
+
135
+ context "one element" do
136
+ context "from a one-element array" do
137
+ it "is an empty array" do
138
+ %w(a).drop(1).should == []
139
+ end
140
+
141
+ property("is an empty array") do
142
+ integer
143
+ end.check{|x| [x].drop(1).should == [] }
144
+ end
145
+
146
+ context "from a two-element array" do
147
+ it "contains only the second element" do
148
+ %w(a b).drop(1).should == %w(b)
149
+ end
150
+
151
+ property("contains only the second element") do
152
+ [integer, integer]
153
+ end.check{|x,y| [x,y].drop(1).should == [y] }
154
+ end
155
+ end
156
+
157
+ context "two elements" do
158
+ context "from a one-element array" do
159
+ it "is an empty array" do
160
+ %w(a).drop(2).should == []
161
+ end
162
+
163
+ property("is an empty array") do
164
+ integer
165
+ end.check{|x| [x].drop(2).should == [] }
166
+ end
167
+
168
+ context "from a two-element array" do
169
+ it "is an empty array" do
170
+ %w(a b).drop(2).should == []
171
+ end
172
+
173
+ property("is an empty array") do
174
+ [integer, integer]
175
+ end.check{|x,y| [x,y].drop(2).should == [] }
176
+ end
177
+ end
178
+ end
179
+
180
+ describe "#drop_while" do
181
+ context "when predicate is always satisfied" do
182
+ it "is an empty array" do
183
+ [1, 2, 3, 2, 1].drop_while{|x| x >= 1 }.should == []
184
+ end
185
+
186
+ property("is an empty array") do
187
+ mkarray(between(0, 10))
188
+ end.check do |as|
189
+ as.drop_while { true }.should == []
190
+ end
191
+ end
192
+
193
+ context "when the first element does not satisfy the predicate" do
194
+ it "is the original array" do
195
+ [1, 2, 3, 2, 1].drop_while{|x| x <= 0 }.should == [1, 2, 3, 2, 1]
196
+ end
197
+
198
+ property("is the original array") do
199
+ mkarray(between(0, 10))
200
+ end.check do |as|
201
+ as.drop_while { false }.should == as
202
+ end
203
+ end
204
+
205
+ context "when the second element does not satisfy the predicate" do
206
+ it "contains all except the first element" do
207
+ [1, 2, 3, 2, 1].drop_while{|x| x <= 1 }.should == [2, 3, 2, 1]
208
+ end
209
+
210
+ property("contains all except the first element") do
211
+ mkarray(between(2, 10))
212
+ end.check do |as|
213
+ as.drop_while{|x| x <= 1 }.should == as.tail
214
+ end
215
+ end
216
+
217
+ context "when the third element does not satisfy the predicate" do
218
+ it "contains all except the first two elements" do
219
+ [1, 2, 3, 2, 1].drop_while{|x| x <= 2 }.should == [3, 2, 1]
220
+ end
221
+
222
+ property("contains all except the first two elements") do
223
+ mkarray(between(3, 10))
224
+ end.check do |as|
225
+ as.drop_while {|x| x <= 2 }.should == as.tail.tail
226
+ end
227
+ end
228
+ end
229
+
230
+ describe "#drop_until" do
231
+ context "when predicate is always satisfied" do
232
+ property("is the original array") do
233
+ mkarray(between(0, 10))
234
+ end.check do |as|
235
+ as.drop_until { true }.should == as
236
+ end
237
+ end
238
+
239
+ context "when predicate is never satisfied" do
240
+ property("is an empty array") do
241
+ mkarray(between(0, 10))
242
+ end.check do |as|
243
+ as.drop_until { false }.should == []
244
+ end
245
+ end
246
+ end
247
+
248
+ describe "#take(n)" do
249
+ context "from an empty array" do
250
+ it "is an empty array" do
251
+ [].take(10).should == []
252
+ end
253
+
254
+ property("is an empty array") do
255
+ integer.abs
256
+ end.check{|n| [].take(n).should == [] }
257
+ end
258
+
259
+ context "a negative number of elements" do
260
+ property("raises an error") do
261
+ integer.abs
262
+ end.check do |n|
263
+ lambda { %w(a b).take(-n) }.should raise_error
264
+ end
265
+ end
266
+
267
+ context "zero elements" do
268
+ context "from a one-element array" do
269
+ it "is an empty array" do
270
+ %w(a).take(0).should == []
271
+ end
272
+
273
+ property("is an empty array") do
274
+ integer
275
+ end.check{|x| [x].take(0).should == [] }
276
+ end
277
+
278
+ context "from a two-element array" do
279
+ it "is an empty array" do
280
+ %w(a b).take(0).should == []
281
+ end
282
+
283
+ property("is an empty array") do
284
+ [integer, integer]
285
+ end.check{|x,y| [x,y].take(0).should == [] }
286
+ end
287
+ end
288
+
289
+ context "one element" do
290
+ context "from a one-element array" do
291
+ it "contains only the first element" do
292
+ %w(a).take(1).should == %w(a)
293
+ end
294
+
295
+ property("contains only the first element") do
296
+ integer
297
+ end.check{|x| [x].take(1).should == [x] }
298
+ end
299
+
300
+ context "from a two-element array" do
301
+ it "contains only the first element" do
302
+ %w(a b).take(1).should == %w(a)
303
+ end
304
+
305
+ property("contains only the first element") do
306
+ [integer, integer]
307
+ end.check{|x,y| [x,y].take(1).should == [x] }
308
+ end
309
+ end
310
+
311
+ context "two elements" do
312
+ context "from a one-element array" do
313
+ it "contains only the first element" do
314
+ %w(a).take(2).should == %w(a)
315
+ end
316
+
317
+ property("contains only the first element") do
318
+ integer
319
+ end.check{|x| [x].take(2).should == [x] }
320
+ end
321
+
322
+ context "from a two-element array" do
323
+ it "contains only both the elements" do
324
+ %w(a b).take(2).should == %w(a b)
325
+ end
326
+
327
+ property("contains only both the elements") do
328
+ [integer, integer]
329
+ end.check{|x,y| [x,y].take(2).should == [x,y] }
330
+ end
331
+ end
332
+ end
333
+
334
+ describe "#take_while" do
335
+ context "when predicate is always satisfied" do
336
+ it "is the original array" do
337
+ [1, 2, 3, 2, 1].take_while{|x| x >= 1 }.should == [1, 2, 3, 2, 1]
338
+ end
339
+
340
+ property("is the original array") do
341
+ mkarray(between(0, 10))
342
+ end.check do |as|
343
+ as.take_while { true }.should == as
344
+ end
345
+ end
346
+
347
+ context "when the first element does not satisfy the predicate" do
348
+ it "is the empty array" do
349
+ [1, 2, 3, 2, 1].take_while{|x| x <= 0 }.should == []
350
+ end
351
+
352
+ property("is the empty array") do
353
+ mkarray(between(1, 10))
354
+ end.check do |as|
355
+ as.take_while { false }.should == []
356
+ end
357
+ end
358
+
359
+ context "when the second element does not satisfy the predicate" do
360
+ it "contains only the first element" do
361
+ [1, 2, 3, 2, 1].take_while{|x| x <= 1 }.should == [1]
362
+ end
363
+
364
+ property("contains only the first element") do
365
+ mkarray(between(2, 10))
366
+ end.check do |as|
367
+ as.take_while{|x| x <= 1 }.should == as[0, 1]
368
+ end
369
+ end
370
+
371
+ context "when the third element does not satisfy the predicate" do
372
+ it "contains only the first two elements" do
373
+ [1, 2, 3, 2, 1].take_while{|x| x <= 2 }.should == [1, 2]
374
+ end
375
+
376
+ property("contains only the first two elements") do
377
+ mkarray(between(3, 10))
378
+ end.check do |as|
379
+ as.take_while {|x| x <= 2 }.should == as[0, 2]
380
+ end
381
+ end
382
+ end
383
+
384
+ describe "#take_until" do
385
+ pending
386
+ end
387
+
388
+ describe "#split_at" do
389
+ context "index zero" do
390
+ context "on an empty array" do
391
+ it "returns [], []" do
392
+ [].split_at(0).should == [[], []]
393
+ end
394
+ end
395
+
396
+ context "on a one-element array" do
397
+ it "returns [], [a]" do
398
+ %w(a).split_at(0).should == [[], %w(a)]
399
+ end
400
+ end
401
+
402
+ context "on a two-element array" do
403
+ it "returns [], [a, b]" do
404
+ %w(a b).split_at(0).should == [[], %w(a b)]
405
+ end
406
+ end
407
+ end
408
+
409
+ context "index one" do
410
+ context "at a negative index" do
411
+ property("is an error") do
412
+ integer.abs
413
+ end.check do |n|
414
+ lambda { [].split_at(-n) }.should raise_error
415
+ end
416
+ end
417
+
418
+ context "on an empty array" do
419
+ it "returns [], []" do
420
+ [].split_at(1).should == [[], []]
421
+ end
422
+ end
423
+
424
+ context "on a one-element array" do
425
+ it "returns [a], []" do
426
+ %w(a).split_at(1).should == [%w(a), []]
427
+ end
428
+ end
429
+
430
+ context "on a two-element array" do
431
+ it "returns [a], [b]" do
432
+ %w(a b).split_at(1).should == [%w(a), %w(b)]
433
+ end
434
+ end
435
+ end
436
+
437
+ context "index two" do
438
+ context "on an empty array" do
439
+ it "returns [], []" do
440
+ [].split_at(2).should == [[], []]
441
+ end
442
+ end
443
+
444
+ context "on a one-element array" do
445
+ it "returns [a], []" do
446
+ %w(a).split_at(2).should == [%w(a), []]
447
+ end
448
+ end
449
+
450
+ context "on a two-element array" do
451
+ it "returns [a, b], []" do
452
+ %w(a b).split_at(2).should == [%w(a b), []]
453
+ end
454
+ end
455
+ end
456
+
457
+ context "at a a non-negative index" do
458
+ property("is equal to [take(n), drop(n)]") do
459
+ with(:size, between(0, 25)) do
460
+ [array { integer }, integer.abs]
461
+ end
462
+ end.check do |as, n|
463
+ as.split_at(n).should == [as.take(n), as.drop(n)]
464
+ end
465
+ end
466
+ end
467
+
468
+ describe "#split_until" do
469
+ pending
470
+ end
471
+
472
+ describe "#split_when" do
473
+ pending
474
+ end
475
+
476
+ end
@@ -0,0 +1,62 @@
1
+ require "spec_helper"
2
+
3
+ describe Object do
4
+ describe "#blank?" do
5
+ it "is false" do
6
+ Object.new.should_not be_blank
7
+ end
8
+ end
9
+ end
10
+
11
+ describe String do
12
+ describe "#blank?" do
13
+ context "if string contains non-whitespace characters" do
14
+ specify "then is string.blank? is false" do
15
+ "abc".should_not be_blank
16
+ " x".should_not be_blank
17
+ " x ".should_not be_blank
18
+ "x ".should_not be_blank
19
+ end
20
+ end
21
+
22
+ context "if string is #empty?" do
23
+ specify "then string.blank? is true" do
24
+ "".should be_blank
25
+ end
26
+ end
27
+
28
+ context "if string contains only whitespace characters" do
29
+ specify "then string.blank? is true" do
30
+ " ".should be_blank
31
+ "\t".should be_blank
32
+ "\n".should be_blank
33
+ "\r".should be_blank
34
+ "\f".should be_blank
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ describe Enumerable do
41
+ describe "#blank?" do
42
+ context "if enum.empty?" do
43
+ specify "then enum.blank? is true" do
44
+ [].should be_blank
45
+ end
46
+ end
47
+
48
+ context "if not enum.empty?" do
49
+ specify "then enum.blank? is false" do
50
+ [0].should_not be_blank
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ describe NilClass do
57
+ describe "#blank?" do
58
+ it "is true" do
59
+ nil.should be_blank
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,68 @@
1
+ require "spec_helper"
2
+
3
+ describe "Enumerable#count" do
4
+ include QuickCheck::Macro
5
+
6
+ context "with no given arguments" do
7
+ property("returns #length") do
8
+ with(:size, between(0, 20)) { array { integer }}
9
+ end.check do |enumerable|
10
+ enumerable.count.should == enumerable.length
11
+ end
12
+ end
13
+
14
+ context "with a given literal" do
15
+ let(:enumerable) { %w(a b a b c d a) }
16
+
17
+ it "returns the number of occurrences" do
18
+ enumerable.count("g").should == 0
19
+ enumerable.count("a").should == 3
20
+ enumerable.count("b").should == 2
21
+ enumerable.count("c").should == 1
22
+ enumerable.count("d").should == 1
23
+ end
24
+ end
25
+
26
+ context "with a given block argument" do
27
+ context "that always evaluates false" do
28
+ it "returns 0" do
29
+ %w(a b c d e f).count { false }.should == 0
30
+ end
31
+
32
+ property("returns 0") do
33
+ with(:size, between(0, 20)) { array { integer }}
34
+ end.check do |enumerable|
35
+ enumerable.count { false }.should == 0
36
+ end
37
+ end
38
+
39
+ context "that always evaluates true" do
40
+ it "returns #length" do
41
+ %w(a b c d e f).count { true }.should == 6
42
+ end
43
+
44
+ property("returns #length") do
45
+ with(:size, between(0, 20)) { array { integer }}
46
+ end.check do |enumerable|
47
+ enumerable.count { true }.should == enumerable.length
48
+ end
49
+ end
50
+
51
+ context "that evaluates true or false" do
52
+ it "returns the number of elements that satisfy the predicate" do
53
+ %w(a bc d ef g hi).count{|s| s.length == 2 }.should == 3
54
+ end
55
+
56
+ property("returns the number of elements that satisfy the predicate") do
57
+ divisor = choose([1,2,3,4])
58
+ enumerable = with(:size, between(0, 20)) { array { integer }}
59
+
60
+ [enumerable, divisor]
61
+ end.check do |enumerable, divisor|
62
+ enumerable.count{|n| n.modulo(divisor).zero? }.should ==
63
+ enumerable.inject(0){|sum,n| sum + ((n.modulo(divisor).zero?) ? 1 : 0) }
64
+ end
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,99 @@
1
+ require "spec_helper" do
2
+ end
3
+
4
+ describe "Object#cons" do
5
+ include QuickCheck::Macro
6
+
7
+ context "with no argument" do
8
+ it "creates a singleton list" do
9
+ 0.cons.should == [0]
10
+ end
11
+ end
12
+
13
+ context "with an array argument" do
14
+ it "prepends the object" do
15
+ "a".cons(%w(b c d)).should == %w(a b c d)
16
+ end
17
+
18
+ property("prepends the object") do
19
+ [character, array { character }]
20
+ end.check do |a, as|
21
+ a.cons(as).length.should == 1 + as.length
22
+ a.cons(as).first.should == a
23
+ end
24
+
25
+ it "does not destructively modify the argument" do
26
+ array = %w(b c d)
27
+ "a".cons(array)
28
+ array.should == %w(b c d)
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "Object#snoc" do
34
+ context "with no argument" do
35
+ it "creates a singleton list" do
36
+ 0.snoc.should == [0]
37
+ end
38
+ end
39
+
40
+ context "with an array argument" do
41
+ it "appends the object" do
42
+ "d".snoc(%w(a b c)).should == %w(a b c d)
43
+ end
44
+
45
+ it "does not destructively modify the argument" do
46
+ array = %w(a b c)
47
+ "d".snoc(array)
48
+ array.should == %w(a b c)
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "Object#bind" do
54
+ it "provides an alternative syntax to local variables and parethesized expressions" do
55
+ (1.bind{|a| a + 2 } * 3).
56
+ should == ((1 + 2) * 3)
57
+ end
58
+
59
+ it "provides an alternative syntax to local variables and parethesized expressions" do
60
+ 1.bind{|a| (a + 2).bind{|b| b * 3 }}.
61
+ should == ((1 + 2) * 3)
62
+ end
63
+
64
+ it "provides an alternative syntax to local variables and parethesized expressions" do
65
+ 1.bind{|a| a.bind{|b| b + 2 }.bind{|c| c * 3 }}.
66
+ should == ((1 + 2) * 3)
67
+ end
68
+ end
69
+
70
+ describe "Object#tap" do
71
+ let(:object) { mock("object") }
72
+
73
+ it "requires a block argument" do
74
+ lambda { object.tap }.should raise_error(LocalJumpError)
75
+ end
76
+
77
+ it "yields the object to a block argument" do
78
+ object.should_receive(:message).with(:argument)
79
+ object.tap{|o| o.message(:argument) }
80
+ end
81
+
82
+ it "returns the object" do
83
+ object.tap { :whatever }.should eq(object)
84
+ end
85
+ end
86
+
87
+ describe "Object#eigenclass" do
88
+ let(:object) { mock("object") }
89
+
90
+ it "returns a Class" do
91
+ object.eigenclass.should be_a(Class)
92
+ end
93
+
94
+ it "cannot be instantiated" do
95
+ lambda { object.eigenclass.new }.should raise_error(TypeError)
96
+ end
97
+
98
+ specify { object.eigenclass.should == (class << object; self; end) }
99
+ end