ez7gen 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/bin/ez7gen +6 -0
  3. data/lib/ez7gen.rb +23 -0
  4. data/lib/ez7gen/config/schema/2.4/2.4.HL7.xml +13904 -0
  5. data/lib/ez7gen/config/schema/2.4/VAZ2.4.HL7.xml +3085 -0
  6. data/lib/ez7gen/config/schema/2.4/added/coded-tables.xml +730 -0
  7. data/lib/ez7gen/config/schema/2.4/rules/2.4.HL7.yml +4 -0
  8. data/lib/ez7gen/config/schema/2.4/rules/VAZ2.4.HL7.yml +6 -0
  9. data/lib/ez7gen/config/schema/2.5/2.5.HL7.xml +10008 -0
  10. data/lib/ez7gen/config/schema/2.5/VAZ2.5.HL7.xml +7 -0
  11. data/lib/ez7gen/config/schema/2.5/added/coded-tables.xml +549 -0
  12. data/lib/ez7gen/config/schema/readme.txt +0 -0
  13. data/lib/ez7gen/config/templates/2.4/eiv table update-mfn_m01 20151201.xml +416 -0
  14. data/lib/ez7gen/config/templates/2.4/eiv table update-mfn_y01.xml +416 -0
  15. data/lib/ez7gen/config/templates/2.4/eiv-ec-MFN_X01_reg request 20160126.xml +659 -0
  16. data/lib/ez7gen/config/templates/2.4/examples/ADT_A60.txt +69 -0
  17. data/lib/ez7gen/config/templates/2.4/examples/eiv table update-mfn_m01 20151201.txt +21 -0
  18. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_dss_units-query_qbp_q13-qbp_q13.txt +26 -0
  19. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_ecs_procedures_query_qbp_q13-qbp_q13.txt +26 -0
  20. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_patient eligibility_response-rsp_k11-080714.txt +44 -0
  21. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_diagnosis_query_qbp_q11-qbp_q11.txt +21 -0
  22. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_diagnosis_response_rsp_k11-rsp_k11.txt +42 -0
  23. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_dss_units_response_rtb_k13-rtb_k13.txt +49 -0
  24. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_ecs_filer_request_dft_p03-dft_p03-080714.txt +31 -0
  25. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_ecs_filer_response_ack_p03-ack_p03.txt +21 -0
  26. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_esc_procedures_response_rtb_k13-rtb_k13.txt +40 -0
  27. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_patient_eclass_query_qbp_q11-qbp_q11.txt +21 -0
  28. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_patient_problems_query_qbp_q11-qbp_q11.txt +21 -0
  29. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_patinet_problems_response_rsp_k11-rsp_k11.txt +33 -0
  30. data/lib/ez7gen/config/templates/2.4/examples/orur01rvbecv2.txt +31 -0
  31. data/lib/ez7gen/config/templates/2.4/examples/sqwm vitals-oru_ro1.txt +52 -0
  32. data/lib/ez7gen/config/templates/2.4/examples/vista sqwm-adt_a60.txt +40 -0
  33. data/lib/ez7gen/config/templates/2.4/mhvsm_dss_units_query_qbp_q13-qbp_q13.xml +312 -0
  34. data/lib/ez7gen/config/templates/2.4/mhvsm_ecs_procedures_query_qbp_q13-qbp_q13.xml +314 -0
  35. data/lib/ez7gen/config/templates/2.4/mhvsm_patient eligibility_response-rsp_k11-080714.xml +640 -0
  36. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_diagnosis_query_qbp_q11-qbp_q11.xml +284 -0
  37. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_diagnosis_response_rsp_k11-rsp_k11-rsp_k11.xml +563 -0
  38. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_dss_units_response_rtb_k13-rtb_k13-rtb_k13.xml +365 -0
  39. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_ecs_filer_request_dft_p03-dft_p03-080714.xml +2172 -0
  40. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_ecs_filer_response_ack_p03-ack_p03.xml +269 -0
  41. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_ecs_procedures_response_rtb_k13-rtb_k13-rtb_k13.xml +354 -0
  42. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_patient_eclass_query_qbp_q11-qbp_q11.xml +284 -0
  43. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_patient_problems_query_qbp_q11-qbp_q11.xml +282 -0
  44. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_patient_problems_response_rsp_k11-rsp_k11-rsp_k11.xml +565 -0
  45. data/lib/ez7gen/config/templates/2.4/orur01rvbecv2.xml +1529 -0
  46. data/lib/ez7gen/config/templates/2.4/sqwm vitals-oru_r01.xml +2975 -0
  47. data/lib/ez7gen/config/templates/2.4/vista sqwm-adt_a60.xml +1360 -0
  48. data/lib/ez7gen/message_factory.rb +142 -0
  49. data/lib/ez7gen/msg_error_handler.rb +33 -0
  50. data/lib/ez7gen/profile_parser.rb +321 -0
  51. data/lib/ez7gen/resources/properties-with-comments.yml +51 -0
  52. data/lib/ez7gen/resources/properties.yml +325 -0
  53. data/lib/ez7gen/service/2.4/dynamic_field_generator.rb +45 -0
  54. data/lib/ez7gen/service/2.4/field_generator.rb +1586 -0
  55. data/lib/ez7gen/service/2.5/field_generator.rb +75 -0
  56. data/lib/ez7gen/service/base_field_generator.rb +451 -0
  57. data/lib/ez7gen/service/segment_generator.rb +218 -0
  58. data/lib/ez7gen/service/segment_picker.rb +147 -0
  59. data/lib/ez7gen/service/template_generator.rb +213 -0
  60. data/lib/ez7gen/service/type_aware_field_generator.rb +1583 -0
  61. data/lib/ez7gen/service/utils.rb +75 -0
  62. data/lib/ez7gen/structure_parser.rb +331 -0
  63. data/lib/ez7gen/version.rb +38 -0
  64. data/test/Additional Tables with values_v1.1.txt +1653 -0
  65. data/test/added_shema_test.rb +143 -0
  66. data/test/app-tmp.rb +225 -0
  67. data/test/at.txt +1 -0
  68. data/test/backburner.zip +0 -0
  69. data/test/codes.txt +262 -0
  70. data/test/codes1.txt +1240 -0
  71. data/test/data_types_exploration_test.rb +213 -0
  72. data/test/dynamic_field_generated_test.rb +292 -0
  73. data/test/message_factory_24_custom_test.rb +648 -0
  74. data/test/message_factory_25_test.rb +50 -0
  75. data/test/message_factory_adm_test.rb +558 -0
  76. data/test/message_factory_gen_test.rb +63 -0
  77. data/test/message_factory_lab_test.rb +107 -0
  78. data/test/message_factory_pharm_test.rb +121 -0
  79. data/test/message_factory_template_24_test.rb +730 -0
  80. data/test/message_factory_test.rb +220 -0
  81. data/test/msg_error_handler_test.rb +59 -0
  82. data/test/profile_parser_test.rb +542 -0
  83. data/test/quick_run.rb +880 -0
  84. data/test/segment_generator_test.rb +656 -0
  85. data/test/segment_picker_test.rb +279 -0
  86. data/test/structrure_parser_test.rb +355 -0
  87. data/test/template_generator_test.rb +164 -0
  88. data/test/type_aware_field_generator_test.rb +582 -0
  89. data/test/utils_test.rb +97 -0
  90. metadata +215 -0
