ez7gen 1.0.1

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