stupidedi 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,417 @@
1
+ require "spec_helper"
2
+
3
+ describe Stupidedi::Zipper do
4
+ describe ".build" do
5
+ it "returns a RootCursor" do
6
+ Stupidedi::Zipper.build(Node.new("x")).should be_root
7
+ end
8
+ end
9
+ end
10
+
11
+ describe Stupidedi::Zipper::AbstractCursor do
12
+ let(:root) { Stupidedi::Zipper.build(Node.new("a")) }
13
+ let(:leaf) { root.append_child(Leaf.new("x")) }
14
+ let(:root_a) { root.append_child(Node.new("b")) }
15
+ let(:root_b) { root_a.append(Node.new("c")) }
16
+ let(:root_aa) { root_a.append_child(Node.new("d")) }
17
+ let(:root_ab) { root_aa.append(Node.new("e")) }
18
+
19
+ describe "#depth" do
20
+ context "of root" do
21
+ it "is 0" do
22
+ root.depth.should == 0
23
+ end
24
+ end
25
+
26
+ context "of root's child" do
27
+ it "is 1" do
28
+ root_a.depth.should == 1
29
+ root_b.depth.should == 1
30
+ root_a.up.down.depth.should == 1
31
+ root_b.up.down.depth.should == 1
32
+ end
33
+ end
34
+
35
+ context "of root's grandchild" do
36
+ it "is 2" do
37
+ root_aa.depth.should == 2
38
+ root_ab.depth.should == 2
39
+ root_aa.up.down.depth.should == 2
40
+ root_ab.up.down.depth.should == 2
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#first?" do
46
+ context "on root" do
47
+ it "is true" do
48
+ root.should be_first
49
+ end
50
+ end
51
+
52
+ context "on an only child" do
53
+ it "is true" do
54
+ root_a.should be_first
55
+ root_aa.should be_first
56
+
57
+ root_a.up.down.should be_first
58
+ root_aa.up.down.should be_first
59
+
60
+ root.dangle.should be_first
61
+ end
62
+ end
63
+
64
+ context "on the first child" do
65
+ it "is true" do
66
+ root_b.prev.should be_first
67
+ root_ab.prev.should be_first
68
+
69
+ root_b.up.down.should be_first
70
+ root_ab.up.down.should be_first
71
+ end
72
+ end
73
+
74
+ context "on the last child" do
75
+ it "is false" do
76
+ root_b.should_not be_first
77
+ root_ab.should_not be_first
78
+
79
+ root_b.up.down.last.should_not be_first
80
+ root_ab.up.down.last.should_not be_first
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#last?" do
86
+ context "on root" do
87
+ it "is true" do
88
+ root.should be_last
89
+ root_a.up.should be_last
90
+ root_aa.up.up.should be_last
91
+ end
92
+ end
93
+
94
+ context "on an only child" do
95
+ it "is true" do
96
+ root.dangle.should be_last
97
+ root_a.should be_last
98
+ root_aa.should be_last
99
+
100
+ root_a.up.down.should be_last
101
+ root_aa.up.down.should be_last
102
+ end
103
+ end
104
+
105
+ context "on the first child" do
106
+ it "is false" do
107
+ root_b.prev.should_not be_last
108
+ root_ab.prev.should_not be_last
109
+
110
+ root_b.up.down.should_not be_last
111
+ root_ab.up.down.should_not be_last
112
+ end
113
+ end
114
+
115
+ context "on the last child" do
116
+ it "is false" do
117
+ root_b.should be_last
118
+ root_ab.should be_last
119
+
120
+ root_b.up.down.last.should be_last
121
+ root_ab.up.down.last.should be_last
122
+ end
123
+ end
124
+ end
125
+
126
+ describe "#leaf?" do
127
+ context "on root" do
128
+ context "with no children" do
129
+ it "is true" do
130
+ root.should be_leaf
131
+ root.dangle.should be_leaf
132
+ root_a.dangle.should be_leaf
133
+ end
134
+ end
135
+
136
+ context "with children" do
137
+ it "is false" do
138
+ root_a.up.should_not be_leaf
139
+ end
140
+ end
141
+ end
142
+
143
+ context "on child" do
144
+ context "with no children" do
145
+ it "is true" do
146
+ root_a.should be_leaf
147
+ root_a.up.down.should be_leaf
148
+ end
149
+ end
150
+
151
+ context "with children" do
152
+ it "is false" do
153
+ root_aa.up.should_not be_leaf
154
+ root_ab.up.up.down.should_not be_leaf
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ describe "#root?" do
161
+ context "on root" do
162
+ it "is true" do
163
+ root.should be_root
164
+ root_a.up.should be_root
165
+ root_b.up.should be_root
166
+ end
167
+ end
168
+
169
+ context "on a child" do
170
+ it "is false" do
171
+ root_a.should_not be_root
172
+ root_b.up.down.should_not be_root
173
+ root.dangle.should_not be_root
174
+ end
175
+ end
176
+ end
177
+
178
+ describe "#child(n)" do
179
+ context "on a leaf" do
180
+ it "raises an exception" do
181
+ lambda { root.child(0) }.should \
182
+ raise_error(Stupidedi::Exceptions::ZipperError)
183
+ end
184
+ end
185
+
186
+ context "on a parent" do
187
+ it "returns the nth child" do
188
+ root_a.up.child(0).node.should == root_a.node
189
+ root_b.up.child(0).node.should == root_a.node
190
+ root_b.up.child(1).node.should == root_b.node
191
+ end
192
+ end
193
+
194
+ context "when n is negative" do
195
+ it "raises an exception" do
196
+ lambda { root_a.up.child(-1) }.should \
197
+ raise_error(Stupidedi::Exceptions::ZipperError)
198
+ end
199
+ end
200
+ end
201
+
202
+ describe "#dangle" do
203
+ context "on a leaf" do
204
+ let(:dangle) { root.dangle }
205
+
206
+ it "returns a placeholder" do
207
+ dangle.should be_first
208
+ dangle.should be_last
209
+ dangle.should be_leaf
210
+
211
+ dangle.up.should == root
212
+ dangle.root.should == root
213
+ dangle.depth.should == 1
214
+
215
+ dangle.first.should == dangle
216
+ dangle.last.should == dangle
217
+ dangle.delete.should == dangle
218
+
219
+ lambda { dangle.next }.should \
220
+ raise_error(Stupidedi::Exceptions::ZipperError)
221
+
222
+ lambda { dangle.prev }.should \
223
+ raise_error(Stupidedi::Exceptions::ZipperError)
224
+
225
+ lambda { dangle.dangle }.should \
226
+ raise_error(Stupidedi::Exceptions::ZipperError)
227
+
228
+ lambda { dangle.append_child(Node.new("w")) }.should \
229
+ raise_error(Stupidedi::Exceptions::ZipperError)
230
+
231
+ lambda { dangle.prepend_child(Node.new("w")) }.should \
232
+ raise_error(Stupidedi::Exceptions::ZipperError)
233
+ end
234
+ end
235
+
236
+ context "on a leaf class" do
237
+ it "raises an exception" do
238
+ lambda { leaf.dangle }.should \
239
+ raise_error(Stupidedi::Exceptions::ZipperError)
240
+ end
241
+ end
242
+
243
+ context "on a parent" do
244
+ it "returns the first child" do
245
+ root_a.up.dangle.node.should == root_a.node
246
+ end
247
+ end
248
+ end
249
+
250
+ describe "#down" do
251
+ context "on a leaf" do
252
+ it "raises an exception" do
253
+ lambda { root.down }.should \
254
+ raise_exception(Stupidedi::Exceptions::ZipperError)
255
+ lambda { root_a.down }.should \
256
+ raise_exception(Stupidedi::Exceptions::ZipperError)
257
+ lambda { root_b.down }.should \
258
+ raise_exception(Stupidedi::Exceptions::ZipperError)
259
+ end
260
+ end
261
+
262
+ context "on a parent" do
263
+ it "returns the first child" do
264
+ root_a.up.down.node.should == root_a.node
265
+ root_b.up.down.node.should == root_a.node
266
+ end
267
+ end
268
+ end
269
+
270
+ describe "#descendant(n, *ns)"
271
+
272
+ describe "#first" do
273
+ context "on root" do
274
+ it "returns itself" do
275
+ root.first.should == root
276
+ end
277
+ end
278
+
279
+ context "on the first sibling" do
280
+ it "returns itself" do
281
+ root_a.first.node.should == root_a.node
282
+ root_aa.first.node.should == root_aa.node
283
+
284
+ root_b.up.down.first.node.should == root_a.node
285
+ root_ab.up.down.first.node.should == root_aa.node
286
+ end
287
+ end
288
+
289
+ context "on a next sibling" do
290
+ it "returns the first sibling" do
291
+ root_b.first.node.should == root_a.node
292
+ root_ab.first.node.should == root_aa.node
293
+
294
+ root_b.up.down.last.first.node.should == root_a.node
295
+ root_ab.up.down.last.first.node.should == root_aa.node
296
+ end
297
+ end
298
+ end
299
+
300
+ describe "#last" do
301
+ context "on root" do
302
+ it "returns root" do
303
+ root.last.should == root
304
+ end
305
+ end
306
+
307
+ context "on the last sibling" do
308
+ it "returns itself" do
309
+ root_a.last.node.should == root_a.node
310
+ root_b.last.node.should == root_b.node
311
+ root_ab.last.node.should == root_ab.node
312
+ root_ab.last.node.should == root_ab.node
313
+
314
+ root_a.up.down.last.node.should == root_a.node
315
+ root_aa.up.down.last.node.should == root_aa.node
316
+ end
317
+ end
318
+
319
+ context "on a prev sibling" do
320
+ it "returns the last sibling" do
321
+ root_b.prev.last.node.should == root_b.node
322
+ root_ab.prev.last.node.should == root_ab.node
323
+
324
+ root_b.up.down.last.node.should == root_b.node
325
+ root_ab.up.down.last.node.should == root_ab.node
326
+ end
327
+ end
328
+ end
329
+
330
+ describe "#next" do
331
+ context "on root" do
332
+ it "raises an exception" do
333
+ lambda { root.next }.should \
334
+ raise_error(Stupidedi::Exceptions::ZipperError)
335
+ end
336
+ end
337
+
338
+ context "on the last sibling" do
339
+ it "raises an exception" do
340
+ lambda { root_a.next }.should \
341
+ raise_error(Stupidedi::Exceptions::ZipperError)
342
+ lambda { root_b.next }.should \
343
+ raise_error(Stupidedi::Exceptions::ZipperError)
344
+ lambda { root_b.up.down.next.next }.should \
345
+ raise_error(Stupidedi::Exceptions::ZipperError)
346
+ end
347
+ end
348
+
349
+ context "on the prev sibling" do
350
+ it "returns the next sibling" do
351
+ root_b.prev.next.node.should == root_b.node
352
+ root_ab.prev.next.node.should == root_ab.node
353
+
354
+ root_b.up.down.next.node.should == root_b.node
355
+ root_ab.up.down.next.node.should == root_ab.node
356
+ end
357
+ end
358
+ end
359
+
360
+ describe "#prev" do
361
+ context "on root" do
362
+ it "raises an exception" do
363
+ lambda { root.prev }.should \
364
+ raise_error(Stupidedi::Exceptions::ZipperError)
365
+ end
366
+ end
367
+
368
+ context "on the first sibling" do
369
+ it "raises an exception" do
370
+ lambda { root_a.prev }.should \
371
+ raise_error(Stupidedi::Exceptions::ZipperError)
372
+ lambda { root_aa.prev }.should \
373
+ raise_error(Stupidedi::Exceptions::ZipperError)
374
+
375
+ lambda { root_b.up.down.prev }.should \
376
+ raise_error(Stupidedi::Exceptions::ZipperError)
377
+ lambda { root_ab.up.down.prev }.should \
378
+ raise_error(Stupidedi::Exceptions::ZipperError)
379
+ end
380
+ end
381
+
382
+ context "on the next sibling" do
383
+ it "returns the prev sibling" do
384
+ root_b.prev.node.should == root_a.node
385
+ root_ab.prev.node.should == root_aa.node
386
+
387
+ root_b.up.down.next.prev.node.should == root_a.node
388
+ root_ab.up.down.next.prev.node.should == root_aa.node
389
+ end
390
+ end
391
+ end
392
+
393
+ describe "#root" do
394
+ context "on root" do
395
+ it "returns root" do
396
+ root.root.should == root
397
+ end
398
+ end
399
+ end
400
+
401
+ describe "#up" do
402
+ context "on root" do
403
+ it "raises an error" do
404
+ lambda { root.up }.should \
405
+ raise_error(Stupidedi::Exceptions::ZipperError)
406
+ end
407
+ end
408
+ end
409
+
410
+ describe "#append(sibling)"
411
+ describe "#append_child(child)"
412
+ describe "#prepend(sibling)"
413
+ describe "#prepend_child(child)"
414
+ describe "#delete"
415
+ describe "#replace(node)"
416
+
417
+ end
@@ -0,0 +1,9 @@
1
+ require "spec_helper"
2
+
3
+ describe Stupidedi::Zipper do
4
+ describe ".build" do
5
+ it "returns a RootCursor" do
6
+ Stupidedi::Zipper.build(Node.new("x")).should be_root
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ Business Scenario 1 - Positive Acknowledgement
2
+
3
+ The following is the 824 transaction set sent from ABC Insurance to acknowledge receipt of the 834 from SmithCo.
4
+
5
+ Errors Found in File 824 5010X186-1
6
+ * W10009:Padding, spaces or control characters detected after segment terminator.
7
+ * H10014:Leading zeros detected in OTI08. The X12 syntax requires the suppression of leading zeros for numeric elements.
8
+
9
+ ISA*00* *00* *ZZ*RECEIVERS ID *ZZ*SUBMITTERS ID *040831*1500*^*00501*
10
+ 000000022*0*P*:~
11
+ GS*AG*RECEIVERID*SENDERID*20040831*150057*22*X*
12
+ 005010X186~
13
+ ST*824*021390001*005010X186~
14
+ BGN*11*FFA.ABCDEF.123456*20020709*0932**123456789**WQ~
15
+ N1*41*ABC INSURANCE*46*111111111~
16
+ PER*IC*JOHN JOHNSON*TE*8005551212*EX*1439~
17
+ N1*40*SMITHCO*46*A1234~
18
+ OTI*TA*TN*NA***20020709*0902*0002*0001*834*004010X095~
19
+ SE*7*021390001~
20
+ GE*1*22~
21
+ IEA*1*000000022~
@@ -0,0 +1,17 @@
1
+ Business Scenario 1 - Positive Acknowledgement
2
+
3
+ The following is the 824 transaction set sent from ABC Insurance to acknowledge receipt of the 834 from SmithCo.
4
+
5
+ ISA*00* *00* *ZZ*RECEIVERS ID *ZZ*SUBMITTERS ID *040831*1500*^*00501*
6
+ 000000022*0*P*:~
7
+ GS*AG*RECEIVERID*SENDERID*20040831*150057*22*X*
8
+ 005010X186~
9
+ ST*824*021390001*005010X186~
10
+ BGN*11*FFA.ABCDEF.123456*20020709*0932**123456789**WQ~
11
+ N1*41*ABC INSURANCE*46*111111111~
12
+ PER*IC*JOHN JOHNSON*TE*8005551212*EX*1439~
13
+ N1*40*SMITHCO*46*A1234~
14
+ OTI*TA*TN*NA***20020709*0902*2*0001*834*004010X095~
15
+ SE*7*021390001~
16
+ GE*1*22~
17
+ IEA*1*000000022~
@@ -0,0 +1,26 @@
1
+ Business Scenario 2
2
+
3
+ The following is the 824 transaction set sent from DEF Insurance to report on the implementation guide error of the 124 from JonesCo.
4
+
5
+ Errors Found in File 824 5010X186-2
6
+ * W10009:Padding, spaces or control characters detected after segment terminator.
7
+ * H10014:Leading zeros detected in OTI08. The X12 syntax requires the suppression of leading zeros for numeric elements.
8
+ * H10014:Leading zeros detected in TED0501. The X12 syntax requires the suppression of leading zeros for numeric elements.
9
+
10
+ ISA*00* *00* *ZZ*RECEIVERS ID *ZZ*SUBMITTERS ID *040831*1500*^*00501*
11
+ 000000022*0*P*:~
12
+ GS*AG*RECEIVERID*SENDERID*20040831*150057*22*X*
13
+ 005010X186~
14
+ ST*824*021390002*005010X186~
15
+ BGN*11*FFA.ABCDEF.123456*20020709*0932**
16
+ 123456789**U~
17
+ N1*41*DEF INSURANCE*46*222222222~
18
+ PER*IC*TOM EVANS*TE*8005551212*EX*1439~
19
+ N1*40*JONESCO*46*B5678~
20
+ OTI*TR*TN*NA***20020709*0902*0002*0001*124*
21
+ 004010~
22
+ TED*024**VEH*36*02~
23
+ RED*NA**94**IBP*E054~
24
+ SE*9*021390002~
25
+ GE*1*22~
26
+ IEA*1*000000022~
@@ -0,0 +1,21 @@
1
+ Business Scenario 2
2
+
3
+ The following is the 824 transaction set sent from DEF Insurance to report on the implementation guide error of the 124 from JonesCo.
4
+
5
+ ISA*00* *00* *ZZ*RECEIVERS ID *ZZ*SUBMITTERS ID *040831*1500*^*00501*
6
+ 000000022*0*P*:~
7
+ GS*AG*RECEIVERID*SENDERID*20040831*150057*22*X*
8
+ 005010X186~
9
+ ST*824*021390002*005010X186~
10
+ BGN*11*FFA.ABCDEF.123456*20020709*0932**
11
+ 123456789**U~
12
+ N1*41*DEF INSURANCE*46*222222222~
13
+ PER*IC*TOM EVANS*TE*8005551212*EX*1439~
14
+ N1*40*JONESCO*46*B5678~
15
+ OTI*TR*TN*NA***20020709*0902*2*0001*124*
16
+ 004010~
17
+ TED*024**VEH*36*2~
18
+ RED*NA**94**IBP*E054~
19
+ SE*9*021390002~
20
+ GE*1*22~
21
+ IEA*1*000000022~
@@ -0,0 +1,87 @@
1
+ Business Scenario 3
2
+
3
+ Partial Transaction Set Reject Reporting.
4
+
5
+ Errors Found in File 824 5010X186-3
6
+ * W10009:Padding, spaces or control characters detected after segment terminator.
7
+ * H46441:The value of TA was found but not expected because BGN08 is not equal to WQ.
8
+ * H10005:Value '040812' is too short for 'OTI06'.
9
+ * H46444:The Error or Informational Message Location was not found but was expected because OTI01 is equal to BR, IR, TR, BC, IC, TC, BE, IE, TE, BP, IP, or TP.
10
+ * H10005:Value '040812' is too short for 'OTI06'.
11
+ * H10005:Value '040812' is too short for 'OTI06'.
12
+ * H10005:Value '040812' is too short for 'OTI06'.
13
+ * H20203:Element NM107 is present, though marked 'Not Used'.
14
+ * H10005:Value '040812' is too short for 'OTI06'.
15
+ * H20203:Element NM107 is present, though marked 'Not Used'.
16
+ * H12029:Assuming Element Repeat Delimiter is - rather than ^ in CTX01.
17
+ * H10018:Trailing spaces are not allowed (CTX0101).
18
+ * H10016:Leading spaces are not allowed (CTX0101).
19
+ * H10005:Value '040812' is too short for 'OTI06'.
20
+ * H10005:Value '040812' is too short for 'OTI06'.
21
+
22
+ ISA*00* *00* *ZZ*RECEIVERS ID *ZZ*SUBMITTERS ID *040831*1500*^*00501*
23
+ 000000022*0*P*:~
24
+ GS*AG*RECEIVERID*SENDERID*20040831*150057*22*X*
25
+ 005010X186~
26
+ ST*824*0001*005010X186~
27
+ BGN*11*12345*20040831*150057**0123**RU~
28
+ N1*41*CONSOLIDATED INSURANCE CO*46*00000~
29
+ PER*IC*CUSTOMER SERVICE*TE*8005551212~
30
+ N1*40*PHIL GOOD, M.D.*46*TXX23~
31
+ OTI*TA*TN*NA***040812*1253*1000001*0021*837*
32
+ 004010X098A1~
33
+ REF*F8*0123~
34
+ DTM*050*20040814~
35
+ AMT*GW*16970.33~
36
+ QTY*TO*5~
37
+ NM1*41*2*PHIL GOOD, M.D.*****46*TXX23~
38
+ TED*024~
39
+ RED*NA**94**IBP*W050~
40
+ OTI*BP*BT*NA***040812*1253*1000001*0021*837*
41
+ 004010X098A1~
42
+ REF*1C*99983000~
43
+ AMT*2*16970.33~
44
+ QTY*46*5~
45
+ NM1*85*2*GOOD AND ASSOCIATES*****24*555667777~
46
+ OTI*IA*IX*NA***040812*1253*1000001*0021*837*
47
+ 004010X098A1~
48
+ REF*EJ*26462967~
49
+ AMT*GW*540~
50
+ NM1*QC*1*SMITH*TED****MI*000221111A~
51
+ OTI*IE*IX*NA***040812*1253*1000001*0021*837*
52
+ 004010X098A1~
53
+ REF*EJ*78945639837~
54
+ AMT*GW*1100.67~
55
+ NM1*QC*1*BROWN*ROBERT*W**JR*MI*888553737~
56
+ TED*024**N4*32*3**10407~
57
+ RED*NA**94**IBP*E038~
58
+ OTI*IR*IX*NA***040812*1253*1000001*0021*837*
59
+ 004010X098A1~
60
+ REF*EJ*8437450584598~
61
+ AMT*GW*12642.16~
62
+ NM1*QC*1*JAMES*JIM*D**II*MI*011332211~
63
+ TED*024**N4*54*3**73076~
64
+ RED*NA**94**IBP*E038~
65
+ TED*024**REF*68~
66
+ CTX*2310A REFERRING PROVIDER*NM1*65*2310~
67
+ CTX*2010BB PAYER NAME*NM1*18*2010~
68
+ CTX*CLAIM FILING INDICATOR CODE - MB*SBR*13*
69
+ 2000*9~
70
+ RED*NA**94**IBP*E019~
71
+ OTI*IA*IX*NA***040812*1253*1000001*0021*837*
72
+ 004010X098A1~
73
+ REF*EJ*984576898~
74
+ AMT*GW*1900.5~
75
+ NM1*QC*1*MAE*SALLIE*M***MI*987654321~
76
+ OTI*IE*IX*NA***040812*1253*1000001*0021*837*
77
+ 004010X098A1~
78
+ REF*EJ*8767657645765~
79
+ AMT*GW*787~
80
+ NM1*QC*1*DOE*JANE****MI*777553333~
81
+ TED*024**N4*113*3**27387~
82
+ RED*NA**94**IBP*E038~
83
+ TED*024**N4*124*3**27378~
84
+ RED*NA**94**IBP*E038~
85
+ SE*52*0001~
86
+ GE*1*22~
87
+ IEA*1*000000022~
@@ -0,0 +1,61 @@
1
+ Business Scenario 3
2
+
3
+ Partial Transaction Set Reject Reporting.
4
+
5
+ ISA*00* *00* *ZZ*RECEIVERS ID *ZZ*SUBMITTERS ID *040831*1500*^*00501*000000022*0*P*:~
6
+ GS*AG*RECEIVERID*SENDERID*20040831*150057*22*X*005010X186~
7
+ ST*824*0001*005010X186~
8
+ BGN*11*12345*20040831*150057**0123**RU~
9
+ N1*41*CONSOLIDATED INSURANCE CO*46*00000~
10
+ PER*IC*CUSTOMER SERVICE*TE*8005551212~
11
+ N1*40*PHIL GOOD, M.D.*46*TXX23~
12
+ OTI*BP*BT*NA***20040812*1253*1000001*0021*837*004010X098A1~
13
+ REF*F8*0123~
14
+ DTM*050*20040814~
15
+ AMT*GW*16970.33~
16
+ QTY*TO*5~
17
+ NM1*41*2*PHIL GOOD, M.D.*****46*TXX23~
18
+ TED*024~
19
+ RED*NA**94**IBP*W050~
20
+ OTI*BP*BT*NA***20040812*1253*1000001*0021*837*004010X098A1~
21
+ REF*1C*99983000~
22
+ AMT*2*16970.33~
23
+ QTY*46*5~
24
+ NM1*85*2*GOOD AND ASSOCIATES*****24*555667777~
25
+ TED*024~
26
+ OTI*IA*IX*NA***20040812*1253*1000001*0021*837*004010X098A1~
27
+ REF*EJ*26462967~
28
+ AMT*GW*540~
29
+ NM1*QC*1*SMITH*TED****MI*000221111A~
30
+ OTI*IE*IX*NA***20040812*1253*1000001*0021*837*004010X098A1~
31
+ REF*EJ*78945639837~
32
+ AMT*GW*1100.67~
33
+ NM1*QC*1*BROWN*ROBERT*W***MI*888553737~
34
+ TED*024**N4*32*3**10407~
35
+ RED*NA**94**IBP*E038~
36
+ OTI*IR*IX*NA***20040812*1253*1000001*0021*837*004010X098A1~
37
+ REF*EJ*8437450584598~
38
+ AMT*GW*12642.16~
39
+ NM1*QC*1*JAMES*JIM*D***MI*011332211~
40
+ TED*024**N4*54*3**73076~
41
+ RED*NA**94**IBP*E038~
42
+ TED*024**REF*68~
43
+ CTX*2310A REFERRING PROVIDER*NM1*65*2310~
44
+ CTX*2010BB PAYER NAME*NM1*18*2010~
45
+ CTX*CLAIM FILING INDICATOR CODE*SBR*13*2000*9~
46
+ RED*NA**94**IBP*E019~
47
+ OTI*IA*IX*NA***20040812*1253*1000001*0021*837*004010X098A1~
48
+ REF*EJ*984576898~
49
+ AMT*GW*1900.5~
50
+ NM1*QC*1*MAE*SALLIE*M***MI*987654321~
51
+ OTI*IE*IX*NA***20040812*1253*1000001*0021*837*004010X098A1~
52
+ REF*EJ*8767657645765~
53
+ AMT*GW*787~
54
+ NM1*QC*1*DOE*JANE****MI*777553333~
55
+ TED*024**N4*113*3**27387~
56
+ RED*NA**94**IBP*E038~
57
+ TED*024**N4*124*3**27378~
58
+ RED*NA**94**IBP*E038~
59
+ SE*53*0001~
60
+ GE*1*22~
61
+ IEA*1*000000022~