/// <summary> /// Handles the Click event of the btnParse control. /// Retreives the HL7 from the text box and attempts to parse it using NHapi. /// If successfull, it retreives all of the fields and displays them in the TreeListView /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> private void btnParse_Click(object sender, EventArgs e) { try { string hl7 = this.tbMessage.Text; PipeParser parser = new PipeParser(); IMessage hl7Message; if (!string.IsNullOrEmpty(this.tbVersion.Text)) { hl7Message = parser.Parse(hl7, this.tbVersion.Text); } else { hl7Message = parser.Parse(hl7); } if (hl7Message != null) { this.lblMessageType.Text = hl7Message.GetStructureName(); this.lblMessageVersion.Text = hl7Message.Version; FieldGroup messageGroup = new FieldGroup() { Name = hl7Message.GetStructureName() }; this.ProcessStructureGroup((AbstractGroup)hl7Message, messageGroup); this.treeListView1.Objects = messageGroup.FieldList; this.treeListView1.ExpandAll(); } } catch (Exception err) { MessageBox.Show(err.Message); } }
public void TestGithubIssue24CantGetIN1Segment() { string message = @"MSH|^~\&|SUNS1|OVI02|AZIS|CMD|200606221348||ADT^A01|1049691900|P|2.4 EVN|A01|200601060800 PID||8912716038^^^51276|0216128^^^51276||BARDOUN^LEA SACHA||19981201|F|||AVENUE FRANC GOLD 8^^LUXEMBOURGH^^6780^150||053/12456789||N|S|||99120162652||^^^|||||B PV1||O|^^|U|||07632^MORTELO^POL^^^DR.|^^^^^|||||N||||||0200001198 PV2|||^^AZIS||N|||200601060800 IN1|0001|2|314000|||||||||19800101|||1|BARDOUN^LEA SACHA|1|19981201|AVENUE FRANC GOLD 8^^LUXEMBOURGH^^6780^150||||||||||||||||| ZIN|0164652011399|0164652011399|101|101|45789^Broken bone" ; var parser = new PipeParser(); var abstractMessage = parser.Parse(message); var typedMessage = abstractMessage as ADT_A01; // This is supposed to throw an exception with error 'IN1 does not exist in the group NHapi.Model.V24.Message.ADT_A01' Assert.Throws <HL7Exception>(delegate { var causesException = (IN1)typedMessage.GetStructure("IN1"); }); // This will work as the IN1 resides within the insurance group's structure var in1 = (IN1)typedMessage.GetINSURANCE(0).GetStructure("IN1"); // old style of accessing the data Assert.IsTrue(typedMessage.GetINSURANCE(0).IN1.SetIDIN1.Value == "0001"); // new style of accessing the data Assert.IsTrue(typedMessage.INSURANCEs.First().IN1.SetIDIN1.Value == "0001"); }
static void Main(string[] args) { const string customSegmentBasedHl7Message = "MSH|^~\\&|SUNS1|OVI02|AZIS|CMD|200606221348||ADT^A01|1049691900|P|2.3\r" + "EVN|A01|200803051509||||200803031508\r" + "PID|||5520255^^^PK^PK~ZZZZZZ83M64Z148R^^^CF^CF~ZZZZZZ83M64Z148R^^^SSN^SSN^^20070103^99991231~^^^^TEAM||ZZZ^ZZZ||19830824|F||||||||||||||||||||||N\r" + "ZPV|Some Custom Notes|Additional custom description of the visit goes here"; var enhancedModelClassFactory = new EnhancedModelClassFactory(); var pipeParser = new PipeParser(enhancedModelClassFactory); enhancedModelClassFactory.ValidationContext = pipeParser.ValidationContext; LogToDebugConsole("Attempting to parse message string into HL7 message object..."); var ourHl7Message = pipeParser.Parse(customSegmentBasedHl7Message); LogToDebugConsole("Parsed message into generic ADT_A01 message successfully..."); LogToDebugConsole("Unwrapping payload from our custom ADT_A01 message using GenericMessageWrapper class..."); var wrappedGenericMessage = ourHl7Message as GenericMessageWrapper; var originalMessage = wrappedGenericMessage?.Unwrap(); if (wrappedGenericMessage?.GetSegment <ISegment>("ZPV") != null) { LogToDebugConsole("Casting unwrapped payload into our custom ADT A01 class..."); //casting to our custom class and retrieving the custom segment within it var zpvSegment = ((NHapi.Model.CustomZSegments.Message.ADT_A01)originalMessage).ZPV; LogToDebugConsole($"Custom Notes retrieved from ZPV segment was -> {zpvSegment.CustomNotes.Value}"); LogToDebugConsole($"Custom Description retrieved from ZPV segment was -> {zpvSegment.CustomDescription.Value}"); LogToDebugConsole("Entire parse operation completed successfully..."); } }
public void ParseORMo01ToXml() { string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443 PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188 ORC|NW|01444^00001|||||||||||L OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE "; PipeParser Parser = new PipeParser(); IMessage m = Parser.Parse(Message); ORM_O01 ormo01 = m as ORM_O01; XMLParser xmlParser = new DefaultXMLParser(); string recoveredMessage = xmlParser.Encode(ormo01); Assert.AreNotEqual(string.Empty, recoveredMessage); XmlDocument ormDoc = new XmlDocument(); ormDoc.LoadXml(recoveredMessage); Assert.IsNotNull(ormDoc); }
public void ParseORMwithOBXToXML() { string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443 PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188 ORC|NW|01444^00001|||||||||||L OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE OBX||NM|||999|||||| OBX||NM|||999|||||| OBX||NM|||999||||||"; PipeParser Parser = new PipeParser(); IMessage m = Parser.Parse(Message); ORM_O01 msgObj = m as ORM_O01; Assert.IsNotNull(msgObj); XMLParser xmlParser = new DefaultXMLParser(); string recoveredMessage = xmlParser.Encode(msgObj); Assert.IsNotNull(recoveredMessage); Assert.IsFalse(string.Empty.Equals(recoveredMessage)); }
public void TestGithubIssue25CantGetRepetition() { string message = @"MSH|^~\&|MILL|EMRY|MQ|EMRY|20150619155451||ADT^A08|Q2043855220T2330403781X928163|P|2.3||||||8859/1 EVN|A08|20150619155451 PID|1|935307^^^EUH MRN^MRN^EH01|25106376^^^TEC MRN~1781893^^^CLH MRN~935307^^^EUH MRN~5938067^^^EMPI|1167766^^^CPI NBR^^EXTERNAL~90509411^^^HNASYSID~10341880^^^HNASYSID~50627780^^^HNASYSID~5938067^^^MSG_CERNPHR|Patient^Test^Test^^^^Cur_Name||19400101|F||WHI|123 ENDOFTHE RD^UNIT 123^ATLANTA^GA^40000^USA^HOME^^||5555555555^HOME~6666666666^[email protected]^EMAIL|6666666666^BUS|ENG|M|OTH|12345665161^^^EUH FIN^FIN NBR^EH01|123454103|GA123450071||Non-Hispanic|||0|""|""|""||N"; PipeParser parser = new PipeParser(); IMessage m = parser.Parse(message); ADT_A01 adtA01 = m as ADT_A01; // a08 is mapped to a01 Assert.IsNotNull(adtA01); for (int rep = 0; rep < adtA01.PID.PatientIDInternalIDRepetitionsUsed; rep++) { var cx = adtA01.PID.GetPatientIDInternalID(rep); Console.WriteLine(cx.ID.Value); } for (int rep = 0; rep < adtA01.PID.AlternatePatientIDRepetitionsUsed; rep++) { var cx = adtA01.PID.GetAlternatePatientID(rep); Console.WriteLine(cx.ID.Value); } }
public void ParseORMo01PIDSegment() { var message = "MSH|^~\\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB\r" + "PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443\r" + "PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188\r" + "ORC|NW|01444^00001|||||||||||L\r" + "OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE"; var parser = new PipeParser(); var m = parser.Parse(message); var ormo01 = m as ORM_O01; Assert.IsNotNull(ormo01); Assert.AreEqual("TRAINONLYPOE", ormo01.PATIENT.PID.GetPatientName()[0].FamilyLastName.FamilyName.Value); Assert.AreEqual("19770903", ormo01.PATIENT.PID.DateTimeOfBirth.TimeOfAnEvent.Value); Assert.AreEqual("F", ormo01.PATIENT.PID.Sex.Value); Assert.AreEqual("W", ormo01.PATIENT.PID.GetRace()[0].Identifier.Value); Assert.AreEqual( "ABAZA, MONA M", ormo01.PATIENT.PATIENT_VISIT.PV1.GetAttendingDoctor(0).FamilyLastName.FamilyName.Value); }
public IList <Medication> parse(string message) { PipeParser parser = new PipeParser(); RTB_K13 rtb_k13 = (RTB_K13)parser.Parse(message); string responseStatus = rtb_k13.QAK.QueryResponseStatus.Value; if (String.Equals("NF", responseStatus, StringComparison.CurrentCultureIgnoreCase)) { // TODO - see RxProfileDecoder.decode return(null); } if (!String.Equals("OK", responseStatus, StringComparison.CurrentCultureIgnoreCase)) { throw new MdoException("Received processing error: " + message); } int recordCount = Int32.Parse(rtb_k13.QAK.ThisPayload.Value); IList <Medication> meds = new List <Medication>(); for (int i = 0; i < recordCount; i++) { RDT rdt = rtb_k13.ROW_DEFINITION.GetRDT(i); meds.Add(buildMedication(rdt)); } return(meds); }
public static void Main(string[] args) { try { // instantiate a PipeParser, which handles the "traditional or default encoding" var ourPipeParser = new PipeParser(); // parse the string format message into a Java message object var hl7Message = ourPipeParser.Parse(File.ReadAllText(OruR01MessageWithBase64EncodedPdfReportIncluded, Encoding.UTF8)); //cast to message to an ORU R01 message in order to get access to the message data var oruR01Message = hl7Message as ORU_R01; if (oruR01Message != null) { // Display the updated HL7 message using Pipe delimited format LogToDebugConsole("Parsed HL7 Message:"); LogToDebugConsole(ourPipeParser.Encode(hl7Message)); var encapsulatedPdfDataInBase64Format = ExtractEncapsulatedPdfDataInBase64Format(oruR01Message); //if no encapsulated data was found, you can cease operation if (encapsulatedPdfDataInBase64Format == null) { return; } var extractedPdfByteData = GetBase64DecodedPdfByteData(encapsulatedPdfDataInBase64Format); WriteExtractedPdfByteDataToFile(extractedPdfByteData); } } catch (Exception e) { LogToDebugConsole($"Error occured during Order Response PDF extraction operation -> {e.StackTrace}"); } }
public void TestORMDescriptionExtract() { var parser = new PipeParser(); var results = (ORM_O01)parser.Parse(MessageORMSample); Assert.AreEqual(results.PATIENT.PID.DateTimeOfBirth.Description, @"Date/Time Of Birth"); }
public void Obx5DataTypeIsSetFromObx2_WhenObx2IsAnInvalidTypeAndInvalidOptionIsSet_ConfiguredInvalidTypeIsUsed() { var expectedObservationValueType = typeof(Model.V23.Datatype.ST); var message = "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3|||AL|||ASCII\r" + "PID|1||1711114||Appt^Test||19720501||||||||||||001020006\r" + "ORC|||||F\r" + "OBR|1|||ehipack^eHippa Acknowlegment|||200610120839|||||||||00002^eProvider^Electronic|||||||||F\r" + "OBX|1|BAD|||STValue||||||F\r"; var parser = new PipeParser(); var options = new ParserOptions { InvalidObx2Type = "ST" }; var parsed = (Model.V23.Message.ORU_R01)parser.Parse(message, options); var actualObservationValueType = parsed.GetRESPONSE(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX .GetObservationValue(0).Data; Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); Assert.AreEqual("STValue", ((IPrimitive)actualObservationValueType).Value); }
private static void DemonstrateConfigurableContextPidSegmentIsMissing() { try { //ADT A01 message with missing PID segment const string adtMessageWithPidSegmentMissing = "MSH|^~\\&|SENDING_APPLICATION|SENDING_FACILITY|RECEIVING_APPLICATION|RECEIVING_FACILITY|" + "20110613083617||ADT^A01|2323232223232|P|2.3||||\r" + "EVN|A01|20110613083617||Some Reason|\r" + "PV1|1|O|||||^^^^^^^^|^^^^^^^^";; LogToDebugConsole("Demonstration of NHAPI Tools Configurable Context..."); LogToDebugConsole("Validation rule specified in app.config called 'MandatorySegmentADT_A01_PID' should fail here..."); var parser = new PipeParser(); //this should load the var context = new ConfigurableContext(parser.ValidationContext); parser.ValidationContext = context; //parse the message containing PID message segment //this should trigger a validation exception parser.Parse(adtMessageWithPidSegmentMissing); } catch (System.Exception ex) { LogToDebugConsole("Validation exception thrown..."); if (ex.InnerException != null) { LogToDebugConsole("Configurable Context-based Validation: Message failed during parsing:" + ex.InnerException.Message); } } }
public void WhenMessageParsedAndEscaped_ThenEncodedAndUnescaped_MessageIsIdentical_Concurrent() { // Arrange var expected = "MSH|^~\\&|ULTRA|TML|OLIS|OLIS|200911231509||ORU^R01|5951|T|2.3\r" + "PID|||7005728^^^TML^MR||LEIGHTON^RACHEL^DIAMOND||19310313|F|||200 ANYWHERE ST^^TORONTO^ON^M6H 2T9||(416)888-8888||||||1014071185^KR\r" + "PV1|1||OLIS||||OLIST^BLAKE^DONALD^THOR^^^^^921379^^^^OLIST|||||||||^N\r" + "ORC|RE||T09-106575-CHO-0^^OLIS_Site_ID^ISO|||||||||OLIST^BLAKE^DONALD^THOR^^^^L^921379\r" + "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" + "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" + "OBX|1|NM|Z049107^Cholesterol-serum^L||2.30|mmol/L|||||F|||200911231508|STP\r" + "OBX|2|FT|Z101068^Tech Comment^L||Lab STP||||||F|||200911231508|STP\r"; var parser = new PipeParser { ValidationContext = new DefaultValidation() }; ORU_R01 oruR01; string actual; Parallel.For(0, 10, _ => { // Arrange // Act oruR01 = (ORU_R01)parser.Parse(expected); actual = parser.Encode(oruR01); // Assert Assert.AreEqual(expected, actual); }); }
public void TestUch25Parse_Simple() { PipeParser parser = new PipeParser(); ADT_A01 msg = (ADT_A01)parser.Parse(GetSimpleMessage(), Constants.VERSION_25_UCH); Assert.IsNotNull(msg); }
public void TestStrictValidation_NegativeNumber(string message) { var parser = new PipeParser(); ORU_R01 oru; // default validation context should pass with no exceptions oru = (ORU_R01)parser.Parse(message); foreach (var obs in oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION().OBX.GetObservationValue()) { Assert.True(obs.Data is SI); } // strict validation context should throw a DataTypeException for negative number values in a SI field. parser.ValidationContext = new StrictValidation(); Assert.Throws<DataTypeException>(() => { oru = (ORU_R01)parser.Parse(message); }); }
public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() { var expectedObservationValueType = typeof(ST); var message = "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.7|||AL|||ASCII\r" + "PID|1||1711114||Appt^Test||19720501||||||||||||001020006\r" + "ORC|||||F\r" + "OBR|1|||ehipack^eHippa Acknowlegment|||200610120839|||||||||00002^eProvider^Electronic|||||||||F\r" + "OBX|1||||STValue||||||F\r"; var parser = new PipeParser(); var options = new ParserOptions { DefaultObx2Type = "ST" }; var parsed = (ORU_R01)parser.Parse(message, options); var actualObservationValueType = parsed.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data; var obx2 = parsed.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType; Assert.AreEqual("ST", obx2.Value); Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); Assert.AreEqual("STValue", ((ST)actualObservationValueType).Value); }
private void BgwParse_DoWork(object sender, DoWorkEventArgs e) { try { string data = File.ReadAllText(_hl7DataFile); string[] stringSeparators = new string[] { "\r\n" }; this._hl7DataList = data.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries); } catch (Exception ex) { LogError(string.Format("Failed to parse the data file. ERROR: {0}", ex.Message)); _isSuccess = false; } for (int x = 0; x <= this._hl7DataList.Length - 1; x++) { try { PipeParser parser = new PipeParser(); HL7Message msg = parser.Parse(_hl7DataList[x]); lstFileData.Items.Add(msg); } catch (ParserException ex) { LogError(string.Format("Failed to parse. ERROR: {0}", ex.Message)); _isSuccess = false; } } }
public void ParseORFR04ToXmlNoNTE() { var message = "MSH|^~\\&|Query Result Locator|Query Facility Name|Query Application Name|ST ELSEWHERE HOSPITAL|20051024074506||ORF^R04|432|P|2.3.1|\r" + "MSA|AA|123456789|\r" + "QRD|20060228160421|R|I||||10^RD&Records&0126|38923^^^^^^^^&TCH|||\r" + "QRF||20050101000000||\r" + "PID|||38923^^^ST ELSEWHERE HOSPITAL Medical Record Numbers& MEDIC AL RECORD NUMBER&ST ELSEWHERE HOSPITAL^MR^ST ELSEWHERE HOSPITAL||Bombadill^Tom||19450605|M|||1&Main Street^^Littleton^CO^80122||^^^^^303^4376329^22|\r" + "OBR|1|0015566|DH2211223|83036^HEMOGLOBIN A1C^^83036^HEMOGLOBIN A1C|||20040526094000|||||||20040526094000||J12345^JENS^JENNY^^^DR^MD^^^^^^^112233&TCH||||| TP QUEST DIAGNOSTICS-TAMPA 4225 E. FOWLER AVE TAMPA FL 33617|20030622070400|||F|\r" + "OBX|1|NM|50026400^HEMOGLOBIN A1C^^50026400^HEMOGLOBIN A1C||12|^% TOTAL HGB|4.0 - 6.0|H|||F|||20040510094000|TP^^L|"; var parser = new PipeParser(); var m = parser.Parse(message); var orfR04 = m as ORF_R04; Assert.IsNotNull(orfR04); XMLParser xmlParser = new DefaultXMLParser(); var recoveredMessage = xmlParser.Encode(orfR04); Assert.IsNotNull(recoveredMessage); Assert.IsFalse(recoveredMessage.IndexOf("NTE") > -1, "Returned Message added ORC segment."); }
public void ParseORDERGroupRepetitionsIn_OML_O33() { const string twoTestOrderMessage = "MSH|^~\\&|||||20210921154451+1000||OML^O33^OML_O33|20210921154451|P|2.5.1|||NE|AL||UNICODE UTF-8|||LAB-28^IHE\r" + "SPM|1|||SER^Serum^HL70487|||||||P^Patient^HL70369\r" + "SAC|||Found_TT1_TT2_SER_098\r" + "ORC|NW||||||||20210921154451\r" + "OBR|1|AWOS_ID_Found_TT1_TT2_SER_098_0||TT1^Test Type 1^99000\r" + "ORC|NW||||||||20210921154451\r" + "OBR|2|AWOS_ID_Found_TT1_TT2_SER_098_1||TT2^Test Type 2^99000"; var parser = new PipeParser(); var oml = parser.Parse(twoTestOrderMessage, new ParserOptions { NonGreedyMode = true }) as OML_O33; Assert.NotNull(oml); var specimen = oml.SPECIMENs.ElementAt(0); Assert.AreEqual(2, specimen.ORDERRepetitionsUsed); var firstOrder = specimen.ORDERs.ElementAt(0); var firstObr = firstOrder.OBSERVATION_REQUEST.OBR.UniversalServiceIdentifier; Assert.AreEqual("TT1", firstObr.Identifier.Value); var secondOrder = specimen.ORDERs.ElementAt(1); var secondObr = secondOrder.OBSERVATION_REQUEST.OBR.UniversalServiceIdentifier; Assert.AreEqual("TT2", secondObr.Identifier.Value); }
public void CreateBlankMessage() { ADT_A01 a01 = new ADT_A01(); DateTime birthDate = new DateTime(1980, 4, 1); a01.MSH.SendingApplication.UniversalID.Value = "ThisOne"; a01.MSH.ReceivingApplication.UniversalID.Value = "COHIE"; a01.PID.PatientIDExternalID.ID.Value = "123456"; a01.PV1.GetAttendingDoctor(0).FamilyName.Value = "Jones"; a01.PV1.GetAttendingDoctor(0).GivenName.Value = "Mike"; a01.PID.DateOfBirth.TimeOfAnEvent.SetShortDate(birthDate); PipeParser parser = new PipeParser(); string pipeMessage = parser.Encode(a01); Assert.IsNotNull(pipeMessage); IMessage test = parser.Parse(pipeMessage); ADT_A01 a01Test = test as ADT_A01; Assert.IsNotNull(a01Test); Assert.AreEqual(a01Test.MSH.ReceivingApplication.UniversalID.Value, "COHIE"); Assert.AreEqual(a01Test.PID.PatientIDExternalID.ID.Value, "123456"); Assert.AreEqual(a01Test.PID.DateOfBirth.TimeOfAnEvent.GetAsDate().ToShortDateString(), birthDate.ToShortDateString()); Assert.AreEqual(a01Test.PV1.GetAttendingDoctor(0).FamilyName.Value, "Jones"); Assert.AreEqual(a01Test.MSH.MessageType.MessageType.Value, "ADT"); Assert.AreEqual(a01Test.MSH.MessageType.TriggerEvent.Value, "A01"); }
public void TestSpecialCharacterEntryWithAllSpecialCharacters() { PipeParser parser = new PipeParser(); ORU_R01 oru = new ORU_R01(); oru.MSH.MessageType.MessageType.Value = "ORU"; oru.MSH.MessageType.TriggerEvent.Value = "R01"; oru.MSH.EncodingCharacters.Value = @"^~\&"; oru.MSH.VersionID.VersionID.Value = "2.3.1"; oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType.Value = "FT"; oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBR.SetIDOBR.Value = "1"; NHapi.Base.Model.Varies v = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0); ST text = new ST(oru); text.Value = @"Th&is\.br\is\.br\A T|e\H\st\"; v.Data = text; string encodedData = parser.Encode(oru); Console.WriteLine(encodedData); NHapi.Base.Model.IMessage msg = parser.Parse(encodedData); oru = (ORU_R01)msg; FT data = (FT)oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data; Assert.AreEqual(@"Th&is\.br\is\.br\A T|e\H\st\", data.Value); }
public void Test_281DataTypesParseCorrectly(string message) { var parser = new PipeParser(); var oru = new ORU_R01(); oru = (ORU_R01)parser.Parse(message); int expectedObservationCount = 3; int parsedObservations = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBSERVATIONRepetitionsUsed; bool parsedCorrectNumberOfObservations = parsedObservations == expectedObservationCount; Assert.IsTrue(parsedCorrectNumberOfObservations, string.Format("Expected {1} OBX repetitions used for this segment, found {0}", parsedObservations, expectedObservationCount)); int index = 0; var obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault(); Assert.IsTrue(obs.Data is DT); index++; obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault(); Assert.IsTrue(obs.Data is ST); index++; obs = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(index).OBX.GetObservationValue().FirstOrDefault(); Assert.IsTrue(obs.Data is TM); }
public void Obx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultOptionIsSet_DefaultTypeIsUsed() { var message = "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3|||AL|||ASCII\r" + "PID|1||1711114||Appt^Test||19720501||||||||||||001020006\r" + "ORC|||||F\r" + "OBR|1|||ehipack^eHippa Acknowlegment|||200610120839|||||||||00002^eProvider^Electronic|||||||||F\r" + "OBX|1||||STValue||||||F\r"; var expectedEncodedMessage = "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3|||AL|||ASCII\r" + "PID|1||1711114||Appt^Test||19720501||||||||||||001020006\r" + "ORC|||||F\r" + "OBR|1|||ehipack^eHippa Acknowlegment|||200610120839|||||||||00002^eProvider^Electronic|||||||||F\r" + "OBX|1|ST|||STValue||||||F\r"; var parser = new PipeParser(); var options = new ParserOptions { DefaultObx2Type = "ST" }; var parsed = parser.Parse(message, options); var encodedMessage = parser.Encode(parsed); Assert.AreEqual(expectedEncodedMessage, encodedMessage); }
public void ParseORMwithCompleteOBXToXML() { string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200606191615||ORM^O01|ORDR|P|2.3.1|LAB PID|0001||3020956||TRAINONLYPOE^ONE||19770903|F||W||||||||40230443 PV1|0001|I|MICU^W276^01||||045716^ABAZA, MONA M|||MED|||||||045716|F|000000030188 ORC|NW|01444^00001|||||||||||L OBR||01444^00001||CAI^CALCIUM IONIZED|||200606191614||||L|||||045716^STEELE, ANDREW W|||||||||||00001&UNITS^ONCE&ONCE^000^200606191614^200606191614^ROUTINE OBX|1|TX|SDES||Blood, peripheral||||||Z OBX|2|TX|SREQ||LEFT ANTECUBITAL||||||Z OBX|3|TX|CULT||Beta hemolytic Streptococcus Group A||||||Z OBX|4|TX|CULT||Critical result(s) called to and verification "; Message += "\"read-back\""; Message += @" received from: Nu~||||||Z "; PipeParser Parser = new PipeParser(); IMessage m = Parser.Parse(Message); ORM_O01 msgObj = m as ORM_O01; Assert.IsNotNull(msgObj); XMLParser xmlParser = new DefaultXMLParser(); string recoveredMessage = xmlParser.Encode(msgObj); Assert.IsNotNull(recoveredMessage); Assert.IsFalse(string.Empty.Equals(recoveredMessage)); }
public void TestUnexpectedSegmentHintsDropToRoot() { var message = "MSH|^~\\&|DATASERVICES|CORPORATE|||20120711120510.2-0500||ADT^A01^ADT_A01|9c906177-dfca-4bbe-9abd-d8eb43df93a0|D|2.6\r" + "ZZA|1\r" + "EVN||20120701000000-0500\r" + "PID|1||397979797^^^SN^SN~4242^^^BKDMDM^PI~1000^^^YARDI^PI||Williams^Rory^H^^^^A||19641028000000-0600|M||||||||||31592^^^YARDI^AN\r" + "NK1|1|Pond^Amelia^Q^^^^A|SPO|1234 Main St^^Sussex^WI^53089|^PRS^CP^^^^^^^^^555-1212||N\r" + "NK1|2|Smith^John^^^^^A~^The Doctor^^^^^A|FND|1234 S Water St^^New London^WI^54961||^WPN^PH^^^^^^^^^555-9999|C\r" + "PV1|2|I||R\r" + "GT1|1||Doe^John^A^^^^A||5678 Maple Ave^^Sussex^WI^53089|^PRS^PH^^^^^^^^^555-9999|||||OTH\r" + "IN1|1|CAP1000|YYDN|ACME HealthCare||||GR0000001|||||||HMO|||||||||||||||||||||PCY-0000042\r" + "IN1|2||||||||||||||Medicare|||||||||||||||||||||123-45-6789-A\r" + "IN1|3||||||||||||||Medicaid|||||||||||||||||||||987654321L\r" + "ZFA|6|31592|12345|YARDI|20120201000000-0600"; var parser = new PipeParser(); var options = new ParserOptions { UnexpectedSegmentBehaviour = UnexpectedSegmentBehaviour.DropToRoot }; var msg = (NHapi.Model.V26.Message.ADT_A01)parser.Parse(message, options); var zzas = msg.GetAll("ZZA"); var zfas = msg.GetAll("ZFA"); Assert.AreEqual(1, zfas.Length); Assert.AreEqual(1, zzas.Length); }
public void ParseORRo02ToXml() { string Message = @"MSH|^~\&|INVISION|DHC|SUNQUEST LAB||200607100719||ORR^O02|ORDR|T|2.3.1|LAB PID|0001||3017864||HILBERT^MARY||19440823|F||W||||||||40244246 PV1|0001|O|LW||||888883^DOCTOR, UNASSIGNED||||||||||888883|O|000000031540 ORC|NA|00003^00001|F1492|||||||||888883 OBR||00003^00001|F1492|RESPC^CULTURE RESPIRATORY ROUTINE|||||||L|||||||||F1492|||||||^ONCE&ONCE^^200607070600^200607070600^ROUTINE "; PipeParser Parser = new PipeParser(); IMessage m = Parser.Parse(Message); ORR_O02 msg = m as ORR_O02; XMLParser xmlParser = new DefaultXMLParser(); string recoveredMessage = xmlParser.Encode(msg); Assert.AreNotEqual(string.Empty, recoveredMessage); XmlDocument orrDoc = new XmlDocument(); orrDoc.LoadXml(recoveredMessage); Assert.IsNotNull(orrDoc); }
private static void TestParserConfigurableContext() { if (messages.Count > 0) { Console.WriteLine("\n==============================================\nTesting parsing with configurable context."); PipeParser parser = new PipeParser(); ConfigurableContext context = new ConfigurableContext(parser.ValidationContext); parser.ValidationContext = context; Console.WriteLine("Encodingrules added:\t {0}", context.EncodingRuleCount); Console.WriteLine("Messagerules added:\t {0}", context.MessageRuleCount); Console.WriteLine("PrimitiveTyperules added: {0}", context.PrimitiveRuleCount); Console.WriteLine(); int count = 0; foreach (string m in messages) { IMessage im = parser.Parse(m); parsedMessages.Add(im); string structure = im.GetStructureName(); Console.WriteLine("Parsed {0}, V{1}.", structure, im.Version); count++; } Console.WriteLine("\nDone! (Parsed {0})", count); } }
public void TestOBXDataTypes() { string message = @"MSH|^~\&|EPIC|AIDI|||20070921152053|ITFCOHIEIN|ORF^R04^ORF_R04|297|P|2.4||| MSA|CA|1 QRD|20060725141358|R|||||10^RD|1130851^^^^MRN|RES||| QRF||||||||| OBR|1|5149916^EPC|20050118113415533318^|E8600^ECG^^^ECG|||200501181134||||||Age: 17 yrs ~Criteria: C-HP708 ~|||||1||Zztesttwocorhoi|Results||||F||^^^^^Routine|||||||||200501181134||||||||| OBX|1|ST|:8601-7^ECG IMPRESSION|2|Normal sinus rhythm, rate 77 Normal P axis, PR, rate & rhythm ||||||F||1|200501181134|| OBX|2|ST|:8625-6^PR INTERVAL|3|141||||||F||1|200501181134|| OBX|3|ST|:8633-0^QRS DURATION|4|83||||||F||1|200501181134|| OBX|4|ST|:8634-8^QT INTERVAL|5|358||||||F||1|200501181134|| OBX|5|ST|:8636-3^QT INTERVAL CORRECTED|6|405||||||F||1|200501181134|| OBX|6|ST|:8626-4^FRONTAL AXIS P|7|-1||||||F||1|200501181134|| OBX|7|ST|:99003^FRONTAL AXIS INITIAL 40 MS|8|41||||||F||1|200501181134|| OBX|8|ST|:8632-2^FRONTAL AXIS MEAN QRS|9|66||||||F||1|200501181134|| OBX|9|ST|:99004^FRONTAL AXIS TERMINAL 40 MS|10|80||||||F||1|200501181134|| OBX|10|ST|:99005^FRONTAL AXIS ST|11|36||||||F||1|200501181134|| OBX|11|ST|:8638-9^FRONTAL AXIS T|12|40||||||F||1|200501181134|| OBX|12|ST|:99006^ECG SEVERITY T|13|- NORMAL ECG - ||||||F||1|200501181134|| OBX|13|DT|5315037^Start Date^Start Collection Dat^ABC||18APR06||||||F|||20060419125100|PPKMG|PPJW^SMITH, Fred QAK||OK||1|1|0 "; PipeParser parser = new PipeParser(); IMessage m = parser.Parse(message); ORF_R04 orfR04 = m as ORF_R04; Assert.IsNotNull(orfR04); XMLParser xmlParser = new DefaultXMLParser(); string recoveredMessage = xmlParser.Encode(orfR04); }
public void UnEscapesData() { // Arrange const string content = "MSH|^~\\&|TestSys|432^testsys practice|TEST||201402171537||MDM^T02|121906|P|2.3.1||||||||\r" + "OBX|1|TX|PROBLEM FOCUSED^PROBLEM FOCUSED^test|1|\\T\\#39;Thirty days have September,\\X0D\\April\\X0A\\June,\\X0A\\and November.\\X0A\\When short February is done,\\E\\X0A\\E\\all the rest have\\T\\nbsp;31.\\T\\#39"; var parser = new PipeParser(); var msg = parser.Parse(content); // Act var segment = msg.GetStructure("OBX") as ISegment; var idx = Terser.GetIndices("OBX-5"); var segmentData = Terser.Get(segment, idx[0], idx[1], idx[2], idx[3]); // Assert // verify that data was properly un-escaped by NHapi // \E\X0A\E\ should be escaped to \X0A\ // \X0A\ should be un-escaped to \n - this is configurable // \X0D\ should be un-escaped to \r - this is configurable // \t\ should be un-escaped to & const string expectedResult = "'Thirty days have September,\rApril\nJune,\nand November.\nWhen short February is done,\\X0A\\all the rest have 31.'"; Assert.AreEqual(expectedResult, segmentData); }
public void ParseORFR04ToXML() { string message = @"MSH|^~\&|Query Result Locator|Query Facility Name|Query Application Name|ST ELSEWHERE HOSPITAL|20051024074506||ORF^R04|432|P|2.4| MSA|AA|123456789| QRD|20060228160421|R|I||||10^RD&Records&0126|38923^^^^^^^^&TCH||| QRF||20050101000000|| PID|||38923^^^ST ELSEWHERE HOSPITAL Medical Record Numbers& MEDIC AL RECORD NUMBER&ST ELSEWHERE HOSPITAL^MR^ST ELSEWHERE HOSPITAL||Bombadill^Tom||19450605|M|||1&Main Street^^Littleton^CO^80122||^^^^^303^4376329^22| OBR|1|0015566|DH2211223|83036^HEMOGLOBIN A1C^^83036^HEMOGLOBIN A1C|||20040526094000|||||||20040526094000||J12345^JENS^JENNY^^^DR^MD^^^^^^^112233&TCH||||| TP QUEST DIAGNOSTICS-TAMPA 4225 E. FOWLER AVE TAMPA FL 33617|20030622070400|||F| OBX|1|NM|50026400^HEMOGLOBIN A1C^^50026400^HEMOGLOBIN A1C||12|^% TOTAL HGB|4.0 - 6.0|H|||F|||20040510094000|TP^^L|"; PipeParser Parser = new PipeParser(); IMessage m = Parser.Parse(message); ORF_R04 orfR04 = m as ORF_R04; Assert.IsNotNull(orfR04); XMLParser xmlParser = new DefaultXMLParser(); string recoveredMessage = xmlParser.Encode(orfR04); Assert.IsNotNull(recoveredMessage); Assert.IsFalse(string.Empty.Equals(recoveredMessage)); }
public void TestSpecialCharacterEntryEndingSlash() { var parser = new PipeParser(); var oru = new ORU_R01(); oru.MSH.MessageType.MessageType.Value = "ORU"; oru.MSH.MessageType.TriggerEvent.Value = "R01"; oru.MSH.EncodingCharacters.Value = @"^~\&"; oru.MSH.VersionID.VersionID.Value = "2.3.1"; oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType.Value = "FT"; oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).OBR.SetIDOBR.Value = "1"; var v = oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0); var text = new ST(oru); text.Value = @"This\.br\is\.br\A Test~"; v.Data = text; var encodedData = parser.Encode(oru); var msg = parser.Parse(encodedData); oru = (ORU_R01)msg; var data = (FT)oru.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data; Assert.AreEqual(@"This\.br\is\.br\A Test~", data.Value); }