hqmf2js 1.0.0
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.
- data/.gitignore +10 -0
- data/.travis.yml +17 -0
- data/Gemfile +41 -0
- data/Gemfile.lock +202 -0
- data/README.md +7 -0
- data/Rakefile +22 -0
- data/VERSION +1 -0
- data/app/assets/javascripts/hqmf_util.js.coffee +776 -0
- data/app/assets/javascripts/logging_utils.js.coffee +150 -0
- data/app/assets/javascripts/patient_api_extension.js.coffee +36 -0
- data/app/assets/javascripts/specifics.js.coffee +462 -0
- data/bin/hqmf2js.rb +25 -0
- data/config/warble.rb +144 -0
- data/hqmf2js.gemspec +20 -0
- data/lib/config/codes.xml +1935 -0
- data/lib/generator/characteristic.js.erb +19 -0
- data/lib/generator/codes_to_json.rb +81 -0
- data/lib/generator/converter.rb +60 -0
- data/lib/generator/data_criteria.js.erb +47 -0
- data/lib/generator/derived_data.js.erb +5 -0
- data/lib/generator/js.rb +263 -0
- data/lib/generator/measure_period.js.erb +18 -0
- data/lib/generator/patient_data.js.erb +22 -0
- data/lib/generator/population_criteria.js.erb +4 -0
- data/lib/generator/precondition.js.erb +14 -0
- data/lib/hqmf2js.rb +20 -0
- data/lib/hquery/engine.rb +4 -0
- data/lib/tasks/codes.rake +12 -0
- data/lib/tasks/coffee.rake +15 -0
- data/lib/tasks/convert.rake +47 -0
- data/lib/tasks/cover_me.rake +8 -0
- data/test/fixtures/NQF59New.xml +1047 -0
- data/test/fixtures/codes/codes.xls +0 -0
- data/test/fixtures/codes/codes.xml +1941 -0
- data/test/fixtures/i2b2.xml +305 -0
- data/test/fixtures/invalid/missing_id.xml +18 -0
- data/test/fixtures/invalid/unknown_criteria_type.xml +16 -0
- data/test/fixtures/invalid/unknown_demographic_entry.xml +16 -0
- data/test/fixtures/invalid/unknown_population_type.xml +9 -0
- data/test/fixtures/invalid/unknown_value_type.xml +18 -0
- data/test/fixtures/js/59New.js +366 -0
- data/test/fixtures/js/test1.js +356 -0
- data/test/fixtures/js/test2.js +366 -0
- data/test/fixtures/json/0043.json +6 -0
- data/test/fixtures/json/0043_hqmf1.json +1 -0
- data/test/fixtures/json/0043_hqmf2.json +172 -0
- data/test/fixtures/json/59New.json +1352 -0
- data/test/fixtures/patient_api.js +2823 -0
- data/test/fixtures/patients/francis_drake.json +1180 -0
- data/test/fixtures/patients/larry_vanderman.json +645 -0
- data/test/test_helper.rb +58 -0
- data/test/unit/codes_to_json_test.rb +38 -0
- data/test/unit/effective_date_test.rb +48 -0
- data/test/unit/hqmf_from_json_javascript_test.rb +108 -0
- data/test/unit/hqmf_javascript_test.rb +175 -0
- data/test/unit/library_function_test.rb +553 -0
- data/test/unit/specifics_test.rb +757 -0
- metadata +183 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class CodesToJsonTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def test_parsing_from_xml
|
10
|
+
|
11
|
+
codes_file_path = File.expand_path("../../fixtures/codes/codes.xml", __FILE__)
|
12
|
+
# Parse the code systems that are mapped to the OIDs we support
|
13
|
+
codes_json = HQMF2JS::Generator::CodesToJson.hash_to_js(HQMF2JS::Generator::CodesToJson.from_xml(codes_file_path))
|
14
|
+
|
15
|
+
@context = get_js_context("var dictionary = #{codes_json}")
|
16
|
+
|
17
|
+
@context.eval("dictionary").entries.length.must_equal 18
|
18
|
+
@context.eval("dictionary['2.16.840.1.113883.3.464.1.42']").entries.first[0].must_equal "CPT"
|
19
|
+
@context.eval("dictionary['2.16.840.1.113883.3.464.1.42']").entries.first[1].length.must_equal 19
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_parsing_from_xls
|
24
|
+
|
25
|
+
codes_file_path = File.expand_path("../../fixtures/codes/codes.xls", __FILE__)
|
26
|
+
# Parse the code systems that are mapped to the OIDs we support
|
27
|
+
codes_json = HQMF2JS::Generator::CodesToJson.hash_to_js(HQMF2JS::Generator::CodesToJson.from_xls(codes_file_path))
|
28
|
+
|
29
|
+
@context = get_js_context("var dictionary = #{codes_json}")
|
30
|
+
@context.eval("dictionary").entries.length.must_equal 12
|
31
|
+
@context.eval("dictionary['2.16.840.1.113883.3.464.0001.430']").entries.first[0].must_equal "RxNorm"
|
32
|
+
@context.eval("dictionary['2.16.840.1.113883.3.464.0001.430']").entries.first[1].length.must_equal 25
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class EffectiveDateTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
# Open a path to all of our fixtures
|
6
|
+
hqmf_contents = File.open("test/fixtures/NQF59New.xml").read
|
7
|
+
|
8
|
+
doc = HQMF::Parser.parse(hqmf_contents, HQMF::Parser::HQMF_VERSION_2)
|
9
|
+
|
10
|
+
# First compile the CoffeeScript that enables our converted HQMF JavaScript
|
11
|
+
ctx = Sprockets::Environment.new(File.expand_path("../../..", __FILE__))
|
12
|
+
Tilt::CoffeeScriptTemplate.default_bare = true
|
13
|
+
ctx.append_path "app/assets/javascripts"
|
14
|
+
hqmf_utils = HQMF2JS::Generator::JS.library_functions
|
15
|
+
|
16
|
+
# Convert the HQMF document included as a fixture into JavaScript
|
17
|
+
@converter = HQMF2JS::Generator::JS.new(doc)
|
18
|
+
converted_hqmf = "var effective_date = 1277870400; // June 30th 2010
|
19
|
+
#{@converter.js_for_data_criteria}
|
20
|
+
#{@converter.js_for('IPP')}
|
21
|
+
#{@converter.js_for('DENOM')}
|
22
|
+
#{@converter.js_for('NUMER')}
|
23
|
+
#{@converter.js_for('EXCEP')}
|
24
|
+
#{@converter.js_for('DUMMY')}"
|
25
|
+
|
26
|
+
# Now we can wrap and compile all of our code as one little JavaScript context for all of the tests below
|
27
|
+
if RUBY_PLATFORM=='java'
|
28
|
+
@context = Rhino::Context.new
|
29
|
+
else
|
30
|
+
@context = V8::Context.new
|
31
|
+
end
|
32
|
+
@context.eval("#{hqmf_utils}
|
33
|
+
#{converted_hqmf}")
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_override_hqmf_measure_period
|
37
|
+
# Measure variables
|
38
|
+
assert_equal 2009, @context.eval("MeasurePeriod.low.asDate().getFullYear()")
|
39
|
+
assert_equal 5, @context.eval("MeasurePeriod.low.asDate().getMonth()")
|
40
|
+
assert_equal 2010, @context.eval("MeasurePeriod.high.asDate().getFullYear()")
|
41
|
+
assert_equal 5, @context.eval("MeasurePeriod.high.asDate().getMonth()")
|
42
|
+
assert_equal 2009, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getFullYear()")
|
43
|
+
assert_equal 5, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getMonth()")
|
44
|
+
assert_equal 2010, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getFullYear()")
|
45
|
+
assert_equal 5, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getMonth()")
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class HqmfFromJsonJavascriptTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
json_measure = File.open("test/fixtures/json/59New.json").read
|
6
|
+
measure_hash = JSON.parse(json_measure)
|
7
|
+
|
8
|
+
doc = HQMF::Document.from_json(measure_hash)
|
9
|
+
|
10
|
+
codes_file_path = File.expand_path("../../fixtures/codes/codes.xml", __FILE__)
|
11
|
+
# This patient is identified from Cypress as in the denominator and numerator for NQF59
|
12
|
+
numerator_patient_json = File.read('test/fixtures/patients/larry_vanderman.json')
|
13
|
+
|
14
|
+
# First compile the CoffeeScript that enables our converted HQMF JavaScript
|
15
|
+
hqmf_utils = compile_coffee_script
|
16
|
+
|
17
|
+
# Parse the code systems that are mapped to the OIDs we support
|
18
|
+
@codes_hash = HQMF2JS::Generator::CodesToJson.from_xml(codes_file_path)
|
19
|
+
codes_json = HQMF2JS::Generator::CodesToJson.hash_to_js(@codes_hash)
|
20
|
+
|
21
|
+
# Convert the HQMF document included as a fixture into JavaScript
|
22
|
+
@converter = HQMF2JS::Generator::JS.new(doc)
|
23
|
+
converted_hqmf = "#{@converter.js_for_data_criteria}
|
24
|
+
#{@converter.js_for('IPP')}
|
25
|
+
#{@converter.js_for('DENOM')}
|
26
|
+
#{@converter.js_for('NUMER')}
|
27
|
+
#{@converter.js_for('EXCEP')}
|
28
|
+
#{@converter.js_for('DUMMY')}"
|
29
|
+
|
30
|
+
initialize_javascript_context(hqmf_utils, codes_json, converted_hqmf)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_converted_hqmf
|
34
|
+
# Unspecified time bounds should be nil
|
35
|
+
assert_equal nil, @context.eval("numeratorPatient.encounters()[0].asIVL_TS().low.asDate()")
|
36
|
+
assert_equal 2010, @context.eval("numeratorPatient.encounters()[0].asIVL_TS().high.asDate().getFullYear()")
|
37
|
+
|
38
|
+
# Measure variables
|
39
|
+
assert_equal 2011, @context.eval("MeasurePeriod.low.asDate().getFullYear()")
|
40
|
+
assert_equal 0, @context.eval("MeasurePeriod.low.asDate().getMonth()")
|
41
|
+
assert_equal 2011, @context.eval("MeasurePeriod.high.asDate().getFullYear()")
|
42
|
+
assert_equal 11, @context.eval("MeasurePeriod.high.asDate().getMonth()")
|
43
|
+
assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getFullYear()")
|
44
|
+
assert_equal 0, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getMonth()")
|
45
|
+
assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getFullYear()")
|
46
|
+
assert_equal 11, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getMonth()")
|
47
|
+
|
48
|
+
# Age functions - Fixture is 37.1
|
49
|
+
assert @context.eval("hqmfjs.ageBetween17and64(numeratorPatient).isTrue()")
|
50
|
+
assert @context.eval("hqmfjs.ageBetween30and39(numeratorPatient).isTrue()")
|
51
|
+
assert !@context.eval("hqmfjs.ageBetween17and21(numeratorPatient).isTrue()")
|
52
|
+
assert !@context.eval("hqmfjs.ageBetween22and29(numeratorPatient).isTrue()")
|
53
|
+
assert !@context.eval("hqmfjs.ageBetween40and49(numeratorPatient).isTrue()")
|
54
|
+
assert !@context.eval("hqmfjs.ageBetween50and59(numeratorPatient).isTrue()")
|
55
|
+
assert !@context.eval("hqmfjs.ageBetween60and64(numeratorPatient).isTrue()")
|
56
|
+
|
57
|
+
# Birthdate function
|
58
|
+
assert_equal 1, @context.eval("hqmfjs.birthdateThirtyYearsBeforeMeasurementPeriod(numeratorPatient)").count
|
59
|
+
assert_equal 0, @context.eval("hqmfjs.birthdateFiftyYearsBeforeMeasurementPeriod(numeratorPatient)").count
|
60
|
+
|
61
|
+
# Gender functions - Fixture is male
|
62
|
+
assert @context.eval("hqmfjs.genderMale(numeratorPatient).isTrue()")
|
63
|
+
assert !@context.eval("hqmfjs.genderFemale(numeratorPatient).isTrue()")
|
64
|
+
|
65
|
+
# Be sure the actual mechanic of code lists being returned works correctly - Using HasDiabetes as an example
|
66
|
+
results = @context.eval("hqmfjs.HasDiabetes(numeratorPatient)[0]")['json']
|
67
|
+
assert_equal 3, results['codes'].count
|
68
|
+
assert_equal '250', results['codes']['ICD-9-CM'].first
|
69
|
+
assert_equal 1270094400, results['time']
|
70
|
+
|
71
|
+
# Encounters
|
72
|
+
assert_equal 0, @context.eval("hqmfjs.EDorInpatientEncounter(numeratorPatient).length")
|
73
|
+
assert_equal 0, @context.eval("hqmfjs.AmbulatoryEncounter(numeratorPatient).length")
|
74
|
+
|
75
|
+
# Conditions
|
76
|
+
assert_equal 1, @context.eval("hqmfjs.HasDiabetes(numeratorPatient).length")
|
77
|
+
assert_equal 0, @context.eval("hqmfjs.HasGestationalDiabetes(numeratorPatient).length")
|
78
|
+
assert_equal 0, @context.eval("hqmfjs.HasPolycysticOvaries(numeratorPatient).length")
|
79
|
+
assert_equal 0, @context.eval("hqmfjs.HasSteroidInducedDiabetes(numeratorPatient).length")
|
80
|
+
|
81
|
+
# Results
|
82
|
+
assert_equal 2, @context.eval("hqmfjs.HbA1C(numeratorPatient).length")
|
83
|
+
|
84
|
+
# Medications
|
85
|
+
assert_equal 1, @context.eval("hqmfjs.DiabetesMedAdministered(numeratorPatient).length")
|
86
|
+
assert_equal 1, @context.eval("hqmfjs.DiabetesMedAdministeredFor7Days(numeratorPatient).length")
|
87
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedAdministeredFor9Days(numeratorPatient).length")
|
88
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedIntended(numeratorPatient).length")
|
89
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedSupplied(numeratorPatient).length")
|
90
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedOrdered(numeratorPatient).length")
|
91
|
+
|
92
|
+
# Standard population health query buckets
|
93
|
+
assert @context.eval("hqmfjs.IPP(numeratorPatient).isTrue()")
|
94
|
+
assert @context.eval("hqmfjs.DENOM(numeratorPatient).isTrue()")
|
95
|
+
assert @context.eval("hqmfjs.NUMER(numeratorPatient).isTrue()")
|
96
|
+
assert !@context.eval("hqmfjs.EXCEP(numeratorPatient).isTrue()")
|
97
|
+
|
98
|
+
# COUNTing
|
99
|
+
assert @context.eval("hqmfjs.moreThanTwoHbA1CTests(numeratorPatient).isTrue()")
|
100
|
+
assert !@context.eval("hqmfjs.moreThanFourHbA1CTests(numeratorPatient).isTrue()")
|
101
|
+
|
102
|
+
# UNIONing
|
103
|
+
assert_equal 1, @context.eval("hqmfjs.anyDiabetes(numeratorPatient).length")
|
104
|
+
|
105
|
+
# XPRODUCTing
|
106
|
+
assert_equal 1, @context.eval("hqmfjs.allDiabetes(numeratorPatient).length")
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class HqmfJavascriptTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
# Open a path to all of our fixtures
|
6
|
+
hqmf_contents = File.open("test/fixtures/NQF59New.xml").read
|
7
|
+
|
8
|
+
doc = HQMF::Parser.parse(hqmf_contents, HQMF::Parser::HQMF_VERSION_2)
|
9
|
+
|
10
|
+
codes_file_path = File.expand_path("../../fixtures/codes/codes.xml", __FILE__)
|
11
|
+
# This patient is identified from Cypress as in the denominator and numerator for NQF59
|
12
|
+
numerator_patient_json = File.read('test/fixtures/patients/larry_vanderman.json')
|
13
|
+
|
14
|
+
# First compile the CoffeeScript that enables our converted HQMF JavaScript
|
15
|
+
hqmf_utils = compile_coffee_script
|
16
|
+
|
17
|
+
# Parse the code systems that are mapped to the OIDs we support
|
18
|
+
@codes_hash = HQMF2JS::Generator::CodesToJson.from_xml(codes_file_path)
|
19
|
+
codes_json = HQMF2JS::Generator::CodesToJson.hash_to_js(@codes_hash)
|
20
|
+
|
21
|
+
# Convert the HQMF document included as a fixture into JavaScript
|
22
|
+
@converter = HQMF2JS::Generator::JS.new(doc)
|
23
|
+
converted_hqmf = "#{@converter.js_for_data_criteria}
|
24
|
+
#{@converter.js_for('IPP')}
|
25
|
+
#{@converter.js_for('DENOM')}
|
26
|
+
#{@converter.js_for('NUMER')}
|
27
|
+
#{@converter.js_for('EXCEP')}
|
28
|
+
#{@converter.js_for('DUMMY')}"
|
29
|
+
|
30
|
+
initialize_javascript_context(hqmf_utils, codes_json, converted_hqmf)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_codes
|
34
|
+
# Make sure we're recalling entries correctly
|
35
|
+
assert_equal 1, @context.eval('OidDictionary["2.16.840.1.113883.3.464.1.14"]').count
|
36
|
+
assert_equal "00110", @context.eval('OidDictionary["2.16.840.1.113883.3.464.1.14"]["HL7"][0]')
|
37
|
+
|
38
|
+
# OIDs that are matched to multiple code systems should also work correctly
|
39
|
+
# The list of supported OIDs will eventually be long, so this won't be an exhaustive test, just want to be sure the functionality is right
|
40
|
+
assert_equal 3, @context.eval('OidDictionary["2.16.840.1.113883.3.464.1.72"]').count
|
41
|
+
assert_equal 2, @context.eval('OidDictionary["2.16.840.1.113883.3.464.1.72"]["CPT"]').count
|
42
|
+
assert_equal 3, @context.eval('OidDictionary["2.16.840.1.113883.3.464.1.72"]["LOINC"]').count
|
43
|
+
assert_equal 9, @context.eval('OidDictionary["2.16.840.1.113883.3.464.1.72"]["SNOMED-CT"]').count
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_to_js_method
|
47
|
+
value = @converter.to_js(0,@codes_hash)
|
48
|
+
local_context = V8::Context.new
|
49
|
+
patient_api = File.open('test/fixtures/patient_api.js').read
|
50
|
+
hqmf_utils = HQMF2JS::Generator::JS.library_functions
|
51
|
+
local_context.eval("#{patient_api}
|
52
|
+
#{hqmf_utils}
|
53
|
+
#{value}")
|
54
|
+
|
55
|
+
local_context.eval('typeof hqmfjs != undefined').must_equal true
|
56
|
+
local_context.eval('typeof OidDictionary != undefined').must_equal true
|
57
|
+
local_context.eval('typeof hqmfjs.IPP != undefined').must_equal true
|
58
|
+
local_context.eval('typeof hqmfjs.NUMER != undefined').must_equal true
|
59
|
+
local_context.eval('typeof hqmfjs.DENOM != undefined').must_equal true
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_converted_hqmf
|
63
|
+
# Unspecified time bounds should be nil
|
64
|
+
assert_equal nil, @context.eval("numeratorPatient.encounters()[0].asIVL_TS().low.asDate()")
|
65
|
+
assert_equal 2010, @context.eval("numeratorPatient.encounters()[0].asIVL_TS().high.asDate().getFullYear()")
|
66
|
+
|
67
|
+
# Measure variables
|
68
|
+
assert_equal 2011, @context.eval("MeasurePeriod.low.asDate().getFullYear()")
|
69
|
+
assert_equal 0, @context.eval("MeasurePeriod.low.asDate().getMonth()")
|
70
|
+
assert_equal 2011, @context.eval("MeasurePeriod.high.asDate().getFullYear()")
|
71
|
+
assert_equal 11, @context.eval("MeasurePeriod.high.asDate().getMonth()")
|
72
|
+
assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getFullYear()")
|
73
|
+
assert_equal 0, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getMonth()")
|
74
|
+
assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getFullYear()")
|
75
|
+
assert_equal 11, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getMonth()")
|
76
|
+
|
77
|
+
# Age functions - Fixture is 37.1
|
78
|
+
assert @context.eval("hqmfjs.ageBetween17and64(numeratorPatient).isTrue()")
|
79
|
+
assert @context.eval("hqmfjs.ageBetween30and39(numeratorPatient).isTrue()")
|
80
|
+
assert !@context.eval("hqmfjs.ageBetween17and21(numeratorPatient).isTrue()")
|
81
|
+
assert !@context.eval("hqmfjs.ageBetween22and29(numeratorPatient).isTrue()")
|
82
|
+
assert !@context.eval("hqmfjs.ageBetween40and49(numeratorPatient).isTrue()")
|
83
|
+
assert !@context.eval("hqmfjs.ageBetween50and59(numeratorPatient).isTrue()")
|
84
|
+
assert !@context.eval("hqmfjs.ageBetween60and64(numeratorPatient).isTrue()")
|
85
|
+
|
86
|
+
# Birthdate function
|
87
|
+
assert_equal 1, @context.eval("hqmfjs.birthdateThirtyYearsBeforeMeasurementPeriod(numeratorPatient)").count
|
88
|
+
assert_equal 0, @context.eval("hqmfjs.birthdateFiftyYearsBeforeMeasurementPeriod(numeratorPatient)").count
|
89
|
+
|
90
|
+
# Gender functions - Fixture is male
|
91
|
+
assert @context.eval("hqmfjs.genderMale(numeratorPatient).isTrue()")
|
92
|
+
assert !@context.eval("hqmfjs.genderFemale(numeratorPatient).isTrue()")
|
93
|
+
|
94
|
+
# Be sure the actual mechanic of code lists being returned works correctly - Using HasDiabetes as an example
|
95
|
+
results = @context.eval("hqmfjs.HasDiabetes(numeratorPatient)[0]")['json']
|
96
|
+
assert_equal 3, results['codes'].count
|
97
|
+
assert_equal '250', results['codes']['ICD-9-CM'].first
|
98
|
+
assert_equal 1270094400, results['time']
|
99
|
+
|
100
|
+
# Encounters
|
101
|
+
assert_equal 0, @context.eval("hqmfjs.EDorInpatientEncounter(numeratorPatient).length")
|
102
|
+
assert_equal 0, @context.eval("hqmfjs.AmbulatoryEncounter(numeratorPatient).length")
|
103
|
+
|
104
|
+
# Conditions
|
105
|
+
assert_equal 1, @context.eval("hqmfjs.HasDiabetes(numeratorPatient).length")
|
106
|
+
assert_equal 0, @context.eval("hqmfjs.HasGestationalDiabetes(numeratorPatient).length")
|
107
|
+
assert_equal 0, @context.eval("hqmfjs.HasPolycysticOvaries(numeratorPatient).length")
|
108
|
+
assert_equal 0, @context.eval("hqmfjs.HasSteroidInducedDiabetes(numeratorPatient).length")
|
109
|
+
|
110
|
+
# Results
|
111
|
+
assert_equal 2, @context.eval("hqmfjs.HbA1C(numeratorPatient).length")
|
112
|
+
|
113
|
+
# Medications
|
114
|
+
assert_equal 1, @context.eval("hqmfjs.DiabetesMedAdministered(numeratorPatient).length")
|
115
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedIntended(numeratorPatient).length")
|
116
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedSupplied(numeratorPatient).length")
|
117
|
+
assert_equal 0, @context.eval("hqmfjs.DiabetesMedOrdered(numeratorPatient).length")
|
118
|
+
|
119
|
+
# Standard population health query buckets
|
120
|
+
assert @context.eval("hqmfjs.IPP(numeratorPatient).isTrue()")
|
121
|
+
assert @context.eval("hqmfjs.DENOM(numeratorPatient).isTrue()")
|
122
|
+
assert @context.eval("hqmfjs.NUMER(numeratorPatient).isTrue()")
|
123
|
+
assert !@context.eval("hqmfjs.EXCEP(numeratorPatient).isTrue()")
|
124
|
+
|
125
|
+
# COUNTing
|
126
|
+
assert @context.eval("hqmfjs.moreThanTwoHbA1CTests(numeratorPatient).isTrue()")
|
127
|
+
assert !@context.eval("hqmfjs.moreThanFourHbA1CTests(numeratorPatient).isTrue()")
|
128
|
+
|
129
|
+
# UNIONing
|
130
|
+
assert_equal 1, @context.eval("hqmfjs.anyDiabetes(numeratorPatient).length")
|
131
|
+
|
132
|
+
# XPRODUCTing
|
133
|
+
assert_equal 1, @context.eval("hqmfjs.allDiabetes(numeratorPatient).length")
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_converted_utils
|
137
|
+
# Filter events by value - HbA1C as an example
|
138
|
+
events = 'numeratorPatient.results().match(getCodes("2.16.840.1.113883.3.464.1.72"))'
|
139
|
+
assert_equal 2, @context.eval("filterEventsByValue(#{events}, new IVL_PQ(new PQ(9, '%'), null))").count
|
140
|
+
assert_equal 0, @context.eval("filterEventsByValue(#{events}, new IVL_PQ(new PQ(10, '%'), null))").count
|
141
|
+
|
142
|
+
# getCode
|
143
|
+
assert_equal 1, @context.eval('getCodes("2.16.840.1.113883.3.464.1.14")').count
|
144
|
+
assert_equal "00110", @context.eval('getCodes("2.16.840.1.113883.3.464.1.14")["HL7"][0]')
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_map_reduce_generation
|
148
|
+
hqmf_contents = File.open("test/fixtures/NQF59New.xml").read
|
149
|
+
doc = HQMF::Parser.parse(hqmf_contents, HQMF::Parser::HQMF_VERSION_2)
|
150
|
+
|
151
|
+
map_reduce = HQMF2JS::Converter.generate_map_reduce(doc)
|
152
|
+
|
153
|
+
# Extremely loose testing here. Just want to be sure for now that we're getting results of some kind.
|
154
|
+
# We'll test for validity over on the hQuery Gateway side of things.
|
155
|
+
assert map_reduce[:map].include? 'map'
|
156
|
+
assert map_reduce[:reduce].include? 'reduce'
|
157
|
+
# Check functions to include actual HQMF converted function, HQMF utility function, and OID dictionary
|
158
|
+
assert map_reduce[:functions].include? 'IPP'
|
159
|
+
assert map_reduce[:functions].include? 'atLeastOneTrue'
|
160
|
+
assert map_reduce[:functions].include? 'OidDictionary'
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
def test_missing_id
|
165
|
+
|
166
|
+
context = HQMF2JS::Generator::ErbContext.new({})
|
167
|
+
criteria = HQMF::DataCriteria.new(nil,nil,nil,nil,nil,nil,nil,'patient_characteristic',nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,nil)
|
168
|
+
|
169
|
+
exception = assert_raise RuntimeError do
|
170
|
+
n = context.js_name(criteria)
|
171
|
+
end
|
172
|
+
assert exception.message.match(/^No identifier for .*/)
|
173
|
+
end
|
174
|
+
|
175
|
+
end
|