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,164 @@
1
+ require 'test/unit'
2
+ require 'ox'
3
+
4
+ require_relative '../lib/ez7gen/service/template_generator'
5
+ require_relative '../lib/ez7gen/profile_parser'
6
+
7
+
8
+
9
+ class TemplateGeneratorTest < Test::Unit::TestCase
10
+ @@VS =
11
+ [
12
+ {:std=>"2.4", :path=>"../test/test-config/schema/2.4", :profiles=>[{:doc=>"2.4.HL7", :name=>"2.4", :std=>"1", :path=>"../test/test-config/schema/2.4/2.4.HL7.xml"}, {:doc=>"VAZ2.4.HL7", :name=>"VAZ2.4", :description=>"2.4 schema with VA defined tables and Z segments", :base=>"2.4", :path=>"../test/test-config/schema/2.4/VAZ2.4.HL7.xml.bkp"}]},
13
+ {:std=>"2.5", :path=>"../test/test-config/schema/2.5", :profiles=>[{:doc=>"2.5.HL7", :name=>"2.5", :std=>"1", :path=>"../test/test-config/schema/2.5/2.5.HL7.xml"}, {:doc=>"TEST2.5.HL7", :name=>"TEST2.5", :description=>"2.5 mockup schema for testing", :base=>"2.4", :path=>"../test/test-config/schema/2.5/VAZ2.5.HL7.xml"}]}
14
+ ]
15
+ @attrs = {std: '2.4', version: '2.4.HL7', event: 'ADT_A01', version_store: @@VS}
16
+ @@pp = ProfileParser.new(@attrs)
17
+
18
+ # Called before every test method runs. Can be used
19
+ # to set up fixture information.
20
+ def setup
21
+ # @attrs = {std: '2.4', version: '2.4.HL7', event: 'ADT_A01'}
22
+ # @pp = [ProfileParser.new(@attrs)]
23
+ end
24
+
25
+ # Called after every test method runs. Can be used to tear
26
+ # down fixture information.
27
+ def teardown
28
+ @pp = nil
29
+ end
30
+
31
+ def test_read_template_ADT_A60
32
+ templatePath = 'test-config/templates/ADT_A60.xml'
33
+
34
+ useExVal = false
35
+ map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_metadata(useExVal)
36
+
37
+ # p map
38
+ # map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_template_metadata( usages)
39
+ p map
40
+ assert_equal(4, map.size)
41
+ assert_equal 'Recorded Date/Time', map['EVN'].first[:Name]
42
+ assert_equal '20', map['EVN'].first[TemplateGenerator::COMP].first[:Length]
43
+
44
+ end
45
+
46
+ def test_read_template_EVN
47
+
48
+ templatePath = 'test-config/templates/ADT_A60_EVN.xml'
49
+ useExVal = false
50
+ map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_metadata(useExVal)
51
+ #map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_template_metadata( usages)
52
+ puts map
53
+ assert_equal(4, map.size)
54
+ assert_equal 'Recorded Date/Time', map['EVN'].first[:Name]
55
+ assert_equal '20', map['EVN'].first[TemplateGenerator::COMP].first[:Length]
56
+ end
57
+
58
+ def test_read_template_PID
59
+
60
+ templatePath = 'test-config/templates/ADT_A60_PID.xml'
61
+ useExVal = false
62
+ tg = TemplateGenerator.new(templatePath,{'primary' => @@pp })
63
+ # tg.class.const_set('USAGES_REQ', [])
64
+ map = tg.build_metadata(useExVal)
65
+
66
+ # TemplateGenerator.USAGES_REQ = ['R','RE']
67
+ # map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_template_metadata( usages)
68
+ # p map
69
+ assert_equal 1, map.size
70
+ assert_equal 9, map['PID'][0].size
71
+
72
+ # puts map
73
+ puts map['PID']
74
+ puts
75
+ assert_equal 0, map['PID'].first[TemplateGenerator::COMP].first[:Pos]
76
+ assert_equal 0, map['PID'].first[TemplateGenerator::COMP].first[:Pos]
77
+ puts map['PID'][1][TemplateGenerator::COMP]
78
+ puts
79
+ puts map['PID'][1][TemplateGenerator::COMP][0][TemplateGenerator::SUB]
80
+ # map['PID'].first[2][:components].each {|it| p it.keys}
81
+ # puts map['PID'].first[4]
82
+ end
83
+
84
+ def test_read_template_PID_1
85
+
86
+ templatePath = 'test-config/templates/ADT_A60_PID.xml'
87
+ useExVal = false
88
+ map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_metadata(useExVal)
89
+
90
+ puts map
91
+ assert_equal 1, map.size
92
+ assert_equal 9, map['PID'][0].size
93
+
94
+ # puts map
95
+ puts map['PID']
96
+ puts
97
+ assert_equal 0, map['PID'].first[TemplateGenerator::COMP].first[:Pos]
98
+ assert_equal 0, map['PID'].first[TemplateGenerator::COMP].first[:Pos]
99
+ puts map['PID'][1][TemplateGenerator::COMP]
100
+ puts
101
+ puts map['PID'][1][TemplateGenerator::COMP][0][TemplateGenerator::SUB]
102
+ # map['PID'].first[2][:components].each {|it| p it.keys}
103
+ # puts map['PID'].first[4]
104
+ end
105
+
106
+ def test_read_template_MFN_M01
107
+
108
+ templatePath = 'test-config/templates/2.4/eiv table update-mfn_m01 20151201.xml'
109
+ usages = ['R','RE']
110
+ useExVal = false
111
+ map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_metadata(useExVal)
112
+ # map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_template_metadata( usages)
113
+ p map
114
+ assert_equal 3, map.size
115
+ assert_equal 3, map['MFI'].size
116
+ assert_equal 5, map['MFE'].size
117
+ end
118
+
119
+ def test_get_metadata_EVN
120
+
121
+ # templatePath = 'test-config/templates/ADT_A60_EVN_only.xml'
122
+ templatePath = 'test-config/templates/ADT_A60_EVN.xml'
123
+ usages = ['R','RE']
124
+ useExVal = false
125
+ map = TemplateGenerator.new(templatePath,{'primary' => @@pp }).build_metadata(useExVal)
126
+
127
+ puts map
128
+ # assert_equal(4, map.size)
129
+ assert_equal 'Recorded Date/Time', map['EVN'].first[:Name]
130
+ assert_equal '20', map['EVN'].first[TemplateGenerator::COMP].first[:Length]
131
+ # {"MSH"=>[],
132
+ # "EVN"=>[
133
+ # {:Name=>"Recorded Date/Time", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :ItemNo=>"00100", :Pos=>1,
134
+ # :components=>[
135
+ # {:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"20", :Pos=>0}
136
+ # ]
137
+ # }
138
+ # ],
139
+ # "PID"=>[],
140
+ # "IAM"=>[]}
141
+
142
+ # {"MSH"=>[{:Name=>"MSH", :LongName=>"Message Header", :Usage=>"R", :Min=>"1", :Max=>"1"}],
143
+ # "EVN"=>[
144
+ # {"Field"=>[[{"Component"=>[[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"20", :Pos=>0}]]}]]}],
145
+
146
+ # "PID"=>[{:Name=>"PID", :LongName=>"Patient identification", :Usage=>"R", :Min=>"1", :Max=>"1"}], "IAM"=>[{:Name=>"IAM", :LongName=>"Patient adverse reaction information - unique iden", :Usage=>"R", :Min=>"1", :Max=>"*"}]}
147
+
148
+ end
149
+
150
+ def test_use
151
+ templatePath = 'test-config/templates/ADT_A60_EVN.xml'
152
+ tg = TemplateGenerator.new(templatePath,{'primary' => @@pp })
153
+ assert_true tg.use?('R')
154
+ assert_true [true, false].include? tg.use?('RE') # could be either
155
+
156
+ tg.class.const_set('USAGES_REQ', ['R','RE']) # force to build both for testing
157
+ assert_true tg.use?('RE')
158
+
159
+ assert_false tg.use?('X')
160
+
161
+ end
162
+
163
+
164
+ end
@@ -0,0 +1,582 @@
1
+ # require "minitest/autorun"
2
+ require 'test/unit'
3
+ require_relative '../lib/ez7gen/profile_parser'
4
+ require_relative '../lib/ez7gen/service/type_aware_field_generator'
5
+
6
+ class TypeAwareFieldGeneratorTest < Test::Unit::TestCase
7
+ vs =
8
+ [
9
+ {:std=>"2.4", :path=>"../test/test-config/schema/2.4", :profiles=>[{:doc=>"2.4.HL7", :name=>"2.4", :std=>"1", :path=>"../test/test-config/schema/2.4/2.4.HL7.xml"}, {:doc=>"VAZ2.4.HL7", :name=>"VAZ2.4", :description=>"2.4 schema with VA defined tables and Z segments", :base=>"2.4", :path=>"../test/test-config/schema/2.4/VAZ2.4.HL7.xml.bkp"}]},
10
+ {:std=>"2.5", :path=>"../test/test-config/schema/2.5", :profiles=>[{:doc=>"2.5.HL7", :name=>"2.5", :std=>"1", :path=>"../test/test-config/schema/2.5/2.5.HL7.xml"}, {:doc=>"TEST2.5.HL7", :name=>"TEST2.5", :description=>"2.5 mockup schema for testing", :base=>"2.4", :path=>"../test/test-config/schema/2.5/VAZ2.5.HL7.xml"}]}
11
+ ]
12
+ attrs = {std: '2.4', version: '2.4.HL7', event: 'ADT_A01', version_store: vs}
13
+
14
+ #parse xml once
15
+ @@pp = ProfileParser.new(attrs)
16
+
17
+ #helper method
18
+ def lineToHash(line)
19
+ hash = line.gsub(/(\[|\])/,'').gsub(':',',').split(',').map{|it| it.strip()}.each_slice(2).to_a.to_h
20
+ return Hash[hash.map{|(k,v)| [k.to_sym,v]}]
21
+
22
+ end
23
+
24
+ def setup
25
+ @fldGenerator = TypeAwareFieldGenerator.new(@@pp)
26
+ end
27
+
28
+ def test_init
29
+ assert_equal 'Odysseus', @fldGenerator.yml['person.names.first'][0]
30
+ end
31
+
32
+ def test_CE
33
+ # IAM.3 ‘Allergen Code/Mnemonic/Description’ with the ICD 10 Allergy Reaction Codes from the properties file.
34
+ # However, it needs to be populated with the ICD 10 Allergen Codes from the properties file (e.g. T78.40XA Allergy, unspecified, initial encounter)
35
+ line = '[piece:3, description:Allergen Code/Mnemonic/Description, datatype:CE, symbol:!, max_length:250, required:R, ifrepeating:0]'
36
+ row= lineToHash(line)
37
+ fld = @fldGenerator.CE(row)
38
+ puts fld
39
+ icd10s =
40
+ ['T78.40XA^Allergy unspecified initial encounter',
41
+ 'T78.40XD^Allergy unspecified subsequent encounter',
42
+ 'Z91.048^Other nonmedicinal substance allergy status',
43
+ 'Z91.09^Other allergy status, other than to drugs and biological substances',
44
+ 'Z91.013^Allergy to seafood',
45
+ 'Z91.010^Allergy to peanuts',
46
+ 'Z88.0^Allergy status to penicillin',
47
+ 'Z91.038^Other insect allergy status',
48
+ 'Z91.030^Bee Allergy status']
49
+
50
+ assert_includes(icd10s, fld) # conditional should skip on auto generate
51
+
52
+
53
+ # PID.35 – PID.38 should be always blank, as they deal with animals, not humans.
54
+ line = '[max_length:250, symbol:?, description:Species Code, ifrepeating:0, datatype:CE, required:C, piece:35, codetable:446]'
55
+ row= lineToHash(line)
56
+ fld = @fldGenerator.CE(row)
57
+ puts fld
58
+ assert_equal('',fld) # conditional should skip on auto generate
59
+
60
+ line = '[[max_length:250, symbol:?, description:Breed Code, ifrepeating:0, datatype:CE, required:C, piece:36, codetable:447]'
61
+ row= lineToHash(line)
62
+ fld = @fldGenerator.CE(row)
63
+ puts fld
64
+ assert_equal('',fld) # conditional should skip on auto generate
65
+
66
+ line = '[max_length:250, description:Production Class Code, ifrepeating:0, datatype:CE, required:O, piece:38, codetable:429]'
67
+ row= lineToHash(line)
68
+ fld = @fldGenerator.CE(row, true)
69
+ puts fld
70
+ assert_equal('',fld) # conditional should skip on auto generate
71
+
72
+ line = '[max_length:250, description:Role Action Reason, ifrepeating:0, datatype:CE, required:R, piece:8]'
73
+ row= lineToHash(line)
74
+ #puts row
75
+ fld = @fldGenerator.CE(row)
76
+ assert fld.to_i < 1000
77
+ #puts fld
78
+ end
79
+
80
+ def test_CNN
81
+ line = '[required:R, piece:8]'
82
+ row= lineToHash(line)
83
+ fld = @fldGenerator.CNN(row)
84
+ puts fld
85
+ end
86
+
87
+ def test_segment_CE_codetable
88
+ attrs = []
89
+ line = '[max_length:250, symbol:*, description:Race, ifrepeating:1, datatype:CE, required:R, piece:10, codetable:5]'
90
+ row= lineToHash(line)
91
+ fld = @fldGenerator.CE(row)
92
+ assert fld.include?('^')
93
+ puts fld
94
+ end
95
+
96
+ def test_NM
97
+ # Field size restriction exceeded in segment 8:
98
+ # PV2. Field 20, repetition 1 is larger than segment structure 2.4:
99
+ # PV2 permits it to be. (alert request ID=9)
100
+ # '<SegmentSubStructure piece='20' description='Expected Number of Insurance Plans' datatype='NM' max_length='1' required='O' ifrepeating='0' />' line ='[max_length:4, symbol:!, description:Set ID - DG1, ifrepeating:0, datatype:SI, required:R, piece:1]'
101
+ line = '[piece:20, description:Expected Number of Insurance Plans, datatype=:NM, max_length:1,required:O, ifrepeating:0]'
102
+ fld = @fldGenerator.NM(lineToHash(line), true)
103
+ puts fld
104
+ assert_equal 1, fld.size
105
+
106
+ line = '[max_length:12, description:Total Charges, ifrepeating:0, datatype:NM, required:R, piece:47]'
107
+ fld = @fldGenerator.NM(lineToHash(line))
108
+ puts fld
109
+ assert fld.include?('.00')
110
+ assert fld.to_f < 1000
111
+
112
+ line = '[max_length:2, description:Birth Order, ifrepeating:0, datatype:NM, required:R, piece:25]'
113
+ fld = @fldGenerator.NM(lineToHash(line))
114
+ puts fld
115
+ assert fld.to_i < 10
116
+
117
+ line = '[piece=:6, description:Percentage, datatype:NM, max_length:3, required:R, ifrepeating:0]'
118
+ fld = @fldGenerator.NM(lineToHash(line))
119
+ puts fld
120
+ assert fld.to_i < 100
121
+
122
+ # <SegmentSubStructure piece='3' description='Disability %' datatype='base:NM' max_length='3' required='O' ifrepeating='0'/>
123
+ line = '[piece=:3, description:Disability %, datatype:NM, max_length:3, required:R, ifrepeating:0]'
124
+ fld = @fldGenerator.NM(lineToHash(line))
125
+ puts fld
126
+ assert fld.to_i < 100
127
+
128
+
129
+ end
130
+
131
+ def test_CP
132
+ line ='[max_length:12, description:???, ifrepeating:0, datatype:CP, required:R, piece:13]'
133
+ fld = @fldGenerator.CP(lineToHash(line))
134
+ puts fld
135
+ assert fld.include?('.00')
136
+
137
+ line = '[piece:27, description:Guarantor Household Annual Income, datatype:CP, max_length:10, required:O, ifrepeating:0]'
138
+ fld = @fldGenerator.CP(lineToHash(line),true)
139
+ puts fld
140
+ assert fld.include?('.00')
141
+
142
+ end
143
+
144
+ def test_CX
145
+ line = '[max_length:250, description:Alternate Visit ID, ifrepeating:0, datatype:CX, required:O, piece:50, codetable:203]'
146
+ fld = @fldGenerator.CX(lineToHash(line),true)
147
+ puts fld
148
+
149
+ line ='[max_length:250, symbol:+, description:Patient Identifier List, ifrepeating:1, datatype:CX, required:R, piece:3]'
150
+ fld = @fldGenerator.CX(lineToHash(line))
151
+ assert /^[-+]?[1-9]([0-9]*)?$/.match(fld) # is a number
152
+ puts fld
153
+ end
154
+
155
+ def test_ELD
156
+ line ='[max_length:250, symbol:+, description:Mockup, datatype:ELD, required:R, piece:3]'
157
+ fld = @fldGenerator.ELD(lineToHash(line))
158
+ # assert /^[-+]?[1-9]([0-9]*)?$/.match(fld) # is a number
159
+ puts fld
160
+ end
161
+
162
+ def test_ID
163
+ line ='[max_length:1, description:Separate Bill, ifrepeating:0, datatype:ID, required:R, piece:9, codetable:136]'
164
+ fld = @fldGenerator.ID(lineToHash(line))
165
+ puts fld
166
+ assert /[Y|N]/.match(fld)
167
+ end
168
+
169
+ def test_TS
170
+
171
+ #The field IAM.13 ‘Reported Date/Time’ needs to be just the date - 8 characters long
172
+ line = '[max_length:8, description:Reported Date/Time, ifrepeating:0, datatype:TS, required:R, piece:13]'
173
+ # <SegmentSubStructure piece='13' description='Reported Date/Time' datatype='TS' max_length='8' required='O' ifrepeating='0' />
174
+ fld = @fldGenerator.TS(lineToHash(line))
175
+ puts fld
176
+ assert_equal 8, fld.size
177
+
178
+ # PID.7 Date of Birth – please make the date within 50-20 years into the past.
179
+ line = '[max_length:26, description:Date/Time Of Birth, ifrepeating:0, datatype:TS, required:R, piece:7]'
180
+ fld = @fldGenerator.TS(lineToHash(line))
181
+ puts fld
182
+ assert_equal 18, fld.size
183
+
184
+ line ='[max_length:26, description:Admit Date/Time, ifrepeating:0, datatype:TS, required:R, piece:44]'
185
+ fld_past = @fldGenerator.TS(lineToHash(line))
186
+ puts fld_past
187
+ assert_equal 18, fld_past.size, 'datetime format YYYYMMDDHHSS.SSS, like 20150321201748.373'
188
+
189
+ line ='[max_length:26, description:Role End Date/Time, ifrepeating:0, datatype:TS, required:R, piece:44]'
190
+ fld_future = @fldGenerator.TS(lineToHash(line))
191
+ puts "past timestamp #{fld_past}, future timestamp #{fld_future}"
192
+ assert fld_past < fld_future
193
+ end
194
+
195
+ def test_DLD
196
+ line ='[max_length:25, description:Discharged to Location, ifrepeating:0, datatype:DLD, required:R, piece:37, codetable:112]'
197
+ fld = @fldGenerator.DLD(lineToHash(line))
198
+ puts fld
199
+ assert fld.include?('^') #
200
+
201
+ line ='[max_length:25, description:Discharged to Location, ifrepeating:0, datatype:DLD, required:X, piece:37]'
202
+ fld = @fldGenerator.DLD(lineToHash(line), true)
203
+ puts fld
204
+ assert fld.include?('^') #
205
+ end
206
+
207
+ def test_DLN
208
+ line ="[max_length:25, description:Driver's License Number - Patient, ifrepeating:0, datatype:DLN, required:O, piece:20]"
209
+ fld = @fldGenerator.DLN(lineToHash(line),true)
210
+ puts fld
211
+ assert_equal 3, fld.split('^').size
212
+ end
213
+
214
+ def test_DR
215
+ line ='[max_length:25, description:Discharged to Location, ifrepeating:0, datatype:DLD, required:R, piece:37, codetable:112]'
216
+ fld = @fldGenerator.DR(lineToHash(line))
217
+ puts fld
218
+ assert fld.include?('^') #
219
+ end
220
+
221
+ def test_DT
222
+ line ='[max_length:8, symbol:*, description:Contract Effective Date, ifrepeating:1, datatype:DT, required:O, piece:25]'
223
+ fld = @fldGenerator.DT(lineToHash(line),true)
224
+ puts fld
225
+ assert_equal 8, fld.size, 'date format yyyymmdd, like 20141228'
226
+
227
+ # <SegmentSubStructure piece='2' description='Income Year' datatype='base:DT' max_length='4' required='O' ifrepeating='0'/>
228
+ line ='[max_length:4, description:Income Year, ifrepeating:0, datatype:DT, required:O, piece:2]'
229
+ fld = @fldGenerator.DT(lineToHash(line),true)
230
+ puts fld
231
+ assert_equal 4, fld.size, 'date format yyyy, like 2016'
232
+ end
233
+
234
+ def test_DTN
235
+ # piece='11' description='Days' datatype='DTN' max_length='3' required='O' ifrepeating='0' codetable='149'
236
+ line ='[max_length:3, description:Days, ifrepeating:0, datatype:DTN, required:O, piece:11]'
237
+ fld = @fldGenerator.DTN(lineToHash(line),true)
238
+ puts fld
239
+ assert_not_nil /\d+/.match(fld) # number
240
+ assert 3 >= fld.size
241
+
242
+ line ='[max_length:3, description:Days, ifrepeating:0, datatype:DTN, required:O, piece:11, codetable:149]'
243
+ fld = @fldGenerator.DTN(lineToHash(line),true)
244
+ puts fld
245
+ assert_not_nil /\w+/.match(fld) # word
246
+ assert 3 >= fld.size
247
+
248
+ # assert_equal 8, fld.size, 'date format yyyymmdd, like 20141228'
249
+ end
250
+
251
+ def test_IS
252
+ # PD1.20 has a value of 27. The value is supposed to come from table 141 (this was the error picked by Ensemble):
253
+ line ='[max_length:2, description:Military Rank/Grade, ifrepeating:0, datatype:IS, required:O, piece:20, codetable:141]'
254
+ fld = @fldGenerator.IS(lineToHash(line),true)
255
+ puts fld
256
+
257
+ line ='[max_length:2, description:Interest Code, ifrepeating:0, datatype:IS, required:O, piece:28, codetable:44]'
258
+ fld = @fldGenerator.IS(lineToHash(line),true)
259
+ assert ['C','K','S','P'].include?(fld)
260
+
261
+ line ='[max_length:2, description:Interest Code, ifrepeating:0, datatype:IS, required:O, piece:28]' #, codetable:44]'
262
+ fld = @fldGenerator.IS(lineToHash(line),true)
263
+ assert fld.to_i <1000
264
+ end
265
+
266
+ def test_FC
267
+ line ='[max_length:50, symbol:*, description:Financial Class, ifrepeating:1, datatype:FC, required:O, piece:20, codetable:64]'
268
+ fld = @fldGenerator.FC(lineToHash(line),true)
269
+ puts fld
270
+ end
271
+
272
+ def test_FN
273
+ line ='[required:O, piece:20]'
274
+ fld = @fldGenerator.FN(lineToHash(line),true)
275
+ assert fld
276
+ puts fld
277
+ end
278
+
279
+ def test_HD
280
+ line ='[max_length:180, description:Event Facility, ifrepeating:0, datatype:HD, required:O, piece:7]'
281
+ fld = @fldGenerator.HD(lineToHash(line),true)
282
+ assert fld
283
+ puts fld
284
+ end
285
+
286
+ def test_JCC
287
+ line ='[required:O, piece:20]'
288
+ fld = @fldGenerator.JCC(lineToHash(line),true)
289
+ assert fld.include?('^')
290
+ puts fld
291
+ end
292
+
293
+ def test_LA1
294
+ line ='[required:R, piece:1]'
295
+ fld = @fldGenerator.LA1(lineToHash(line))
296
+ assert fld.include?('^')
297
+ puts fld
298
+ end
299
+
300
+ def test_LA2
301
+ line ='[required:R, piece:1]'
302
+ fld = @fldGenerator.LA2(lineToHash(line))
303
+ assert fld.include?('^')
304
+ puts fld
305
+ end
306
+
307
+ def test_MOP
308
+ line ='[required:R, piece:1]'
309
+ fld = @fldGenerator.MOP(lineToHash(line))
310
+ assert fld.include?('^')
311
+ puts fld
312
+ end
313
+
314
+ def test_MSG
315
+ line ='[required:R, piece:1]'
316
+ fld = @fldGenerator.MSG(lineToHash(line))
317
+ assert fld.include?('^')
318
+ puts fld
319
+ end
320
+
321
+ def test_OCD
322
+ line ='[required:R, piece:20]'
323
+ fld = @fldGenerator.OCD(lineToHash(line))
324
+ assert fld.include?('^')
325
+ puts fld
326
+ end
327
+
328
+ def test_OSP
329
+ line ='[required:R, piece:20]'
330
+ fld = @fldGenerator.OSP(lineToHash(line))
331
+ assert fld.include?('^')
332
+ puts fld
333
+ end
334
+
335
+ def test_PI
336
+ line ='[required:R, piece:20]'
337
+ fld = @fldGenerator.PI(lineToHash(line))
338
+ puts fld
339
+ end
340
+
341
+ def test_PL
342
+ line ='[max_length:80, description:Assigned Patient Location, ifrepeating:0, datatype:PL, required:O, piece:3]'
343
+ fld = @fldGenerator.PL(lineToHash(line), true)
344
+ assert fld.include?('^')
345
+ puts fld
346
+ assert_equal 7, fld.split('^').size
347
+ end
348
+
349
+ def test_PT
350
+ line ='[datatype:PT, required:O, piece:3]'
351
+ fld = @fldGenerator.PT(lineToHash(line), true)
352
+ assert fld
353
+ puts fld
354
+ end
355
+
356
+
357
+ def test_SI
358
+ line ='[max_length:4, symbol:!, description:Set ID - DG1, ifrepeating:0, datatype:SI, required:R, piece:1]'
359
+ fld = @fldGenerator.SI(lineToHash(line), true)
360
+ assert_equal 4, fld.size
361
+ puts fld
362
+ end
363
+
364
+ def test_ST
365
+ #ZEL.29 should be 1 digit integer.
366
+ # line = '[piece:29, description:AGENT ORANGE EXPOSURE LOCATION, datatype=base:ST, max_length:1, required=O , ifrepeating:0]'
367
+ line = '[piece:29, description:AGENT ORANGE EXPOSURE LOCATION, datatype:base:ST, max_length:1, required=O , ifrepeating:0]'
368
+ fld = @fldGenerator.ST(lineToHash(line), true)
369
+ puts fld
370
+ assert_equal(1,fld.size)
371
+
372
+ #PID.35 – PID.38 should be always blank, as they deal with animals, not humans.
373
+ line ='[max_length:80, description:Strain, ifrepeating:0, datatype:ST, required:O, piece:37]'
374
+ fld = @fldGenerator.ST(lineToHash(line), true)
375
+ puts fld
376
+ assert_equal(nil,fld)
377
+
378
+ fld = @fldGenerator.ST({}, true)
379
+ puts fld
380
+
381
+ line ='[max_length:15, symbol:*, description:Allergy Reaction Code, ifrepeating:1, datatype:ST, required:O, piece:5]'
382
+ fld = @fldGenerator.ST(lineToHash(line), true)
383
+ puts fld
384
+
385
+ end
386
+
387
+ def test_TN
388
+ line ='[datatype:TN, required:R, piece:1]'
389
+ fld = @fldGenerator.TN(lineToHash(line), true)
390
+ puts fld
391
+ assert_equal 13, fld.size
392
+ end
393
+
394
+ def test_UVC
395
+ line = '[piece:10, :description:Value Amount & Code (46-49), :datatype:UVC, :symbol:*, :repeatcount:8, :max_length:12, :required:O, :ifrepeating:1, :codetable:153]'
396
+ fld = @fldGenerator.UVC(lineToHash(line), true)
397
+ puts fld
398
+
399
+ line ='[datatype:UVC, required:R, piece:1]'
400
+ fld = @fldGenerator.UVC(lineToHash(line), true)
401
+ puts fld
402
+ assert fld.include?('^')
403
+ end
404
+
405
+ def test_VID
406
+ line ='[datatype:VID, required:R, piece:1]'
407
+ fld = @fldGenerator.VID(lineToHash(line), true)
408
+ puts fld
409
+ assert fld.to_i < 1000
410
+ end
411
+
412
+ def test_XAD
413
+ line ='[max_length:250, symbol:*, description:Patient Address, ifrepeating:1, datatype:XAD, required:O, piece:11]'
414
+ fld = @fldGenerator.XAD(lineToHash(line), true)
415
+ puts fld
416
+ assert_equal 6, fld.split('^').size
417
+ end
418
+
419
+ def test_XCN
420
+ line ='[max_length:250, symbol:*, description:Operator ID, ifrepeating:1, datatype:XCN, required:O, piece:5, codetable:188]'
421
+ fld = @fldGenerator.XCN(lineToHash(line), true)
422
+ puts fld
423
+ assert_equal 4, fld.split('^').size
424
+
425
+ line = '[max_length:250, symbol:*, description:Diagnosing Clinician, ifrepeating:1, datatype:XCN, required:O, piece:16]'
426
+ fld = @fldGenerator.XCN(lineToHash(line), true)
427
+ puts fld
428
+ assert_equal 4, fld.split('^').size
429
+ end
430
+
431
+ def test_XON
432
+ line ='[max_length:250, symbol:*, description:Patient Primary Facility, ifrepeating:1, datatype:XON, required:O, piece:3]'
433
+ fld = @fldGenerator.XON(lineToHash(line), true)
434
+ puts fld
435
+ assert_equal 3, fld.split('^').size
436
+ end
437
+
438
+ def test_XPN
439
+ line ='[max_length:250, symbol:*, description:Patient Alias, ifrepeating:1, datatype:XPN, required:B, piece:9]'
440
+ fld = @fldGenerator.XPN(lineToHash(line), true)
441
+ puts fld
442
+ assert_equal 3, fld.split('^').size
443
+ end
444
+
445
+ def test_XTN
446
+ line ='[max_length:250, symbol:*, description:Phone Number - Business, ifrepeating:1, datatype:XTN, required:O, piece:14]'
447
+ fld = @fldGenerator.XTN(lineToHash(line), true)
448
+ puts fld
449
+ assert /^\(\d{3}\)/.match(fld), 'Starts with (...)'
450
+ # assert fld.include?/(\d{3}\\)\d{3}-\d{4}/
451
+ end
452
+
453
+ def test_autoGenerate
454
+ map = {:required =>'B'}
455
+ refute (@fldGenerator.generate?(map)) # false
456
+
457
+ map = {:required =>'X'}
458
+ refute (@fldGenerator.generate?(map)) # false
459
+
460
+ map = {:required =>'W'}
461
+ refute (@fldGenerator.generate?(map)) # false
462
+
463
+ map = {:required =>'R'}
464
+ assert (@fldGenerator.generate?(map)) # true
465
+
466
+ map = {:required =>'O'}
467
+ puts @fldGenerator.generate?(map) # true or false random
468
+
469
+ map = {:required =>'O'}
470
+ assert @fldGenerator.generate?(map, true) # true or false random
471
+
472
+ map = {'required'=>'W'}
473
+ assert @fldGenerator.generate?(map, true) # true or false random
474
+ end
475
+
476
+
477
+ def test_generateLengthBoundId
478
+ actual = @fldGenerator.generate_length_bound_id(10, '12345')
479
+ puts actual
480
+ assert_equal('1234500000', actual)
481
+
482
+ actual = @fldGenerator.generate_length_bound_id(9)
483
+ puts actual
484
+ assert_equal(9, actual.size)
485
+
486
+ actual = @fldGenerator.generate_length_bound_id(1, '3000')
487
+ puts actual
488
+ assert_equal(1, actual.size)
489
+
490
+ actual = @fldGenerator.generate_length_bound_id(0)
491
+ puts actual
492
+ # assert_equal(, actual.size)
493
+ end
494
+
495
+ def test_getCodedValue_lenViolation
496
+ actual = @fldGenerator.get_coded_value({'codetable'=>'162', 'max_length' =>'1'})
497
+ puts actual
498
+ end
499
+
500
+
501
+ def test_getCodedValues_range3
502
+ # {"position"=>position='3', "value"=>value='2 ...', "description"=>description='For ranked secondary diagnoses'}
503
+ actual = @fldGenerator.get_coded_value({'codetable'=>'1', 'max_length' =>'2'})
504
+ puts actual
505
+ end
506
+
507
+ def test_getCodedMap_lenViolation
508
+ actual = @fldGenerator.get_coded_map({'codetable'=>'162', 'max_length' =>'1'})
509
+ puts actual
510
+ end
511
+
512
+ def test_getCodedValue_range1
513
+ actual = @fldGenerator.get_coded_map({'codetable'=>'112', 'max_length' =>'2'})
514
+ # puts actual
515
+ assert_equal({}, actual)
516
+ end
517
+
518
+ def test_getCodedValue_range2
519
+ actual = @fldGenerator.get_coded_map({'codetable'=>'141', 'max_length' =>'2'})
520
+ # puts actual
521
+ assert_equal({}, actual)
522
+
523
+ end
524
+
525
+ def test_handleRanges
526
+ # Change was made because Ensemble can't handle validation of ranges.
527
+ # Invalid value 'Q8' appears in segment 4:PD1, field 20, repetition 1, component 1, subcomponent 1, but does not
528
+ # appear in code table 2.4:141.
529
+ # I think you had to fix this one before to pull only the first and the last values from each row.
530
+
531
+ # { :position=>'1', :value=>'...', :description=>'No suggested values defined'}
532
+ code = @fldGenerator.handle_ranges('...')
533
+ assert_equal '', code
534
+
535
+ # {"position"=>'12' value='12 ... 16' description='Payer codes.' }
536
+ code = @fldGenerator.handle_ranges('12 ... 16').to_i
537
+ puts code
538
+ # assert 11 < code && code < 17
539
+ assert 12 == code || code == 16
540
+
541
+ #position='1' value='E1 ... E9' description='Enlisted'
542
+ code = @fldGenerator.handle_ranges('E1 ... E9')
543
+ puts code
544
+ assert 'E1' == code || code == 'E9'
545
+ # {"position"=>position='3', "value"=>value='2 ...', "description"=>description='For ranked secondary diagnoses'}
546
+ code = @fldGenerator.handle_ranges('2 ...')
547
+ # puts code
548
+ assert_equal '2', code
549
+ code = @fldGenerator.handle_ranges('A2 ...')
550
+ assert_equal 'A2', code
551
+ # puts code
552
+ # assert 'E0' < code && code <= 'E9'
553
+ end
554
+
555
+ # 112 141
556
+ def test_applyRules
557
+ # codes = Array (6 elements)
558
+ # [0] = Hash (3 elements)
559
+ # position => 1
560
+ # value => 1002-5
561
+ # description => American Indian or Alaska Native
562
+ # [1] = Hash (3 elements)
563
+ # [2] = Hash (3 elements)
564
+ # [3] = Hash (3 elements)
565
+ # [4] = Hash (3 elements)
566
+ # [5] = Hash (3 elements)
567
+
568
+
569
+ # attributes = Hash (8 elements)
570
+ # max_length => 250
571
+ # symbol => *
572
+ # description => Race
573
+ # ifrepeating => 1
574
+ # datatype => CE
575
+ # required => O
576
+ # piece => 10
577
+ # codetable => 5
578
+ # actual = @fldGenerator.apply_rules({'codetable'=>'141','max_length' =>'2'})
579
+ # puts actual
580
+ end
581
+
582
+ end