@@ -0,0 +1,279 @@
1
+ # require "minitest/autorun"
2
+ require 'test/unit'
3
+ require_relative '../lib/ez7gen/service/segment_picker'
4
+ require_relative '../lib/ez7gen/service/utils'
5
+ # require_relative '../lib/ez7gen/profile_parser'
6
+
7
+
8
+ class SegmentPickerTest < Test::Unit::TestCase
9
+ # @@pp = ProfileParser.new('2.4', 'ADT_A01')
10
+ include Utils
11
+
12
+ # Called before every test method runs. Can be used
13
+ # to set up fixture information.
14
+ def setup
15
+ # profile = 'MSH~EVN~PID~0~1~2~PV1~3~4~5~6~7~8~9~11~12~16~17~18~19~20'
16
+ @profile = ["MSH","EVN","PID",0,1,2,"PV1",3,4,5,6,7,8,9,11,12,16,17,19,20]
17
+
18
+ # # Array (21 elements)
19
+ @elements =[]
20
+ @elements << "[~PD1~]"
21
+ @elements << "[~{~ROL~}~]"
22
+ @elements << "[~{~NK1~}~]"
23
+ @elements << "[~PV2~]"
24
+ @elements << "[~{~ROL~}~]"
25
+ @elements << "[~{~DB1~}~]"
26
+ @elements << "[~{~OBX~}~]"
27
+ @elements << "[~{~AL1~}~]"
28
+ @elements << "[~{~DG1~}~]"
29
+ @elements << "[~DRG~]"
30
+ @elements << "[~{~ROL~}~]"
31
+ @elements << "[~{~PR1~10~}~]"
32
+ @elements << "[~{~GT1~}~]"
33
+ @elements << "[~IN2~]"
34
+ @elements << "[~{~IN3~}~]"
35
+ @elements << "[~{~ROL~}~]"
36
+ @elements << "[~{~IN1~13~14~15~}~]"
37
+ @elements << "[~ACC~]"
38
+ @elements << "[~UB1~]"
39
+ @elements << "[~UB2~]"
40
+ @elements << "[~PDA~]"
41
+ # segmentMap = {:segments => elements, :profile => profile}
42
+ @segmentPicker = SegmentPicker.new(@profile, @elements)
43
+
44
+ end
45
+
46
+ # Called after every test method runs. Can be used to tear
47
+ # down fixture information.
48
+
49
+ def teardown
50
+ @segmentMap = {}
51
+ end
52
+
53
+ def test_init
54
+ assert_equal 21, @segmentPicker.encodedSegments.size
55
+ assert_equal Array, @segmentPicker.encodedSegments.class
56
+ assert_equal Array, @segmentPicker.profile.class
57
+ end
58
+
59
+ def test_getSegmentCandidatesCount
60
+ assert_equal 11, @segmentPicker.get_load_candidates_count(21)
61
+ assert_equal 2, @segmentPicker.get_load_candidates_count(3)
62
+ assert_equal 5, @segmentPicker.get_load_candidates_count(10)
63
+ end
64
+
65
+ # def test_isGroup
66
+ # assert_equal true, @segmentPicker.in_group?('[~{~PR1~10~}~]')
67
+ # assert_equal false, @segmentPicker.in_group?('[~UB2~]')
68
+ # end
69
+
70
+ # def test_isRequired
71
+ #
72
+ # end
73
+
74
+ def test_qetRequiredSegments
75
+ assert_equal ["MSH", "EVN", "PID", "PV1"], @segmentPicker.get_required_segments()
76
+
77
+ assert_equal [0,1,2,6], @segmentPicker.get_required_segment_idxs()
78
+ segments = [0,1,2,6].map{|it| @profile[it]}
79
+ p segments
80
+ assert_equal ["MSH", "EVN", "PID", "PV1"], segments
81
+ end
82
+
83
+ # def test_handleRequiredSegments
84
+ # assert_equal 12, @segmentPicker.pick_optional_segments().size, '11 picked out of 21'
85
+ # end
86
+
87
+ # def test_pickOptionalSegments
88
+ # p @segmentPicker.pick_optional_segments()
89
+ # end
90
+
91
+ def test_getRequiredSegments_withZ
92
+ # profile = 'base:MSH~base:EVN~base:PID~0~1~base:PV1~2~3~4~5~6~7~9~10~13~14~15~16~17~18~19'
93
+ profile = ["base:MSH","base:EVN","base:PID",0,1,"base:PV1",2,3,4,5,6,7,9,10,13,14,15,16,17,18,19]
94
+
95
+ elements = []
96
+ elements << "[~base:PD1~]"
97
+ elements << "[~{~base:NK1~}~]"
98
+ elements << "[~base:PV2~]"
99
+ elements << "[~{~base:DB1~}~]"
100
+ elements << "[~{~base:OBX~}~]"
101
+ elements << "[~{~base:AL1~}~]"
102
+ elements << "[~{~base:DG1~}~]"
103
+ elements << "[~base:DRG~]"
104
+ elements << "[~{~base:ROL~}~]"
105
+ elements << "[~{~base:PR1~8~}~]"
106
+ elements << "[~{~base:GT1~}~]"
107
+ elements << "[~base:IN2~]"
108
+ elements << "[~base:IN3~]"
109
+ elements << "[~{~base:IN1~11~12~}~]"
110
+ elements << "[~base:ACC~]"
111
+ elements << "[~base:UB1~]"
112
+ elements << "[~base:UB2~]"
113
+ elements << "[~ZEM~]" #17
114
+ elements << "[~ZEN~]" #18
115
+ elements << "[~ZMH~]" #19
116
+ # @segmentMap = {:segments => elements, :profile => profile}
117
+ @segmentPicker = SegmentPicker.new(profile, elements)
118
+ required = @segmentPicker.get_required_segments()
119
+ expected = ["base:MSH", "base:EVN", "base:PID", "base:PV1", "[~ZEM~]", "[~ZEN~]", "[~ZMH~]"]
120
+ assert_equal expected, required
121
+
122
+ @segmentPicker = SegmentPicker.new(profile, elements)
123
+ assert_equal [0, 1, 2, 5, 18, 19, 20], @segmentPicker.get_required_segment_idxs()
124
+ reqs = [0, 1, 2, 5, 18, 19, 20].map{|it| profile[it]}
125
+ p reqs
126
+ assert_equal expected, reqs
127
+ end
128
+
129
+ def test_getSegmentsToBuild_with_repeating_required_segments
130
+ # profile = 'MSH~EVN~PID~0~PV1~1~2~3~PID~4~PV1~5~6~7'
131
+ profile = ["MSH","EVN","PID",0,"PV1",1,2,3,'PID',4,'PV1',5,6,7]
132
+
133
+ elements = []
134
+ elements << "[~PD1~]"
135
+ elements << "[~PV2~]"
136
+ elements << "[~{~DB1~}~]"
137
+ elements << "[~{~OBX~}~]"
138
+ elements << "[~PD1~]"
139
+ elements << "[~PV2~]"
140
+ elements << "[~{~DB1~}~]"
141
+ elements << "[~{~OBX~}~]"
142
+
143
+ # # @segmentMap = {:segments => elements, :profile => profile}
144
+ # @segmentPicker = SegmentPicker.new(profile.clone, elements.clone)
145
+ # segments = @segmentPicker.get_segments_to_build()
146
+ # # ["MSH", "EVN", "PID", "PV1", "PID", "PV1"]
147
+ # assert_equal 1,segments.count("MSH")
148
+ # assert_equal 1, segments.count("EVN")
149
+ # assert_equal 2, segments.count("PID")
150
+ # assert_equal 2, segments.count("PV1")
151
+
152
+ # @segmentPicker = SegmentPicker.new(profile.clone, elements.clone)
153
+ # segments = @segmentPicker.get_required_segments()
154
+ # # ["MSH", "EVN", "PID", "PV1", "PID", "PV1"]
155
+ # p segments
156
+ # assert_equal 1,segments.count("MSH")
157
+ # assert_equal 1, segments.count("EVN")
158
+ # assert_equal 2, segments.count("PID")
159
+ # assert_equal 2, segments.count("PV1")
160
+
161
+ @segmentPicker = SegmentPicker.new(profile.clone, elements.clone)
162
+ assert_equal [0, 1, 2, 4, 8, 10], @segmentPicker.get_required_segment_idxs()
163
+ segments = [0, 1, 2, 4, 8, 10].map{|it| is_number?(profile[it])?@segmentPicker.encodedSegments[profile[it]]: profile[it]}
164
+ p segments
165
+ assert_equal 1,segments.count("MSH")
166
+ assert_equal 1, segments.count("EVN")
167
+ assert_equal 2, segments.count("PID")
168
+ assert_equal 2, segments.count("PV1")
169
+ end
170
+
171
+ def test_getSegmentsToBuild_with_repeating_Z_segments
172
+ # profile = 'base:MSH~base:EVN~base:PID~0~1~base:PV1~2~3~4~5~6~7~9~10~13~14~15~16~17~18~19'
173
+ profile = ["base:MSH","base:EVN","base:PID",0,1,"base:PV1",2,3,4,5,6,7,9,10,13,14,15,16,17,18,19]
174
+
175
+ elements = []
176
+ elements << "[~base:PD1~]"
177
+ elements << "[~{~base:NK1~}~]"
178
+ elements << "[~base:PV2~]"
179
+ elements << "[~{~base:DB1~}~]"
180
+ elements << "[~{~base:OBX~}~]"
181
+ elements << "[~{~base:AL1~}~]"
182
+ elements << "[~{~base:DG1~}~]"
183
+ elements << "[~base:DRG~]"
184
+ elements << "[~{~base:ROL~}~]"
185
+ elements << "[~{~base:PR1~8~}~]"
186
+ elements << "[~{~base:GT1~}~]"
187
+ elements << "[~base:IN2~]"
188
+ elements << "[~base:IN3~]"
189
+ elements << "[~{~base:IN1~11~12~}~]"
190
+ elements << "[~ZEM~]"
191
+ elements << "[~ZEN~]"
192
+ elements << "[~ZMH~]"
193
+ elements << "[~ZEM~]" #17
194
+ elements << "[~ZEN~]" #18
195
+ elements << "[~ZMH~]" #19
196
+
197
+ # @segmentMap = {:segments => elements, :profile => profile}
198
+ # @segmentPicker = SegmentPicker.new(profile.clone, elements.clone)
199
+ # segments = @segmentPicker.get_segments_to_build()
200
+ # assert_equal 1,segments.count("base:MSH")
201
+ # assert_equal 1, segments.count("base:EVN")
202
+ # assert_equal 2, segments.count("[~ZEM~]")
203
+ # assert_equal 2, segments.count("[~ZEN~]")
204
+ # assert_equal 2, segments.count("[~ZMH~]")
205
+
206
+ # @segmentPicker = SegmentPicker.new(profile.clone, elements.clone)
207
+ # segments = @segmentPicker.get_required_segments()
208
+ # assert_equal 1,segments.count("base:MSH")
209
+ # assert_equal 1, segments.count("base:EVN")
210
+ # assert_equal 2, segments.count("[~ZEM~]")
211
+ # assert_equal 2, segments.count("[~ZEN~]")
212
+ # assert_equal 2, segments.count("[~ZMH~]")
213
+
214
+
215
+ @segmentPicker = SegmentPicker.new(profile.clone, elements.clone)
216
+ rs = @segmentPicker.get_required_segment_idxs()
217
+ # assert_equal [0, 1, 2, 5], @segmentPicker.get_required_segment_idxs()
218
+ segments = rs.map{|it| is_number?(profile[it])?@segmentPicker.encodedSegments[profile[it]]: profile[it]}
219
+ p segments
220
+ assert_equal 1,segments.count("base:MSH")
221
+ assert_equal 1, segments.count("base:EVN")
222
+ assert_equal 2, segments.count("[~ZEM~]")
223
+ assert_equal 2, segments.count("[~ZEN~]")
224
+ assert_equal 2, segments.count("[~ZMH~]")
225
+
226
+ end
227
+
228
+ # def test_handleGroups
229
+ # # profile = ["MSH", "EVN", "PID", "[~PD1~]", "[~{~ROL~}~]", "[~{~NK1~}~]", "PV1", "[~PV2~]", "[~{~ROL~}~]", "[~{~DB1~}~]", "[~{~OBX~}~]", "[~{~AL1~}~]", "[~{~DG1~}~]", "[~DRG~]", "[~{~PR1~10~}~]", "[~{~GT1~}~]", "[~{~IN1~13~14~15~}~]", "[~ACC~]", "[~UB1~]", "[~UB2~]", "[~PDA~]"]
230
+ # profile = ["MSH","[~{~PR1~10~}~]"]
231
+ # # [~{~PR1~[~{~ROL~}~]~}~] = {RP1 ~ ROL}
232
+ # segments = @segmentPicker.handle_groups(profile)
233
+ # p segments
234
+ # # [~{~IN1~[~IN2~]~[~{~IN3~}~]~[~{~ROL~}~]~}~]
235
+ # end
236
+
237
+ def test_pickSegments
238
+ # profile = ["MSH", "EVN", "PID", "[~PD1~]", "[~{~ROL~}~]", "[~{~NK1~}~]", "PV1", "[~PV2~]", "[~{~ROL~}~]", "[~{~DB1~}~]", "[~{~OBX~}~]", "[~{~AL1~}~]", "[~{~DG1~}~]", "[~DRG~]", "[~{~PR1~10~}~]", "[~{~GT1~}~]", "[~{~IN1~13~14~15~}~]", "[~ACC~]", "[~UB1~]", "[~UB2~]", "[~PDA~]"]
239
+ # profile = [ "[~{~PR1~10~}~]"]
240
+ # [~{~PR1~[~{~ROL~}~]~}~] = {RP1 ~ ROL}
241
+ # segments = @segmentPicker.pick_segments
242
+ # p segments
243
+ #
244
+ # teardown
245
+ # setup()
246
+
247
+ segments = @segmentPicker.pick_segments_to_build()
248
+ p segments
249
+ # p @profile
250
+ # idxs = @segmentPicker.pick_segment_idx_to_build
251
+ # p idxs
252
+ # segments = idxs.map{|it| is_number?(@profile[it])?@segmentPicker.encodedSegments[@profile[it]]: @profile[it]}
253
+ # p segments
254
+ end
255
+
256
+ #refactoring
257
+ # def test_get_required_segment_complex_groups
258
+ # p @segmentPicker.pick_required_segments1()
259
+ #
260
+ # # "MSH~EVN~PID~0~1~2~PV1~3~4~5~6~7~8~9~11~12~16~17~18~19~20"
261
+ # # ["[~PD1~]", "[~{~ROL~}~]", "[~{~NK1~}~]", "[~PV2~]", "[~{~ROL~}~]", "[~{~DB1~}~]", "[~{~OBX~}~]", "[~{~AL1~}~]", "[~{~DG1~}~]", "[~DRG~]", "[~{~ROL~}~]", ["PR1", "[~{~ROL~}~]"], "[~{~GT1~}~]", "[~IN2~]", "[~{~IN3~}~]", "[~{~ROL~}~]", ["IN1", "[~IN2~]", "[~{~IN3~}~]", "[~{~ROL~}~]"], "[~ACC~]", "[~UB1~]", "[~UB2~]", "[~PDA~]"]
262
+ #
263
+ # end
264
+ def test_isZ
265
+ assert @segmentPicker.is_z?('[~ZMH~]')
266
+ assert @segmentPicker.is_z?('[~{~ZMH~}~]')
267
+ assert !@segmentPicker.is_z?('[~{~AL1~}~]')
268
+ assert !@segmentPicker.is_z?('[~{~AZL1~}~]')
269
+ # segment << OptionalGroup.new().concat(["PID", "[~PD1~]", "[~{~NTE~}~]", OptionalGroup.new().concat(["PV1", "[~PV2~]"]), OptionalGroup.new(RepeatingGroup.new().concat(["IN1", "[~IN2~]", "[~IN3~]"])), "[~GT1~]", "[~{~AL1~}~]"])
270
+ elements =[]
271
+ elements << RepeatingGroup.new().concat(["PID", "[~ZMH~]", "[~{~NTE~}~]", OptionalGroup.new().concat(["PV1", "[~PV2~]"]), OptionalGroup.new(RepeatingGroup.new().concat(["IN1", "[~IN2~]", "[~IN3~]"])), "[~GT1~]", "[~{~AL1~}~]"])
272
+ # elements << segment
273
+ @segmentPicker = SegmentPicker.new([0], elements.clone)
274
+ # segment = segment.flatten!().to_s
275
+ # puts (segment =~ /\~Z/)? true: false
276
+ assert @segmentPicker.is_z1?(0)
277
+ p elements
278
+ end
279
+ end
@@ -0,0 +1,355 @@
1
+ # require "minitest/autorun"
2
+ require "benchmark"
3
+ require 'test/unit'
4
+ require 'ruby-hl7'
5
+ # require_relative "../lib/ez7gen/service/segment_generator"
6
+ require_relative '../lib/ez7gen/structure_parser'
7
+ require_relative '../lib/ez7gen/service/utils'
8
+
9
+
10
+ class StructureParserTest < Test::Unit::TestCase
11
+ include Utils
12
+ #parse xml once
13
+ # TESTS #
14
+ # def setup
15
+ # puts Benchmark.measure{
16
+ # # pp = ProfilerParser.new(@attrs).generate()
17
+ # profilers = { 'primary'=> @@pp }
18
+ # @segmentGen = SegmentGenerator.new("2.4","ADT_A01", profilers)
19
+ # # @msg = HL7::Message.new
20
+ # # @msg << @segmentGen.init_msh()
21
+ # }
22
+ #
23
+ # end
24
+
25
+ def test_init
26
+ parser = StructureParser.new()
27
+ assert_equal([],parser.encodedSegments)
28
+ assert_equal(0, parser.idx)
29
+
30
+ # puts @msg
31
+ end
32
+
33
+ def test_process_opt
34
+ parser = StructureParser.new()
35
+ struct = 'MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~OBR~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~{~[~[~PID~[~PD1~]~]~[~PV1~[~PV2~]~]~[~{~AL1~}~]~{~[~ORC~]~OBR~[~{~NTE~}~]~[~CTD~]~{~OBX~[~{~NTE~}~]~}~}~]~}~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
36
+ # regEx = parser.regExOp
37
+ # parser.process(struct, regEx, '[]')
38
+ parser.process_opt_groups(struct)
39
+ # assert_equal 29,parser.idx
40
+ assert_equal 29,parser.encodedSegments.size
41
+ puts struct
42
+ end
43
+
44
+ def test_process_rep
45
+ parser = StructureParser.new()
46
+ struct = 'MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~OBR~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~{~[~[~PID~[~PD1~]~]~[~PV1~[~PV2~]~]~[~{~AL1~}~]~{~[~ORC~]~OBR~[~{~NTE~}~]~[~CTD~]~{~OBX~[~{~NTE~}~]~}~}~]~}~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
47
+ # regEx = parser::REGEX_REP
48
+ # parser.process(struct, regEx, parser::PRNTHS_REP)# {}
49
+ parser.process_rep_groups(struct)
50
+ # assert_equal 17,parser.idx
51
+ assert_equal 17,parser.encodedSegments.size
52
+ puts struct
53
+ end
54
+
55
+ def test_process_not_optional_group
56
+ # <MessageStructure name='ADT_A45' definition='MSH~EVN~PID~[~PD1~]~{~MRG~PV1~}' />
57
+ parser = StructureParser.new()
58
+ struct = "MSH~MSA~[~ERR~]~QAK~QPD~{~[~PID~[~PD1~]~[~QRI~]~]~}~[~DSC~]"
59
+ # regEx = parser.regExOp
60
+ # parser.process(struct, regEx, '[]')
61
+ # # assert_equal 17,parser.encodedSegments.size
62
+ # p parser.encodedSegments
63
+ # puts struct
64
+ #
65
+ # regEx = parser.regExRep
66
+ # parser.process(struct, regEx, '{}')
67
+ parser.process_struct(struct)
68
+ assert_equal ["[~ERR~]", "[~PID~2~3~]", "[~PD1~]", "[~QRI~]", "[~DSC~]", "{~1~}"], parser.encodedSegments
69
+ # p parser.encodedSegments
70
+ assert_equal "MSH~MSA~0~QAK~QPD~5~4", struct
71
+ #p struct
72
+
73
+ # ["[~ERR~]", "[~PD1~]", "[~QRI~]", "[~PID~1~2~]", "{~3~}", "[~DSC~]"]
74
+ #["MSH", "MSA", 0, "QAK", "QPD", 4, 5]
75
+ end
76
+
77
+ def test_process_struct
78
+ #omg_019
79
+ parser = StructureParser.new()
80
+ struct = 'MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~OBR~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~{~[~[~PID~[~PD1~]~]~[~PV1~[~PV2~]~]~[~{~AL1~}~]~{~[~ORC~]~OBR~[~{~NTE~}~]~[~CTD~]~{~OBX~[~{~NTE~}~]~}~}~]~}~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
81
+ # regEx = parser::REGEX_REP
82
+ # parser.process(struct, regEx, parser::PRNTHS_REP)# {}
83
+ parser.process_struct(struct)
84
+ assert_equal 33,parser.idx
85
+ assert_equal 33,parser.encodedSegments.size
86
+ p parser.encodedSegments
87
+ puts struct
88
+ expected =["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "[~17~19~21~31~]", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}", "{~22~OBR~23~24~32~}", "{~OBX~25~}"]
89
+ assert_equal expected, parser.encodedSegments
90
+ # ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}"]
91
+
92
+ end
93
+
94
+ def test_process_struct_ADT_A01
95
+ struct = "MSH~EVN~PID~[~PD1~]~[~{~ROL~}~]~[~{~NK1~}~]~PV1~[~PV2~]~[~{~ROL~}~]~[~{~DB1~}~]~[~{~OBX~}~]~[~{~AL1~}~]~[~{~DG1~}~]~[~DRG~]~[~{~PR1~[~{~ROL~}~]~}~]~[~{~GT1~}~]~[~{~IN1~[~IN2~]~[~{~IN3~}~]~[~{~ROL~}~]~}~]~[~ACC~]~[~UB1~]~[~UB2~]~[~PDA~]"
96
+ parser = StructureParser.new()
97
+ parser.process_struct(struct)
98
+ assert_equal 21, parser.idx
99
+ assert_equal 21, parser.encodedSegments.size
100
+ p parser.encodedSegments
101
+ # p struct
102
+ # expected = ["MSH", "EVN", "PID", 0, 1, 2, "PV1", 3, 4, 5, 6, 7, 8, 9, 11, 12, 16, 17, 18, 19, 20]
103
+ assert_equal "MSH~EVN~PID~0~1~2~PV1~3~4~5~6~7~8~9~10~12~13~17~18~19~20", struct
104
+ expected = ["[~PD1~]", "[~{~ROL~}~]", "[~{~NK1~}~]", "[~PV2~]", "[~{~ROL~}~]", "[~{~DB1~}~]", "[~{~OBX~}~]", "[~{~AL1~}~]", "[~{~DG1~}~]", "[~DRG~]", "[~{~PR1~11~}~]", "[~{~ROL~}~]", "[~{~GT1~}~]", "[~{~IN1~14~15~16~}~]", "[~IN2~]", "[~{~IN3~}~]", "[~{~ROL~}~]", "[~ACC~]", "[~UB1~]", "[~UB2~]", "[~PDA~]"]
105
+ assert_equal expected, parser.encodedSegments
106
+
107
+ # old = ["[~PD1~]", "[~{~ROL~}~]", "[~{~NK1~}~]", "[~PV2~]", "[~{~ROL~}~]", "[~{~DB1~}~]", "[~{~OBX~}~]", "[~{~AL1~}~]", "[~{~DG1~}~]", "[~DRG~]", "[~{~ROL~}~]", "[~{~PR1~10~}~]", "[~{~GT1~}~]", "[~IN2~]", "[~{~IN3~}~]", "[~{~ROL~}~]", "[~{~IN1~13~14~15~}~]", "[~ACC~]", "[~UB1~]", "[~UB2~]", "[~PDA~]"]
108
+ # assert_equal expected, parser.encodedSegments
109
+ end
110
+
111
+ def test_handle_groups
112
+ # arr = ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}"]
113
+ #arr = ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "~17~19~21~31~", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}", "{~22~OBR~23~24~32~}", "{~OBX~25~}"]
114
+ arr = ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "{~17~19~21~31~}", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}", "{~22~OBR~23~24~32~}", "{~OBX~25~}"]
115
+ # MSH~0~1~29
116
+ parser = StructureParser.new()
117
+
118
+ parser.encodedSegments = arr
119
+ parser.idx=parser.encodedSegments.size
120
+
121
+ seg = parser.handle_groups(arr)
122
+ p parser.encodedSegments
123
+ expected = ["[~{~NTE~}~]", ["PID", "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], [["IN1", "[~IN2~]", "[~IN3~]"]], "[~GT1~]", "[~{~AL1~}~]"], "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], "[~PV2~]", [["IN1", "[~IN2~]", "[~IN3~]"]], "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", [["OBX", "[~{~NTE~}~]"]], "[~{~NTE~}~]", [["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]], ["PID", "[~PD1~]"], "[~PD1~]", ["PV1", "[~PV2~]"], "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", ["ORC", "OBR", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", [["OBX", "[~{~NTE~}~]"]], [[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]], "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]"], [[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]], ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]], ["OBX", "[~{~NTE~}~]"]]
124
+ assert_equal expected, parser.encodedSegments
125
+
126
+ end
127
+
128
+ def test_handle_groups_optMult
129
+ arr = ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "{~17~19~21~31~}", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}", "{~22~OBR~23~24~32~}", "{~OBX~25~}"]
130
+ # MSH~0~1~29
131
+ parser = StructureParser.new()
132
+
133
+ parser.encodedSegments = arr
134
+ parser.idx=parser.encodedSegments.size
135
+
136
+ seg = parser.handle_groups(["[~PID~2~3~4~6~9~10~]"])
137
+ assert_equal( [["PID", "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], [["IN1", "[~IN2~]", "[~IN3~]"]], "[~GT1~]", "[~{~AL1~}~]"]], seg)
138
+ # p seg
139
+ end
140
+
141
+ def test_is_group_resolved
142
+ arr = ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}"]
143
+
144
+ seg = "[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]"
145
+ assert_equal 1, seg.scan(StructureParser::REGEX_OP).size()
146
+ assert_equal 2, seg.scan(StructureParser::REGEX_REP).size()
147
+
148
+ assert (seg.scan(StructureParser::REGEX_OP).size()>1 || seg.scan(StructureParser::REGEX_REP).size()>1)
149
+ end
150
+
151
+ def test_has_subgroups
152
+ a = nil || 'a'
153
+
154
+ regEx = /\[~{(.*)}~\]/
155
+ puts "[~{~NTE~}~]".scan(regEx)
156
+ puts "[~ERR~]".scan(regEx)
157
+ parser = StructureParser.new()
158
+
159
+ arr = ["[~ERR~]", "[~{~NTE~}~]", "[~3~{~ORC~5~}~]", "[~PID~4~]", "[~{~NTE~}~]", "[~RXE~{~RXR~}~6~]", "[~{~RXC~}~]"]
160
+ assert !parser.has_subgroups?(arr[0])
161
+ assert !parser.has_subgroups?(arr[1])
162
+ assert parser.has_subgroups?(arr[2])
163
+ p arr[2].scan(StructureParser::REGEX_OP)
164
+ p arr[2].scan(StructureParser::REGEX_REP)
165
+
166
+ assert !parser.has_subgroups?(arr[3])
167
+ assert !parser.has_subgroups?(arr[4])
168
+ assert parser.has_subgroups?(arr[5])
169
+ assert !parser.has_subgroups?(arr[6])
170
+
171
+ assert parser.has_subgroups?("[~{~RXA~}~RXR~]")
172
+ end
173
+
174
+ def test_process_segments_ORM_O01
175
+ parser = StructureParser.new()
176
+ # struct='MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~[~&lt;~OBR~|~RQD~|~RQ1~|~RXO~|~ODS~|~ODT~&gt;~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~]~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
177
+ # struct='MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~[~<~OBR~|~RQD~|~RQ1~|~RXO~|~ODS~|~ODT~>~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~]~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
178
+ struct='MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~[~OBR~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~]~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
179
+ parser.process_segments(struct)
180
+ assert_equal 'MSH~0~1~20', struct
181
+ # expected = ["[~{~NTE~}~]", ["PID", "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], [["IN1", "[~IN2~]", "[~IN3~]"]], "[~GT1~]", "[~{~AL1~}~]"], "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], "[~PV2~]", [["IN1", "[~IN2~]", "[~IN3~]"]], "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", [["OBX", "[~{~NTE~}~]"]], "[~{~NTE~}~]", [["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]], ["PID", "[~PD1~]"], "[~PD1~]", ["PV1", "[~PV2~]"], "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", ["ORC", "OBR", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", [["OBX", "[~{~NTE~}~]"]], [[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]], "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]"], [[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]], ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]], ["OBX", "[~{~NTE~}~]"]]
182
+ # assert_equal expected, parser.encodedSegments
183
+ p parser.encodedSegments
184
+ end
185
+
186
+ def test_process_segments_RDE_O11
187
+ parser = StructureParser.new()
188
+ struct='MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~[~RXO~[~{~NTE~}~]~{~RXR~}~[~{~RXC~}~[~{~NTE~}~]~]~]~RXE~{~RXR~}~[~{~RXC~}~]~[~{~OBX~[~{~NTE~}~]~}~]~[~{~CTI~}~]~}'
189
+ # parser.process_segments(struct)
190
+ # assert_equal 'MSH~0~1~19', struct
191
+ # z=parser.process_struct(struct)
192
+ # p z
193
+ # ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~RXO~12~{~RXR~}~13~]", "[~{~NTE~}~]", "[~{~RXC~}~14~]", "[~{~NTE~}~]", "[~{~RXC~}~]", "[~{~OBX~17~}~]", "[~{~NTE~}~]", "[~{~CTI~}~]", "{~ORC~11~RXE~20~15~16~18~}", "{~RXR~}"]
194
+ # parser.handle_groups()
195
+ # assert_equal expected, parser.encodedSegments
196
+ end
197
+
198
+ def test_process_segments_OMG_O19
199
+ #omg_019
200
+ parser = StructureParser.new()
201
+ struct = 'MSH~[~{~NTE~}~]~[~PID~[~PD1~]~[~{~NTE~}~]~[~PV1~[~PV2~]~]~[~{~IN1~[~IN2~]~[~IN3~]~}~]~[~GT1~]~[~{~AL1~}~]~]~{~ORC~OBR~[~{~NTE~}~]~[~CTD~]~[~{~DG1~}~]~[~{~OBX~[~{~NTE~}~]~}~]~{~[~[~PID~[~PD1~]~]~[~PV1~[~PV2~]~]~[~{~AL1~}~]~{~[~ORC~]~OBR~[~{~NTE~}~]~[~CTD~]~{~OBX~[~{~NTE~}~]~}~}~]~}~[~{~FT1~}~]~[~{~CTI~}~]~[~BLG~]~}'
202
+ parser.process_segments(struct)
203
+ assert_equal 'MSH~0~1~29', struct
204
+ expected = ["[~{~NTE~}~]", ["PID", "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], [["IN1", "[~IN2~]", "[~IN3~]"]], "[~GT1~]", "[~{~AL1~}~]"], "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], "[~PV2~]", [["IN1", "[~IN2~]", "[~IN3~]"]], "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", [["OBX", "[~{~NTE~}~]"]], "[~{~NTE~}~]", [["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]], ["PID", "[~PD1~]"], "[~PD1~]", ["PV1", "[~PV2~]"], "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", ["ORC", "OBR", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", [["OBX", "[~{~NTE~}~]"]], [[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]], "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]"], [[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]], ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]], ["OBX", "[~{~NTE~}~]"]]
205
+ assert_equal expected, parser.encodedSegments
206
+ end
207
+
208
+ def test_is_complex_group
209
+ parser = StructureParser.new()
210
+ group ='["ORC", "[~OBR~8~]"]' # bug in ORL_22
211
+ assert_true parser.is_complex_group?(group)
212
+ end
213
+
214
+ def test_markers
215
+ a = OptionalGroup.new([1,2,3])
216
+ assert_equal(OptionalGroup, a.class)
217
+ assert a.instance_of?(OptionalGroup)
218
+ assert !a.instance_of?(Array)
219
+ a.each{|it| puts it}
220
+ assert a.kind_of?(Array) # => true
221
+
222
+ group = "[~IN1~7~8~]"
223
+ a = Marker.gen(group)
224
+ assert_equal OptionalGroup, a.class
225
+ a = Marker.whatGroup?(group)
226
+ assert_equal OptionalGroup, a.class
227
+
228
+ group = "{~IN1~7~8~}"
229
+ a = Marker.gen(group)
230
+ assert_equal RepeatingGroup, a.class
231
+ a = Marker.whatGroup?(group)
232
+ assert_equal RepeatingGroup, a.class
233
+
234
+ group = "[~{~IN1~7~8~}~]"
235
+ a = Marker.gen(group)
236
+ assert_equal OptionalGroup, a.class
237
+ a = Marker.whatGroup?(group)
238
+ assert_equal OptionalGroup, a.class
239
+
240
+ group = "~IN1~7~8~"
241
+ a = Marker.gen(group)
242
+ assert_nil a
243
+ a = Marker.whatGroup?(group)
244
+ assert_nil a
245
+
246
+ # group ='[~{~NTE~}~]' # not a group!
247
+ # a = Marker.gen(group)
248
+ # assert_nil a
249
+ # a = Marker.whatGroup?(group)
250
+ # assert_nil a
251
+
252
+ # "[~{~IN1~7~8~}~]"
253
+
254
+ # a = Marker.gen("[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]")
255
+ # p a
256
+ # a = Marker.new("[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]")
257
+ # p a
258
+ #[["PID", "[~PD1~]"], ["PV1", "[~PV2~]"], "[~{~AL1~}~]", ["[~ORC~]", "OBR", "[~{~NTE~}~]", "[~CTD~]", ["OBX", "[~{~NTE~}~]"]]]
259
+ #segment can be an array
260
+ end
261
+
262
+ def test_markers_1
263
+
264
+ # [RXE~{~RXR~}~6]
265
+ a = Marker.gen1("[~RXE~{~RXR~}~6~]")
266
+ assert_equal OptionalGroup, a.class
267
+ # assert_equal RepeatingGroup, a[0].class
268
+
269
+ a = Marker.gen("[~IN1~7~8~]")
270
+ assert_equal OptionalGroup, a.class
271
+
272
+ a = Marker.gen("{~IN1~7~8~}")
273
+ assert_equal RepeatingGroup, a.class
274
+
275
+ a = Marker.gen("[~{~IN1~7~8~}~]")
276
+ assert_equal OptionalGroup, a.class
277
+ assert_equal RepeatingGroup, a[0].class
278
+
279
+ end
280
+
281
+ def test_groups_markers
282
+ o = OptionalGroup.new('~IN1~7~8~')
283
+ assert_equal 3, o.size
284
+
285
+ o = OptionalGroup.new().concat(['a','b','c'])
286
+ assert_equal 3, o.size
287
+
288
+ RepeatingGroup.new('~IN1~7~8~')
289
+ assert_equal 3, o.size
290
+ end
291
+
292
+ def test_process_struct_PRE_012
293
+
294
+ parser = StructureParser.new()
295
+ # struct = '[~[~PID~[~{~NTE~}~]~]~{~ORC~[~RXE~{~RXR~}~[~{~RXC~}~]~]~}~]'
296
+ struct = 'MSH~MSA~[~ERR~]~[~{~NTE~}~]~[~[~PID~[~{~NTE~}~]~]~{~ORC~[~RXE~{~RXR~}~[~{~RXC~}~]~]~}~]'
297
+ # struct = 'RXE~{~RXR~}~6'
298
+ parser.process_struct(struct)
299
+ # assert_equal 33,parser.idx
300
+ # assert_equal 33,parser.encodedSegments.size
301
+ p parser.encodedSegments
302
+ puts struct
303
+ # expected =["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "{~17~19~21~31~}", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}", "{~22~OBR~23~24~32~}", "{~OBX~25~}"]
304
+ # assert_equal expected, parser.encodedSegments
305
+ # ["[~{~NTE~}~]", "[~PID~2~3~4~6~9~10~]", "[~PD1~]", "[~{~NTE~}~]", "[~PV1~5~]", "[~PV2~]", "[~{~IN1~7~8~}~]", "[~IN2~]", "[~IN3~]", "[~GT1~]", "[~{~AL1~}~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~DG1~}~]", "[~{~OBX~15~}~]", "[~{~NTE~}~]", "[~17~19~21~{~22~OBR~23~24~{~OBX~25~}~}~]", "[~PID~18~]", "[~PD1~]", "[~PV1~20~]", "[~PV2~]", "[~{~AL1~}~]", "[~ORC~]", "[~{~NTE~}~]", "[~CTD~]", "[~{~NTE~}~]", "[~{~FT1~}~]", "[~{~CTI~}~]", "[~BLG~]", "{~ORC~OBR~11~12~13~14~30~26~27~28~}", "{~16~}"]
306
+ # [~RXE~{~RXR~}~6~]
307
+ seg = parser.handle_groups(parser.encodedSegments)
308
+ # assert_equal( [["PID", "[~PD1~]", "[~{~NTE~}~]", ["PV1", "[~PV2~]"], [["IN1", "[~IN2~]", "[~IN3~]"]], "[~GT1~]", "[~{~AL1~}~]"]], seg)
309
+ # ["[~ERR~]", "[~{~NTE~}~]", "[~3~{~ORC~5~}~]", "[~PID~4~]", "[~{~NTE~}~]", "[~RXE~{~RXR~}~6~]", "[~{~RXC~}~]"]
310
+
311
+ # seg = parser.handle_groups(["[~RXE~{~RXR~}~6~]"])
312
+ p seg
313
+ end
314
+ def test_process_struct_PRE_018
315
+
316
+ parser = StructureParser.new()
317
+ struct = 'MSH~MSA~[~ERR~]~[~{~NTE~}~]~[~[~PID~[~{~NTE~}~]~]~{~ORC~[~{~RXA~}~RXR~]~}~]'
318
+
319
+ parser.process_struct(struct)
320
+ p parser.encodedSegments
321
+ puts struct
322
+ seg = parser.handle_groups(parser.encodedSegments)
323
+ p seg
324
+ end
325
+
326
+ def test_process_struct_ADT_A45
327
+
328
+ parser = StructureParser.new()
329
+ struct = 'MSH~EVN~PID~[~PD1~]~{~MRG~PV1~}'
330
+
331
+ parser.process_struct(struct)
332
+ p parser.encodedSegments
333
+ puts struct
334
+ seg = parser.handle_groups(parser.encodedSegments)
335
+ p seg
336
+ end
337
+
338
+ def test_process_struct_ORL_O22
339
+ parser = StructureParser.new()
340
+ struct = 'MSH~MSA~[~ERR~]~[~{~NTE~}~]~[~[~PID~{~[~SAC~[~{~OBX~}~]~]~[~{~ORC~[~OBR~[~{~SAC~}~]~]~}~]~}~]~]'
341
+ # [~OBR~8~] -broken
342
+ parser.process_struct(struct)
343
+ p parser.encodedSegments
344
+ # puts struct
345
+ assert_equal 13, struct.size
346
+ seg = parser.handle_groups(parser.encodedSegments)
347
+ p seg
348
+ assert_equal 10, seg.size
349
+ # ["[~ERR~]", "[~{~NTE~}~]", [["PID", [["SAC", "[~{~OBX~}~]"], [["ORC", ["OBR", "[~{~SAC~}~]"]]]]]], ["PID", [["SAC", "[~{~OBX~}~]"], [["ORC", ["OBR", "[~{~SAC~}~]"]]]]], ["SAC", "[~{~OBX~}~]"], "[~{~OBX~}~]", [["ORC", ["OBR", "[~{~SAC~}~]"]]], ["OBR", "[~{~SAC~}~]"], "[~{~SAC~}~]", [["SAC", "[~{~OBX~}~]"], [["ORC", ["OBR", "[~{~SAC~}~]"]]]]]
350
+
351
+ end
352
+
353
+ # ["ORC", "[~OBR~8~]"]
354
+
355
+ end