1 package org.openehealth.ipf.modules.hl7.parser;
2
3 import ca.uhn.hl7v2.DefaultHapiContext;
4 import ca.uhn.hl7v2.HL7Exception;
5 import ca.uhn.hl7v2.HapiContext;
6 import ca.uhn.hl7v2.model.v23.message.ORU_R01;
7 import ca.uhn.hl7v2.model.v24.datatype.FT;
8 import ca.uhn.hl7v2.parser.EncodingCharacters;
9 import ca.uhn.hl7v2.parser.Parser;
10 import ca.uhn.hl7v2.parser.PipeParser;
11 import ca.uhn.hl7v2.validation.impl.ValidationContextImpl;
12 import org.junit.Test;
13
14 import java.io.IOException;
15
16 import static org.junit.Assert.assertEquals;
17
18
19
20
21 public class DefaultEscapingTest {
22
23 private EncodingCharacters enc = new EncodingCharacters('|', null);
24 private DefaultEscaping esc = DefaultEscaping.INSTANCE;
25
26 @Test
27 public void escapeLinebreakWithHapi() {
28 String s = "bl\ro~rg";
29 String escaped = esc.escape(s, enc);
30 assertEquals("bl\\X000d\\o\\R\\rg", escaped);
31 assertEquals(s, esc.unescape(escaped, enc));
32 }
33
34
35
36 @Test
37 public void escapeOnlyLinebreakWithHapi() {
38 String escape = esc.escape("\r", enc);
39 assertEquals("\\X000d\\", escape);
40 }
41
42 @Test
43 public void testSimpleEscape() {
44 String actual = esc.escape("GLUCOSE^1H POST 75 G GLUCOSE PO:SCNC:PT:SER/PLAS:QN", enc);
45 String expected = "GLUCOSE\\S\\1H POST 75 G GLUCOSE PO:SCNC:PT:SER/PLAS:QN";
46 assertEquals(expected, actual);
47 }
48
49
50
51
52 @Test
53 public void testTruncationEscape() {
54 String actual = esc.escape("Truncation#escape", enc);
55 String expected = "Truncation#escape";
56 assertEquals(expected, actual);
57 }
58
59
60 @Test
61 public void testFormattingCharacters() throws HL7Exception {
62
63 String msg = "MSH|^~\\&|ULTRA|TML|OLIS|OLIS|200911231509||ORU|5951|T|2.3\r" +
64 "PID|||7005728^^^TML^MR||LEIGHTON^RACHEL^DIAMOND||19310313|F|||200 ANYWHERE ST^^TORONTO^ON^M6H 2T9||(416)888-8888||||||1014071185^KR\r" +
65 "PV1|1||OLIS||||OLIST^BLAKE^DONALD^THOR^^^^^921379^^^^OLIST|||||||||^N\r" +
66 "ORC|RE||T09-106575-CHO-0^^OLIS_Site_ID^ISO|||||||||OLIST^BLAKE^DONALD^THOR^^^^L^921379\r" +
67 "OBR|0||T09-106575-CHO-0^^OLIS_Site_ID^ISO|CHO^CHOLESTEROL (SERUM)^HL79901 literal|||200911231455|||||||200911231455||OLIST^BLAKE^DONALD^THOR^^^^L^921379||10015716|10015716|T09-106575|MOHLTC|200911231509||B1|F||1^^^200911231455^^R\r" +
68 "NTE|1|L|\\.br\\ Lipid - Target Levels for Treatment \\.br\\\\.br\\ ****************************************************************\\.br\\ \\F\\ Risk \\F\\ \\F\\ \\F\\\\.br\\ \\F\\ Level \\F\\ 10-year CAD risk \\F\\ Recommendations \\F\\\\.br\\ \\F\\---------\\F\\------------------\\F\\---------------------------------\\F\\\\.br\\ \\F\\ \\F\\ \\F\\Treatment targets: \\F\\\\.br\\ \\F\\High* \\F\\ >=20% \\F\\ Primary: LDL-C <2.0 mmol/L \\F\\\\.br\\ \\F\\ \\F\\ \\F\\ Secondary: TC/HDL-C <4.0 \\F\\\\.br\\ \\F\\---------\\F\\------------------\\F\\---------------------------------\\F\\\\.br\\ \\F\\ \\F\\ \\F\\Treat when: \\F\\\\.br\\ \\F\\Moderate \\F\\ 10 - 19 % \\F\\ LDL-C >=3.5 mmol/L\\F\\\\.br\\ \\F\\ \\F\\ \\F\\ or TC/HDL-C >=5.0 \\F\\\\.br\\ \\F\\---------\\F\\------------------\\F\\---------------------------------\\F\\\\.br\\ \\F\\ \\F\\ \\F\\Treat when: \\F\\\\.br\\ \\F\\Low \\F\\ <10% \\F\\ LDL-C >=5.0 mmol/L\\F\\\\.br\\ \\F\\ \\F\\ \\F\\ or TC/HDL-C >=6.0 \\F\\\\.br\\****************************************************************\\.br\\ Notes:\\.br\\ * 10-year coronary artery disease (CAD) risk is accessed by\\.br\\ Framingham risk estimate tables.\\.br\\ * *High risk includes CAD, peripheral artery disease, cerebro-\\.br\\ vascular disease (CVD) and most patients with chronic kidney\\.br\\ disease or established diabetes mellitus.\\.br\\ * The patient must have been fasting for at least 12 hours prior\\.br\\ to taking ablood sample.\\.br\\ * Calculation: LDL-C (mmol/L) = Chol - (HDL-C + 0.46 x TG).\\.br\\ Calculation is invalid if TG exceed 4.5 mmol/L.\\.br\\ Ref: McPherson R et al. Can J Cardiol. 2006 Sep;22(11):913-27\r" +
69 "OBX|1|NM|Z049107^Cholesterol-serum^L||2.30|mmol/L|||||F|||200911231508|STP\r" +
70 "OBX|2|FT|Z101068^Tech Comment^L||Lab STP||||||F|||200911231508|STP";
71
72 HapiContext context = new DefaultHapiContext(new ValidationContextImpl());
73 ORU_R01 message = context.newMessage(ORU_R01.class);
74
75 message.parse(msg);
76
77 String encoded = message.encode();
78
79
80 assertEquals(msg.trim(), encoded.trim());
81
82 }
83
84
85 @Test
86 public void testFormattingCharacters2() throws HL7Exception {
87
88 String msg = "MSH|^~\\&|PHCN_ULTRA|2220|HSIE|2220|201106161233||ORU^R01|72313573|T|2.4|||AL|AL|AU\r" +
89 "PV1||I|^DIS^DIS^2220|||||0129296H^BRAUN^GARY|7MPH^MPH-HL7-RESULT FEED|||||||||I|^^^2220\r" +
90 "ORC|RE|^HNAM_ORDERID|11-6879530-GAS-0^PHCN_ULTRA||RE\r" +
91 "OBR|1|^HNAM_ORDERID|11-6879530-GAS-0^PHCN_ULTRA|GAS^GASES (BLOOD)|||201106161000|||||||||0129296H^BRAUN^GARY^^^DR^^^2220^^^^Provider Num||||1295102|7MPH|201106161233||GRP|F||^^^201106161203\r" +
92 "OBX|1|FT|GAS^^LN||Biochemistry (Whole Blood Sample) - Type Venous\\.br\\\\.br\\ Analysis Date : 16/06/2011\\.br\\ Analysis Time : 12:21\\.br\\\\.br\\ Measured Parameters :\\.br\\ pH : \\H\\ 7.28\\N\\ (7.38-7.43) *\\.br\\ pCO2 : \\H\\ 117\\N\\ mmHg (35-45) ***\\.br\\ pO2 : \\H\\ 37\\N\\ mmHg\\.br\\ Sodium : 140 mmol/L (136-142)\\.br\\ Potassium : 3.8 mmol/L (3.8-5.0)\\.br\\ Chloride : \\H\\ 83\\N\\ mmol/L (95-110) *\\.br\\ Ionised Calcium : 1.23 mmol/L (1.15-1.29)\\.br\\ Lactate : \\H\\ 2.1\\N\\ mmol/L (0.5-2.0) *\\.br\\ Glucose : \\H\\ 10.9\\N\\ mmol/L (4.0-7.8) *\\.br\\ Haemoglobin : 13.9 g/dL (11.5-16.5)\\.br\\ FO2Hb : \\H\\ 60.7\\N\\ % (94.0-97.0) *\\.br\\ FCOHb : \\H\\ 2.1\\N\\ % (< 1.5) *\\.br\\ FmetHb : 0.5 % (< 1.5)\\.br\\ FHHb : \\H\\ 36.7\\N\\ % (< 5.0) *\\.br\\ Haematocrit : 42.6 % (37.0-47.0)\\.br\\\\.br\\ Calculated (37 \\S\\o C) :\\.br\\ Actual HCO3 : \\H\\ 54\\N\\ mmol/L (20-24) ***\\.br\\ Standard HCO3 : \\H\\ 43\\N\\ mmol/L (22-26) *\\.br\\ Base Excess : \\H\\ +19.6\\N\\ mmol/L (-3.3 - +1.2) *\\.br\\ Oxygen Saturation : \\H\\ 62.5\\N\\ %\\.br\\\\.br\\ Note: The reference intervals for pH, pCO2 and pO2 apply for arterial\\.br\\ samples only.|||A|||F ";
93
94
95 Parser p = PipeParser.getInstanceWithNoValidation();
96
97 ca.uhn.hl7v2.model.v24.message.ORU_R01 message = (ca.uhn.hl7v2.model.v24.message.ORU_R01)p.parse(msg);
98
99 int intCountOBR = message.getPATIENT_RESULT().getORDER_OBSERVATIONReps();
100 for (int i = 0; i < intCountOBR; i++) {
101 message.getPATIENT_RESULT().getORDER_OBSERVATION(i).getOBR().removeObr16_OrderingProvider(0);
102 }
103
104 String encoded = message.encode();
105
106 assertEquals(msg.trim(), encoded.trim());
107 }
108
109 @Test
110 public void testPreserveFormattingChars() throws HL7Exception, IOException {
111
112 ORU_R01 msg = new ORU_R01();
113 msg.initQuickstart("ORU", "R01", "T");
114
115 FT ft = new FT(msg);
116 msg.getRESPONSE().getORDER_OBSERVATION().getOBSERVATION().getOBX().getObx2_ValueType().setValue("FT");
117 msg.getRESPONSE().getORDER_OBSERVATION().getOBSERVATION().getOBX().getObx5_ObservationValue(0).setData(ft);
118
119 ft.setValue("H \\H\\ N \\N\\ ");
120 assertEquals("H \\H\\ N \\N\\ ", ft.getValue());
121 assertEquals("H \\H\\ N \\N\\ ", ft.encode());
122
123 ft.setValue("H \\C00FF\\ N");
124 assertEquals("H \\C00FF\\ N", ft.getValue());
125 assertEquals("H \\C00FF\\ N", ft.encode());
126
127 }
128
129 }