hqmf2js 1.0.1 → 1.1.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/hqmf2js.gemspec CHANGED
@@ -6,14 +6,14 @@ Gem::Specification.new do |s|
6
6
  s.description = "A library for converting HQMF files to executable JavaScript suitable for use with the hQuery Gateway"
7
7
  s.email = "hquery-talk@googlegroups.com"
8
8
  s.homepage = "http://github.com/hquery/hqmf2js"
9
- s.authors = ["Marc Hadley"]
10
- s.version = '1.0.1'
9
+ s.authors = ["Marc Hadley", "Andre Quina", "Andy Gregorowicz"]
10
+ s.version = '1.1.0'
11
11
 
12
- s.add_dependency 'nokogiri', '~> 1.5.2'
12
+ s.add_dependency 'nokogiri', '~> 1.5.5'
13
13
  s.add_dependency 'tilt', '~> 1.3.3'
14
14
  s.add_dependency 'coffee-script', '~> 2.2.0'
15
- s.add_dependency 'sprockets', '~> 2.1.2'
16
- s.add_development_dependency "awesome_print", "~> 0.3"
15
+ s.add_dependency 'sprockets', '~> 2.2.2'
16
+ s.add_development_dependency "awesome_print", "~> 1.1.0"
17
17
 
18
18
  s.files = s.files = `git ls-files`.split("\n")
19
19
  end
@@ -6,14 +6,14 @@ var events = [value];
6
6
  events = <%= temporal_reference.type %>(events, hqmfjs.<%= temporal_reference.reference.id %>(patient)<%= ", #{js_for_bounds(temporal_reference.range)}" if temporal_reference.range %>);
7
7
  <%- end -%>
8
8
  <%- end -%>
9
- events.specificContext=Specifics.identity();
9
+ events.specificContext=hqmf.SpecificsManager.identity();
10
10
  return events;
11
11
  <%- elsif criteria.property == :expired or criteria.property == :clinicalTrialParticipant -%>
12
12
  matching = matchingValue(value, 'true');
13
- matching.specificContext=Specifics.identity();
13
+ matching.specificContext=hqmf.SpecificsManager.identity();
14
14
  return matching
15
15
  <%- else -%>
16
16
  matching = matchingValue(value, <%= js_for_bounds(criteria.value) %>);
17
- matching.specificContext=Specifics.identity();
17
+ matching.specificContext=hqmf.SpecificsManager.identity();
18
18
  return matching;
19
19
  <%- end -%>
@@ -25,17 +25,17 @@ module HQMF2JS
25
25
  # Pretty stock map/reduce functions that call out to our converted HQMF code stored in the functions variable
26
26
  map = "function map(patient) {
27
27
  var ipp = hqmfjs.IPP(patient);
