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,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