28
- if (Specifics.validate(ipp)) {
28
+ if (hqmf.SpecificsManager.validate(ipp)) {
29
29
  emit('ipp', 1);
30
- if (Specifics.validate(hqmfjs.DENEX(patient), ipp)) {
30
+ if (hqmf.SpecificsManager.validate(hqmfjs.DENEX(patient), ipp)) {
31
31
  emit('denex', 1);
32
32
  } else {
33
33
  var denom = hqmfjs.DENOM(patient);
34
- if (Specifics.validate(denom, ipp)) {
35
- if (Specifics.validate(hqmfjs.NUMER(patient), denom, ipp)) {
34
+ if (hqmf.SpecificsManager.validate(denom, ipp)) {
35
+ if (hqmf.SpecificsManager.validate(hqmfjs.NUMER(patient), denom, ipp)) {
36
36
  emit('denom', 1);
37
37
  emit('numer', 1);
38
- } else if (Specifics.validate(hqmfjs.DENEXCEP(patient), denom, ipp)) {
38
+ } else if (hqmf.SpecificsManager.validate(hqmfjs.DENEXCEP(patient), denom, ipp)) {
39
39
  emit('excep', 1);
40
40
  } else {
41
41
  emit('denom', 1);
@@ -19,20 +19,20 @@ hqmfjs.<%= js_name(criteria) %> = function(patient) {
19
19
  events = filterEventsByValue(events, <%= js_for_bounds(criteria.value) %>);
20
20
  <%- end -%>
21
21
  <%- if criteria.field_values.present?
22
- criteria.field_values.keys.each do |field|
23
- -%>
24
- events = filterEventsByField(events, "<%= field_method(field) %>", <%= js_for_bounds(criteria.field_values[field]) %>);
25
- <%- end
26
- end -%>
22
+ criteria.field_values.keys.each do |field| -%>
23
+ events = <%= field_library_method(field) %>(events, "<%= field_method(field) %>", <%= js_for_bounds(criteria.field_values[field]) %>);
24
+ <%- end -%>
25
+ <%- end -%>
27
26
  <%- if criteria.temporal_references and criteria.temporal_references.length > 0 -%>
28
27
  <%- criteria.temporal_references.each do |temporal_reference| -%>
29
- events = <%= temporal_reference.type %>(events, hqmfjs.<%= temporal_reference.reference.id %>(patient)<%= ", #{js_for_bounds(temporal_reference.range)}" if temporal_reference.range %>);
28
+ if (events.length > 0) events = <%= temporal_reference.type %>(events, hqmfjs.<%= temporal_reference.reference.id %>(patient)<%= ", #{js_for_bounds(temporal_reference.range)}" if temporal_reference.range %>);
29
+ else events.specificContext=hqmf.SpecificsManager.empty();
30
30
  <%- end -%>
31
31
  <%- else -%>
32
32
  <%- if criteria.specific_occurrence -%>
33
- events.specificContext=new Specifics(Row.buildForDataCriteria(events.specific_occurrence, events))
33
+ events.specificContext=new hqmf.SpecificOccurrence(Row.buildForDataCriteria(events.specific_occurrence, events))
34
34
  <%- else -%>
35
- events.specificContext=Specifics.identity()
35
+ events.specificContext=hqmf.SpecificsManager.identity()
36
36
  <%- end -%>
37
37
  <%- end -%>
38
38
  <%- if criteria.subset_operators -%>
data/lib/generator/js.rb CHANGED
@@ -46,6 +46,17 @@ module HQMF2JS
46
46
  HQMF::DataCriteria::FIELDS[field_name][:coded_entry_method].to_s.camelize(:lower)
47
47
  end
48
48
 
49
+ def field_library_method(field_name)
50
+ field_type = HQMF::DataCriteria::FIELDS[field_name][:field_type]
51
+ if field_type == :value
52
+ 'filterEventsByField'
53
+ elsif field_type == :timestamp
54
+ 'adjustBoundsForField'
55
+ elsif field_type == :nested_timestamp
56
+ 'denormalizeEventsByLocation'
57
+ end
58
+ end
59
+
49
60
  def js_for_value(value)
50
61
  if value
51
62
  if value.respond_to?(:derived?) && value.derived?
@@ -119,6 +130,8 @@ module HQMF2JS
119
130
  def js_for_code_list(criteria)
120
131
  if criteria.inline_code_list
121
132
  criteria.inline_code_list.to_json
133
+ elsif criteria.code_list_id.nil?
134
+ "null"
122
135
  else
123
136
  "getCodes(\"#{criteria.code_list_id}\")"
124
137
  end
@@ -187,6 +200,8 @@ module HQMF2JS
187
200
  #{js_for(population[HQMF::PopulationCriteria::NUMER], HQMF::PopulationCriteria::NUMER)}
188
201
  #{js_for(population[HQMF::PopulationCriteria::DENEX], HQMF::PopulationCriteria::DENEX)}
189
202
  #{js_for(population[HQMF::PopulationCriteria::DENEXCEP], HQMF::PopulationCriteria::DENEXCEP)}
203
+ // CV
204
+ #{js_for(population[HQMF::PopulationCriteria::MSRPOPL], HQMF::PopulationCriteria::MSRPOPL)}
190
205
  "
191
206
  end
192
207
 
@@ -200,7 +215,7 @@ module HQMF2JS
200
215
  json_list = specific_occurrences.map {|occurrence| occurrence.to_json}
201
216
  specifics_list = json_list.join(',')
202
217
  specifics_list = ",#{specifics_list}" unless specifics_list.empty?
203
- "hqmfjs.initializeSpecifics = function(patient_api, hqmfjs) { Specifics.initialize(patient_api,hqmfjs#{specifics_list}) }"
218
+ "hqmfjs.initializeSpecifics = function(patient_api, hqmfjs) { hqmf.SpecificsManager.initialize(patient_api,hqmfjs#{specifics_list}) }"
204
219
  end
205
220
 
206
221
  # Generate JS for a HQMF2::PopulationCriteria
@@ -225,16 +240,21 @@ module HQMF2JS
225
240
  Tilt::CoffeeScriptTemplate.default_bare = true
226
241
  ctx.append_path "app/assets/javascripts"
227
242
 
228
- ["// #########################\n// ###### PATIENT API #######\n// #########################\n",
243
+ ["// #########################\n// ###### Underscore.js #######\n// #######################\n",
244
+ ctx.find_asset('underscore').to_s,
245
+ "// #########################\n// ###### PATIENT API #######\n// #########################\n",
229
246
  HqueryPatientApi::Generator.patient_api_javascript.to_s,
247
+ "// #########################\n// ## SPECIFIC OCCURRENCES ##\n// #########################\n",
248
+ ctx.find_asset('specifics').to_s,
230
249
  "// #########################\n// ### LIBRARY FUNCTIONS ####\n// #########################\n",
231
250
  ctx.find_asset('hqmf_util').to_s,
232
251
  "// #########################\n// ### PATIENT EXTENSION ####\n// #########################\n",
233
252
  ctx.find_asset('patient_api_extension').to_s,
253
+ "// #########################\n// ## CUSTOM CALCULATIONS ###\n// #########################\n",
254
+ ctx.find_asset('custom_calculations').to_s,
234
255
  "// #########################\n// ##### LOGGING UTILS ######\n// #########################\n",
235
- ctx.find_asset('logging_utils').to_s,
236
- "// #########################\n// ## SPECIFIC OCCURRENCES ##\n// #########################\n",
237
- ctx.find_asset('specifics').to_s].join("\n")
256
+ ctx.find_asset('logging_utils').to_s].join("\n")
257
+
238
258
  end
239
259
 
240
260
  end
@@ -6,6 +6,12 @@
6
6
  codeSystemVersion="3"/>
7
7
  </ConceptList>
8
8
  </ValueSet>
9
+ <ValueSet id="2.16.840.1.113883.3.464.1.1142" displayName="diabetes">
10
+ <ConceptList xml:lang="en-US">
11
+ <Concept code="E10.36" codeSystemName="ICD-10-CM" displayName="Type 1 diabetes mellitus with diabetic cataract" codeSystemVersion="06/2009"/>
12
+ </ConceptList>
13
+ </ValueSet>
14
+
9
15
  <ValueSet id="2.16.840.1.113883.3.464.1.37" displayName="diabetes">
10
16
  <ConceptList xml:lang="en-US">
11
17
  <Concept code="E10.36" codeSystemName="ICD-10-CM"
@@ -100,7 +100,16 @@
100
100
  "V70.0"
101
101
  ]
102
102
  },
103
- "description": "Encounter Outpatient",
103
+ "description": "Encounter Outpatient",
104
+ "facility": {
105
+ "name": "Outpatient Clinic",
106
+ "start_time": 1290166000,
107
+ "end_time": 1291166000,
108
+ "code": {
109
+ "code": "bar",
110
+ "codeSystem": "SNOMED-CT"
111
+ }
112
+ },
104
113
  "end_time": 1291266000
105
114
  },
106
115
  {
@@ -201,6 +210,7 @@
201
210
  },
202
211
  "description": "Foot Exam",
203
212
  "time": 1291266000,
213
+ "incisionTime": 1112587200,
204
214
  "values": [
205
215
  {
206
216
  "scalar": "Normal",
data/test/test_helper.rb CHANGED
@@ -32,7 +32,6 @@ def get_js_context(javascript)
32
32
  end
33
33
 
34
34
  def initialize_javascript_context(hqmf_utils, codes_json, converted_hqmf)
35
- patient_api = File.open('test/fixtures/patient_api.js').read
36
35
  fixture_json = File.read('test/fixtures/patients/larry_vanderman.json')
37
36
  initialize_patient = 'var numeratorPatient = new hQuery.Patient(larry);'
38
37
 
@@ -41,13 +40,13 @@ def initialize_javascript_context(hqmf_utils, codes_json, converted_hqmf)
41
40
  else
42
41
  @context = V8::Context.new
43
42
  end
44
- @context.eval("#{patient_api}
43
+ @context.eval("
45
44
  #{hqmf_utils}
46
45
  var OidDictionary = #{codes_json};
47
46
  #{converted_hqmf}
48
47
  var larry = #{fixture_json};
49
48
  #{initialize_patient}")
50
- @context.eval("Specifics.initialize()")
49
+ @context.eval("hqmf.SpecificsManager.initialize()")
51
50
  end
52
51
 
53
52
  def compile_coffee_script
@@ -14,7 +14,7 @@ class CodesToJsonTest < Test::Unit::TestCase
14
14
 
15
15
  @context = get_js_context("var dictionary = #{codes_json}")
16
16
 
17
- @context.eval("dictionary").entries.length.must_equal 18
17
+ @context.eval("dictionary").entries.length.must_equal 19
18
18
  @context.eval("dictionary['2.16.840.1.113883.3.464.1.42']").entries.first[0].must_equal "CPT"
19
19
  @context.eval("dictionary['2.16.840.1.113883.3.464.1.42']").entries.first[1].length.must_equal 19
20
20
 
@@ -0,0 +1,74 @@
1
+ require_relative '../test_helper'
2
+ require 'hquery-patient-api'
3
+
4
+ class CustomCalculationsTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @context = get_js_context(HQMF2JS::Generator::JS.library_functions)
8
+ test_initialize_js =
9
+ "
10
+ inr1 = new hQuery.CodedEntry({time:#{Time.gm(2010,1,5).to_i}, values:[{scalar:'2.8'}]})
11
+ inr2 = new hQuery.CodedEntry({time:#{Time.gm(2010,1,18).to_i}, values:[{scalar:'3.5'}]})
12
+ inr3 = new hQuery.CodedEntry({time:#{Time.gm(2010,2,2).to_i}, values:[{scalar:'3.4'}]})
13
+ inr4 = new hQuery.CodedEntry({time:#{Time.gm(2010,2,15).to_i}, values:[{scalar:'3.9'}]})
14
+ inr5 = new hQuery.CodedEntry({time:#{Time.gm(2010,3,10).to_i}, values:[{scalar:'1.7'}]})
15
+ inr6 = new hQuery.CodedEntry({time:#{Time.gm(2010,3,24).to_i}, values:[{scalar:'2.3'}]})
16
+ inr7 = new hQuery.CodedEntry({time:#{Time.gm(2010,4,12).to_i}, values:[{scalar:'2.4'}]})
17
+ inr8 = new hQuery.CodedEntry({time:#{Time.gm(2010,5,13).to_i}, values:[{scalar:'3.2'}]})
18
+ inr9 = new hQuery.CodedEntry({time:#{Time.gm(2010,5,27).to_i}, values:[{scalar:'3.5'}]})
19
+ inr10 = new hQuery.CodedEntry({time:#{Time.gm(2010,6,10).to_i}, values:[{scalar:'3.5'}]})
20
+ inr11 = new hQuery.CodedEntry({time:#{Time.gm(2010,6,24).to_i}, values:[{scalar:'3.4'}]})
21
+ inr12 = new hQuery.CodedEntry({time:#{Time.gm(2010,7,8).to_i}, values:[{scalar:'2.1'}]})
22
+ inr13 = new hQuery.CodedEntry({time:#{Time.gm(2010,7,22).to_i}, values:[{scalar:'2.6'}]})
23
+
24
+ list = new hqmf.CustomCalc.PercentTTREntries([inr1,inr2,inr3,inr4,inr5,inr6,inr7,inr8,inr9,inr10,inr11,inr12,inr13])
25
+
26
+ inr_b1 = new hQuery.CodedEntry({time:#{Time.gm(2010,4,1).to_i}, values:[{scalar:'2.2'}]})
27
+ inr_b2 = new hQuery.CodedEntry({time:#{Time.gm(2010,5,7).to_i}, values:[{scalar:'2.0'}]})
28
+ inr_b3 = new hQuery.CodedEntry({time:#{Time.gm(2010,6,4).to_i}, values:[{scalar:'2.7'}]})
29
+ inr_b4 = new hQuery.CodedEntry({time:#{Time.gm(2010,7,10).to_i}, values:[{scalar:'2.2'}]})
30
+ inr_b5 = new hQuery.CodedEntry({time:#{Time.gm(2010,8,12).to_i}, values:[{scalar:'2.3'}]})
31
+ inr_b6 = new hQuery.CodedEntry({time:#{Time.gm(2010,9,11).to_i}, values:[{scalar:'2.8'}]})
32
+ inr_b7 = new hQuery.CodedEntry({time:#{Time.gm(2010,10,9).to_i}, values:[{scalar:'2.8'}]})
33
+ inr_b8 = new hQuery.CodedEntry({time:#{Time.gm(2010,10,17).to_i}, values:[{scalar:'2.1'}]})
34
+ inr_b9 = new hQuery.CodedEntry({time:#{Time.gm(2010,10,31).to_i}, values:[{scalar:'1.8'}]})
35
+
36
+ list2 = new hqmf.CustomCalc.PercentTTREntries([inr_b1,inr_b2,inr_b3,inr_b4,inr_b5,inr_b6,inr_b7,inr_b8,inr_b9])
37
+ "
38
+ @context.eval(test_initialize_js)
39
+
40
+
41
+ end
42
+
43
+
44
+ def test_inr_results
45
+ @context.eval("typeof(hqmf.CustomCalc.PercentTTREntries) === 'function'").must_equal true
46
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr1,inr2) - 3.714285714285717) < .001")
47
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr2,inr3)) == 0 ")
48
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr3,inr4)) == 0")
49
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr4,inr5) - 10.45454545) < .001")
50
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr5,inr6) - 7) < .001")
51
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr6,inr7) - 19) < .001")
52
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr7,inr8) - 23.25) < .001")
53
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr8,inr9)) == 0")
54
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr9,inr10)) == 0")
55
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr10,inr11)) == 0")
56
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr11,inr12) - 9.692307692) < .001")
57
+ assert @context.eval("Math.abs(list.calculateDaysInRange(inr12,inr13) - 14) < .001")
58
+
59
+ end
60
+
61
+ def test_total_number_of_days
62
+ @context.eval("list.totalNumberOfDays()").must_equal 198
63
+ end
64
+
65
+ def test_calculate_ttr
66
+ assert @context.eval("Math.abs(list.calculateTTR() - 87.11113886) < .001")
67
+ end
68
+
69
+ def test_calculate_percent_ttr
70
+ assert @context.eval("Math.abs(list.calculatePercentTTR() - 43.99552468) < .001")
71
+ end
72
+
73
+
74
+ end
@@ -33,17 +33,17 @@ class HqmfFromJsonJavascriptTest < Test::Unit::TestCase
33
33
  def test_converted_hqmf
34
34
  # Unspecified time bounds should be nil
35
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()")
36
+ assert_equal 2010, @context.eval("numeratorPatient.encounters()[0].asIVL_TS().high.asDate().getUTCFullYear()")
37
37
 
38
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()")
39
+ assert_equal 2011, @context.eval("MeasurePeriod.low.asDate().getUTCFullYear()")
40
+ assert_equal 0, @context.eval("MeasurePeriod.low.asDate().getUTCMonth()")
41
+ assert_equal 2011, @context.eval("MeasurePeriod.high.asDate().getUTCFullYear()")
42
+ assert_equal 11, @context.eval("MeasurePeriod.high.asDate().getUTCMonth()")
43
+ assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getUTCFullYear()")
44
+ assert_equal 0, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getUTCMonth()")
45
+ assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getUTCFullYear()")
46
+ assert_equal 11, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getUTCMonth()")
47
47
 
48
48
  # Age functions - Fixture is 37.1
49
49
  assert @context.eval("hqmfjs.ageBetween17and64(numeratorPatient).isTrue()")
@@ -8,8 +8,6 @@ class HqmfJavascriptTest < Test::Unit::TestCase
8
8
  doc = HQMF::Parser.parse(hqmf_contents, HQMF::Parser::HQMF_VERSION_2)
9
9
 
10
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
11
 
14
12
  # First compile the CoffeeScript that enables our converted HQMF JavaScript
15
13
  hqmf_utils = compile_coffee_script
@@ -46,10 +44,8 @@ class HqmfJavascriptTest < Test::Unit::TestCase
46
44
  def test_to_js_method
47
45
  value = @converter.to_js(0,@codes_hash)
48
46
  local_context = V8::Context.new
49
- patient_api = File.open('test/fixtures/patient_api.js').read
50
47
  hqmf_utils = HQMF2JS::Generator::JS.library_functions
51
- local_context.eval("#{patient_api}
52
- #{hqmf_utils}
48
+ local_context.eval("#{hqmf_utils}
53
49
  #{value}")
54
50
 
55
51
  local_context.eval('typeof hqmfjs != undefined').must_equal true
@@ -62,17 +58,17 @@ class HqmfJavascriptTest < Test::Unit::TestCase
62
58
  def test_converted_hqmf
63
59
  # Unspecified time bounds should be nil
64
60
  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()")
61
+ assert_equal 2010, @context.eval("numeratorPatient.encounters()[0].asIVL_TS().high.asDate().getUTCFullYear()")
66
62
 
67
63
  # 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()")
64
+ assert_equal 2011, @context.eval("MeasurePeriod.low.asDate().getUTCFullYear()")
65
+ assert_equal 0, @context.eval("MeasurePeriod.low.asDate().getUTCMonth()")
66
+ assert_equal 2011, @context.eval("MeasurePeriod.high.asDate().getUTCFullYear()")
67
+ assert_equal 11, @context.eval("MeasurePeriod.high.asDate().getUTCMonth()")
68
+ assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getUTCFullYear()")
69
+ assert_equal 0, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().low.asDate().getUTCMonth()")
70
+ assert_equal 2011, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getUTCFullYear()")
71
+ assert_equal 11, @context.eval("hqmfjs.MeasurePeriod()[0].asIVL_TS().high.asDate().getUTCMonth()")
76
72
 
77
73
  # Age functions - Fixture is 37.1
78
74
  assert @context.eval("hqmfjs.ageBetween17and64(numeratorPatient).isTrue()")
@@ -142,6 +138,32 @@ class HqmfJavascriptTest < Test::Unit::TestCase
142
138
  # getCode
143
139
  assert_equal 1, @context.eval('getCodes("2.16.840.1.113883.3.464.1.14")').count
144
140
  assert_equal "00110", @context.eval('getCodes("2.16.840.1.113883.3.464.1.14")["HL7"][0]')
141
+
142
+ # adjustBoundsForField
143
+ @context.eval('var procedures = numeratorPatient.procedures()')
144
+ assert_equal 7, @context.eval('procedures.length')
145
+ assert_equal 2010, @context.eval('procedures[0].timeStamp().getFullYear()')
146
+ assert_equal true, @context.eval('procedures[0].includesCodeFrom({"SNOMED-CT": ["401191002"]})')
147
+ @context.eval('var updatedProcedures = adjustBoundsForField(procedures, "incisionTime")')
148
+ assert_equal 1, @context.eval('updatedProcedures.length')
149
+ assert_equal 2005, @context.eval('updatedProcedures[0].timeStamp().getFullYear()')
150
+ assert_equal true, @context.eval('updatedProcedures[0].includesCodeFrom({"SNOMED-CT": ["401191002"]})')
151
+
152
+ # denormalizeEventsByLocation
153
+ @context.eval('var normalizedEncounters = denormalizeEventsByLocation(numeratorPatient.encounters(), "facilityArrival")')
154
+ assert_equal 1, @context.eval('normalizedEncounters.length')
155
+ assert_equal 10, @context.eval('normalizedEncounters[0].startDate().getUTCMonth()')
156
+ assert_equal 19, @context.eval('normalizedEncounters[0].startDate().getUTCDate()')
157
+ assert_equal 10, @context.eval('normalizedEncounters[0].endDate().getUTCMonth()')
158
+ assert_equal 19, @context.eval('normalizedEncounters[0].endDate().getUTCDate()')
159
+ assert_equal 'bar', @context.eval('normalizedEncounters[0].facility().code()')
160
+ assert_equal 'SNOMED-CT', @context.eval('normalizedEncounters[0].facility().codeSystemName()')
161
+ @context.eval('normalizedEncounters = denormalizeEventsByLocation(numeratorPatient.encounters(), "facilityDeparture")')
162
+ assert_equal 1, @context.eval('normalizedEncounters.length')
163
+ assert_equal 11, @context.eval('normalizedEncounters[0].startDate().getUTCMonth()')
164
+ assert_equal 1, @context.eval('normalizedEncounters[0].startDate().getUTCDate()')
165
+ assert_equal 11, @context.eval('normalizedEncounters[0].endDate().getUTCMonth()')
166
+ assert_equal 1, @context.eval('normalizedEncounters[0].endDate().getUTCDate()')
145
167
  end
146
168
 
147
169
  def test_map_reduce_generation
@@ -5,7 +5,7 @@ class LibraryFunctionTest < Test::Unit::TestCase
5
5
 
6
6
  def setup
7
7
  @context = get_js_context(HQMF2JS::Generator::JS.library_functions)
8
- @context.eval("Specifics.initialize()")
8
+ @context.eval("hqmf.SpecificsManager.initialize()")
9
9
  end
10
10
 
11
11
 
@@ -85,15 +85,15 @@ class LibraryFunctionTest < Test::Unit::TestCase
85
85
  ts = 'new TS("20110101")'
86
86
  ts2 = 'new TS("20100101")'
87
87
  ts3 = 'new TS("20120101")'
88
- assert_equal 2011, @context.eval("#{ts}.asDate().getFullYear()")
89
- assert_equal 0, @context.eval("#{ts}.asDate().getMonth()")
90
- assert_equal 1, @context.eval("#{ts}.asDate().getDate()")
91
- assert_equal 2012, @context.eval("#{ts}.add(new PQ(1, 'a')).asDate().getFullYear()")
92
- assert_equal 2, @context.eval("#{ts}.add(new PQ(1, 'd')).asDate().getDate()")
93
- assert_equal 8, @context.eval("#{ts}.add(new PQ(1, 'wk')).asDate().getDate()")
94
- assert_equal 1, @context.eval("#{ts}.add(new PQ(1, 'h')).asDate().getHours()")
95
- assert_equal 5, @context.eval("#{ts}.add(new PQ(5, 'min')).asDate().getMinutes()")
96
- assert_equal 11, @context.eval("#{ts}.add(new PQ(-1, 'mo')).asDate().getMonth()")
88
+ assert_equal 2011, @context.eval("#{ts}.asDate().getUTCFullYear()")
89
+ assert_equal 0, @context.eval("#{ts}.asDate().getUTCMonth()")
90
+ assert_equal 1, @context.eval("#{ts}.asDate().getUTCDate()")
91
+ assert_equal 2012, @context.eval("#{ts}.add(new PQ(1, 'a')).asDate().getUTCFullYear()")
92
+ assert_equal 2, @context.eval("#{ts}.add(new PQ(1, 'd')).asDate().getUTCDate()")
93
+ assert_equal 8, @context.eval("#{ts}.add(new PQ(1, 'wk')).asDate().getUTCDate()")
94
+ assert_equal 1, @context.eval("#{ts}.add(new PQ(1, 'h')).asDate().getUTCHours()")
95
+ assert_equal 5, @context.eval("#{ts}.add(new PQ(5, 'min')).asDate().getUTCMinutes()")
96
+ assert_equal 11, @context.eval("#{ts}.add(new PQ(-1, 'mo')).asDate().getUTCMonth()")
97
97
  assert @context.eval("#{ts2}.before(#{ts})")
98
98
  assert @context.eval("#{ts3}.after(#{ts})")
99
99
  assert !@context.eval("#{ts}.before(#{ts2})")
@@ -260,7 +260,7 @@ class LibraryFunctionTest < Test::Unit::TestCase
260
260
  ivl1 = 'new IVL_TS(new TS("20120310"), new TS("20120320"))'
261
261
  ivl2 = 'new IVL_TS(new TS("20120312"), new TS("20120320"))'
262
262
  assert @context.eval("#{ivl2}.DURING(#{ivl1})")
263
- assert_equal 2010, @context.eval('getIVL(new Date(2010,1,1)).low.asDate().getFullYear()')
263
+ assert_equal 2010, @context.eval('getIVL(new Date(Date.UTC(2010,1,1))).low.asDate().getUTCFullYear()')
264
264
  end
265
265
 
266
266
  def test_any_non_null
@@ -336,6 +336,7 @@ class LibraryFunctionTest < Test::Unit::TestCase
336
336
  # Events and bounds for temporal operators
337
337
  @context.eval('var events1 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120105"), new TS("20120105"));}}]')
338
338
  @context.eval('var events2 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120102"), new TS("20120105"));}}]')
339
+ @context.eval('var events3 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120105203030"), new TS("20120105203030"));}}]')
339
340
  @context.eval('var bound1 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120105"), new TS("20120105"));}}]')
340
341
  @context.eval('var bound2 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120107"), new TS("20120107"));}}]')
341
342
  @context.eval('var bound3 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120103"), new TS("20120107"));}}]')
@@ -344,8 +345,11 @@ class LibraryFunctionTest < Test::Unit::TestCase
344
345
  @context.eval('var nullStartBound = new IVL_TS(new TS("20120105"), new TS("20120105"));')
345
346
  @context.eval('nullStartBound.low.date = null;')
346
347
  @context.eval('var bound6 = {"asIVL_TS": function() {return nullStartBound;}}')
348
+ @context.eval('var bound7 = [{"asIVL_TS": function() {return new IVL_TS(new TS("20120105193030"), new TS("20120105193030"));}}]')
347
349
  @context.eval('var range1 = new IVL_PQ(null, new PQ(1, "d"))')
348
350
  @context.eval('var range2 = new IVL_PQ(new PQ(1, "d"), null)')
351
+ @context.eval('var range3 = new IVL_PQ(new PQ(0, "d"), null)')
352
+ @context.eval('var range4 = new IVL_PQ(null, new PQ(3, "d"))')
349
353
 
350
354
  # DURING
351
355
  assert_equal 1, @context.eval('DURING(events1, bound1)').count
@@ -408,6 +412,7 @@ class LibraryFunctionTest < Test::Unit::TestCase
408
412
  assert_equal 0, @context.eval('SBS(events2, bound1, range1)').count
409
413
  assert_equal 1, @context.eval('SBS(events2, bound1)').count
410
414
  assert_equal 1, @context.eval('SBS(events2, bound1, range2)').count
415
+ assert_equal 0, @context.eval('SBS(events3, bound7, range3)').count
411
416
 
412
417
  # SAS
413
418
  assert_equal 0, @context.eval('SAS(events1, bound1)').count
@@ -470,6 +475,19 @@ class LibraryFunctionTest < Test::Unit::TestCase
470
475
  # CONCURRENT
471
476
  assert_equal 1, @context.eval('CONCURRENT(events1, bound1)').count
472
477
  assert_equal 0, @context.eval('CONCURRENT(events1, bound2)').count
478
+
479
+ #DATEDIFF
480
+ @context.eval('var diffEvent1 = {"asIVL_TS": function() {return new IVL_TS(new TS("20120105"), new TS("20120105"));}, "timeStamp": function() {return new Date(Date.UTC(2012, 1, 5, 0, 0));}}')
481
+ @context.eval('var diffEvent2 = {"asIVL_TS": function() {return new IVL_TS(new TS("20120107"), new TS("20120107"));}, "timeStamp": function() {return new Date(Date.UTC(2012, 1, 7, 0, 0));}}')
482
+ @context.eval('var diffEvent3 = {"asIVL_TS": function() {return new IVL_TS(new TS("20120111"), new TS("20120111"));}, "timeStamp": function() {return new Date(Date.UTC(2012, 1, 11, 0, 0));}}')
483
+
484
+ assert_equal true, @context.eval('DATEDIFF([diffEvent1,diffEvent2],range4).isTrue()')
485
+ assert_equal true, @context.eval('DATEDIFF([diffEvent2,diffEvent1],range4).isTrue()')
486
+ assert_equal true, @context.eval('DATEDIFF([diffEvent1,diffEvent1],range4).isTrue()')
487
+
488
+ # false test
489
+
490
+
473
491
  end
474
492
 
475
493
  def test_ordinal_operators