diff --git a/src/NHapi.Base/Model/AbstractSegment.cs b/src/NHapi.Base/Model/AbstractSegment.cs index 9694866fc..c06764d68 100644 --- a/src/NHapi.Base/Model/AbstractSegment.cs +++ b/src/NHapi.Base/Model/AbstractSegment.cs @@ -270,6 +270,8 @@ public virtual int GetMaxCardinality(int number) /// /// Repeatable field number. /// 0-based index to be removed. + /// If field has no repetitions. + /// If field index does not exist. public void RemoveRepetition(int fieldNum, int index) { if (fieldNum < 1 || fieldNum > items.Count) @@ -303,6 +305,9 @@ public void RemoveRepetition(int fieldNum, int index) /// /// Repeatable field number. /// Item to be removed. + /// If field number is not valid. + /// If field has no repetitions. + /// If field does not contain the repetition to remove. public void RemoveRepetition(int fieldNum, IType removeItem) { if (fieldNum < 1 || fieldNum > items.Count) diff --git a/src/NHapi.Base/Model/Varies.cs b/src/NHapi.Base/Model/Varies.cs index 3ca8dd6d0..745919ca1 100644 --- a/src/NHapi.Base/Model/Varies.cs +++ b/src/NHapi.Base/Model/Varies.cs @@ -64,8 +64,8 @@ static Varies() Log = HapiLogFactory.GetHapiLog(typeof(Varies)); } - /// Creates new Varies. - /// + /// + /// Creates new Varies. /// /// message to which this type belongs. /// @@ -75,8 +75,8 @@ public Varies(IMessage message) Message = message; } - /// Creates new Varies. - /// + /// + /// Creates new Varies. /// /// message to which this type belongs. /// description of what this Type represents. @@ -139,15 +139,26 @@ public virtual IType Data "StyleCop.CSharp.NamingRules", "SA1300:Element should begin with upper-case letter", Justification = "As this is a public member, we will duplicate the method and mark this one as obsolete.")] - public static void fixOBX5(ISegment segment, IModelClassFactory factory) + public static void fixOBX5(ISegment segment, IModelClassFactory factory, ParserOptions parserOptions) { - FixOBX5(segment, factory); + FixOBX5(segment, factory, parserOptions); } - /// Sets the data type of field 5 in the given OBX segment to the value of OBX-2. The argument + /// + /// Sets the data type of field 5 in the given OBX segment to the value of OBX-2. The argument /// is a Segment as opposed to a particular OBX because it is meant to work with any version. + /// + /// Note that if no value is present in OBX-2, or an invalid value is present in + /// OBX-2, this method will throw an error.This behaviour can be corrected by using the + /// and . + /// /// - public static void FixOBX5(ISegment segment, IModelClassFactory factory) + /// instance. + /// to be used. + /// to be used. + /// If no value is present in OBX-2. + /// If an invalid value is present in OBX-2. + public static void FixOBX5(ISegment segment, IModelClassFactory factory, ParserOptions parserOptions) { try { @@ -157,6 +168,7 @@ public static void FixOBX5(ISegment segment, IModelClassFactory factory) foreach (var repetition in segment.GetField(5)) { var v = (Varies)repetition; + SetObx2Fallback(obx2, segment, parserOptions); if (obx2.Value == null) { @@ -174,7 +186,7 @@ public static void FixOBX5(ISegment segment, IModelClassFactory factory) { UseDTInsteadOfDTMForEarlierVersionsOfHL7(segment, obx2); - var type = factory.GetTypeClass(obx2.Value, segment.Message.Version); + var type = GetObx5Type(obx2, segment, factory, parserOptions); if (type == null) { @@ -214,6 +226,33 @@ public static void FixOBX5(ISegment segment, IModelClassFactory factory) } } + private static Type GetObx5Type(IPrimitive obx2, ISegment segment, IModelClassFactory factory, ParserOptions parserOptions) + { + var type = factory.GetTypeClass(obx2.Value, segment.Message.Version); + + if (type == null) + { + if (parserOptions.InvalidObx2Type != null) + { + type = factory.GetTypeClass(parserOptions.InvalidObx2Type, segment.Message.Version); + } + } + + return type; + } + + private static void SetObx2Fallback(IPrimitive obx2, ISegment segment, ParserOptions parserOptions) + { + if (obx2.Value == null) + { + if (!(parserOptions.DefaultObx2Type is null)) + { + Log.Debug($"setting default {segment.GetStructureName()}-{2} type to {parserOptions.DefaultObx2Type}"); + obx2.Value = parserOptions.DefaultObx2Type; + } + } + } + private static void UseDTInsteadOfDTMForEarlierVersionsOfHL7(ISegment segment, IPrimitive obx2) { var versionsWithoutDTM = new string[] { "2.1", "2.2", "2.3", "2.3.1", "2.4", "2.5" }; diff --git a/src/NHapi.Base/Parser/DefaultXMLParser.cs b/src/NHapi.Base/Parser/DefaultXMLParser.cs index ce1600fbe..7441fe731 100644 --- a/src/NHapi.Base/Parser/DefaultXMLParser.cs +++ b/src/NHapi.Base/Parser/DefaultXMLParser.cs @@ -142,23 +142,33 @@ public override XmlDocument EncodeDocument(IMessage source) /// EncodingNotSupportedException if the message encoded. /// is not supported by this parser. /// - public override IMessage ParseDocument(XmlDocument xmlMessage, string version) + public override IMessage ParseDocument(XmlDocument xmlMessage, string version, ParserOptions parserOptions) { + if (parserOptions is null) + { + throw new ArgumentNullException(nameof(parserOptions)); + } + var messageName = xmlMessage.DocumentElement.Name; var message = InstantiateMessage(messageName, version, true); - Parse(message, xmlMessage.DocumentElement); + Parse(message, xmlMessage.DocumentElement, parserOptions); return message; } /// public override void Parse(IMessage message, string @string, ParserOptions parserOptions) { + if (parserOptions is null) + { + throw new ArgumentNullException(nameof(parserOptions)); + } + try { var xmlDocument = new XmlDocument(); xmlDocument.Load(new StringReader(@string)); - Parse(message, xmlDocument.DocumentElement); + Parse(message, xmlDocument.DocumentElement, parserOptions); } catch (XmlException e) { @@ -201,7 +211,7 @@ protected internal static string MakeGroupElementName(string messageName, string /// Populates the given group object with data from the given group element, ignoring /// any unrecognized nodes. /// - private void Parse(IGroup groupObject, XmlElement groupElement) + private void Parse(IGroup groupObject, XmlElement groupElement, ParserOptions parserOptions) { var childNames = groupObject.Names; var messageName = groupObject.Message.GetStructureName(); @@ -222,14 +232,14 @@ private void Parse(IGroup groupObject, XmlElement groupElement) for (var i = 0; i < childNames.Length; i++) { SupportClass.ICollectionSupport.Remove(unparsedElementList, childNames[i]); - ParseReps(groupElement, groupObject, messageName, childNames[i], childNames[i]); + ParseReps(groupElement, groupObject, messageName, childNames[i], childNames[i], parserOptions); } for (var i = 0; i < unparsedElementList.Count; i++) { var segName = (string)unparsedElementList[i]; var segIndexName = groupObject.AddNonstandardSegment(segName); - ParseReps(groupElement, groupObject, messageName, segName, segIndexName); + ParseReps(groupElement, groupObject, messageName, segName, segIndexName, parserOptions); } } @@ -284,7 +294,8 @@ private void ParseReps( IGroup groupObject, string messageName, string childName, - string childIndexName) + string childIndexName, + ParserOptions parserOptions) { var reps = GetChildElementsByTagName(groupElement, MakeGroupElementName(messageName, childName)); Log.Debug("# of elements matching " + MakeGroupElementName(messageName, childName) + ": " + reps.Count); @@ -293,14 +304,14 @@ private void ParseReps( { for (var i = 0; i < reps.Count; i++) { - ParseRep((XmlElement)reps[i], groupObject.GetStructure(childIndexName, i)); + ParseRep((XmlElement)reps[i], groupObject.GetStructure(childIndexName, i), parserOptions); } } else { if (reps.Count > 0) { - ParseRep((XmlElement)reps[0], groupObject.GetStructure(childIndexName, 0)); + ParseRep((XmlElement)reps[0], groupObject.GetStructure(childIndexName, 0), parserOptions); } if (reps.Count > 1) @@ -308,21 +319,21 @@ private void ParseReps( var newIndexName = groupObject.AddNonstandardSegment(childName); for (var i = 1; i < reps.Count; i++) { - ParseRep((XmlElement)reps[i], groupObject.GetStructure(newIndexName, i - 1)); + ParseRep((XmlElement)reps[i], groupObject.GetStructure(newIndexName, i - 1), parserOptions); } } } } - private void ParseRep(XmlElement theElem, IStructure theObj) + private void ParseRep(XmlElement theElem, IStructure theObj, ParserOptions parserOptions) { if (theObj is IGroup) { - Parse((IGroup)theObj, theElem); + Parse((IGroup)theObj, theElem, parserOptions); } else if (theObj is ISegment) { - Parse((ISegment)theObj, theElem); + Parse((ISegment)theObj, theElem, parserOptions); } Log.Debug("Parsed element: " + theElem.Name); diff --git a/src/NHapi.Base/Parser/LegacyPipeParser.cs b/src/NHapi.Base/Parser/LegacyPipeParser.cs index 966f69485..f911b8b77 100644 --- a/src/NHapi.Base/Parser/LegacyPipeParser.cs +++ b/src/NHapi.Base/Parser/LegacyPipeParser.cs @@ -259,6 +259,11 @@ public static string StripLeadingWhitespace(string in_Renamed) public override void Parse(IMessage message, string @string, ParserOptions parserOptions) { + if (parserOptions is null) + { + throw new ArgumentNullException(nameof(parserOptions)); + } + var messageIter = new Util.MessageIterator(message, "MSH", true); FilterIterator.IPredicate segmentsOnly = new AnonymousClassPredicate(this); var segmentIter = new FilterIterator(messageIter, segmentsOnly); @@ -299,7 +304,7 @@ public override void Parse(IMessage message, string @string, ParserOptions parse if (dirIter.MoveNext()) { - Parse((ISegment)dirIter.Current, segments[i], encodingChars); + Parse((ISegment)dirIter.Current, segments[i], encodingChars, parserOptions); } } } @@ -384,15 +389,29 @@ public virtual string GetMessageStructure(string message) return GetStructure(message).Structure; } - /// Parses a segment string and populates the given Segment object. Unexpected fields are + /// + /// Parses a segment string and populates the given Segment object. Unexpected fields are /// added as Varies' at the end of the segment. - /// /// /// HL7Exception if the given string does not contain the. /// given segment or if the string is not encoded properly. /// public virtual void Parse(ISegment destination, string segment, EncodingCharacters encodingChars) { + Parse(destination, segment, encodingChars, DefaultParserOptions); + } + + /// + /// Parses a segment string and populates the given Segment object. Unexpected fields are + /// added as Varies' at the end of the segment. + /// + /// HL7Exception if the given string does not contain the. + /// given segment or if the string is not encoded properly. + /// + public virtual void Parse(ISegment destination, string segment, EncodingCharacters encodingChars, ParserOptions parserOptions) + { + parserOptions = parserOptions ?? DefaultParserOptions; + var fieldOffset = 0; if (IsDelimDefSegment(destination.GetStructureName())) { @@ -451,7 +470,7 @@ public virtual void Parse(ISegment destination, string segment, EncodingCharacte // set data type of OBX-5 if (destination.GetType().FullName.IndexOf("OBX") >= 0) { - Varies.FixOBX5(destination, Factory); + Varies.FixOBX5(destination, Factory, parserOptions); } } diff --git a/src/NHapi.Base/Parser/ParserBase.cs b/src/NHapi.Base/Parser/ParserBase.cs index ad501a055..99b672e5a 100644 --- a/src/NHapi.Base/Parser/ParserBase.cs +++ b/src/NHapi.Base/Parser/ParserBase.cs @@ -44,9 +44,9 @@ namespace NHapi.Base.Parser /// Bryan Tripp (bryan_tripp@sourceforge.net). public abstract class ParserBase { - private static readonly IHapiLog Log; - private static readonly ParserOptions DefaultParserOptions = new ParserOptions(); + protected static readonly ParserOptions DefaultParserOptions = new ParserOptions(); + private static readonly IHapiLog Log; private IValidationContext validationContext; private MessageValidator messageValidator; @@ -265,6 +265,11 @@ public virtual IMessage Parse(string message, string version) /// If is null. public virtual IMessage Parse(string message, string version, ParserOptions parserOptions) { + if (parserOptions is null) + { + throw new ArgumentNullException(nameof(parserOptions)); + } + var encoding = GetEncoding(message); if (!SupportsEncoding(encoding)) { diff --git a/src/NHapi.Base/Parser/ParserOptions.cs b/src/NHapi.Base/Parser/ParserOptions.cs index b6fb8f910..4d9d4a49a 100644 --- a/src/NHapi.Base/Parser/ParserOptions.cs +++ b/src/NHapi.Base/Parser/ParserOptions.cs @@ -4,9 +4,51 @@ public class ParserOptions { public ParserOptions() { + DefaultObx2Type = null; + InvalidObx2Type = null; NonGreedyMode = false; } + /// + /// If this property is set, the value provides a default datatype ("ST", + /// "NM", etc) for an OBX segment with a missing OBX-2 value. This is useful + /// when parsing messages from systems which do not correctly populate OBX-2. + /// + /// + /// + /// For example, if this property is set to "ST", and the following OBX + /// segment is encountered: + /// + /// OBX|||||This is a value + /// + /// It will be parsed as though it had read: + /// + /// OBX||ST|||This is a value + /// + /// + /// + public string DefaultObx2Type { get; set; } + + /// + /// If this property is set, the value provides a default datatype ("ST", + /// "NM", etc) for an OBX segment with an invalid OBX-2 value. This is useful + /// when parsing messages from systems which do not correctly populate OBX-2. + /// + /// + /// + /// For example, if this property is set to "ST", and the following OBX + /// segment is encountered: + /// + /// OBX||INVALID|||This is a value + /// + /// It will be parsed as though it had read: + /// + /// OBX||ST|||This is a value + /// + /// + /// + public string InvalidObx2Type { get; set; } + /// /// If set to true (default is false), pipe parser will be put in non-greedy mode. This setting /// applies only to and will have no effect on . diff --git a/src/NHapi.Base/Parser/PipeParser.cs b/src/NHapi.Base/Parser/PipeParser.cs index 378690e14..5423d9600 100644 --- a/src/NHapi.Base/Parser/PipeParser.cs +++ b/src/NHapi.Base/Parser/PipeParser.cs @@ -318,7 +318,26 @@ public virtual string GetMessageStructure(string message) /// public virtual void Parse(ISegment destination, string segment, EncodingCharacters encodingChars) { - Parse(destination, segment, encodingChars, 0); + Parse(destination, segment, encodingChars, DefaultParserOptions); + } + + /// + /// Parses a segment string and populates the given Segment object. + /// + /// Unexpected fields are added as Varies' at the end of the segment. + /// + /// + /// Segment to parse the segment string into. + /// Encoded segment. + /// Encoding characters to be used. + /// Contains configuration that will be applied when parsing. + /// + /// If the given string does not contain the given segment or if the string is not encoded properly. + /// + public virtual void Parse(ISegment destination, string segment, EncodingCharacters encodingChars, ParserOptions parserOptions) + { + parserOptions = parserOptions ?? DefaultParserOptions; + Parse(destination, segment, encodingChars, 0, parserOptions); } /// @@ -336,6 +355,27 @@ public virtual void Parse(ISegment destination, string segment, EncodingCharacte /// public virtual void Parse(ISegment destination, string segment, EncodingCharacters encodingChars, int repetition) { + Parse(destination, segment, encodingChars, repetition, DefaultParserOptions); + } + + /// + /// Parses a segment string and populates the given Segment object. + /// + /// Unexpected fields are added as Varies' at the end of the segment. + /// + /// + /// Segment to parse the segment string into. + /// Encoded segment. + /// Encoding characters to be used. + /// The repetition number of this segment within its group. + /// Contains configuration that will be applied when parsing. + /// + /// If the given string does not contain the given segment or if the string is not encoded properly. + /// + public virtual void Parse(ISegment destination, string segment, EncodingCharacters encodingChars, int repetition, ParserOptions parserOptions) + { + parserOptions = parserOptions ?? DefaultParserOptions; + var fieldOffset = 0; if (IsDelimDefSegment(destination.GetStructureName())) { @@ -398,7 +438,7 @@ public virtual void Parse(ISegment destination, string segment, EncodingCharacte // set data type of OBX-5 if (destination.GetType().FullName.IndexOf("OBX") >= 0) { - Varies.FixOBX5(destination, Factory); + Varies.FixOBX5(destination, Factory, parserOptions); } } @@ -480,7 +520,7 @@ public override void Parse(IMessage message, string @string, ParserOptions parse throw new HL7Exception($"Current segment does not implement ISegment and therefore cannot be parsed."); } - Parse(next, segments[i], GetEncodingChars(@string), repetition); + Parse(next, segments[i], GetEncodingChars(@string), repetition, parserOptions); } } } diff --git a/src/NHapi.Base/Parser/XMLParser.cs b/src/NHapi.Base/Parser/XMLParser.cs index 3fb26467a..86a75a62a 100644 --- a/src/NHapi.Base/Parser/XMLParser.cs +++ b/src/NHapi.Base/Parser/XMLParser.cs @@ -248,7 +248,27 @@ public override string GetEncoding(string message) /// EncodingNotSupportedException if the message encoded. /// is not supported by this parser. /// - public abstract IMessage ParseDocument(XmlDocument xmlMessage, string version); + public IMessage ParseDocument(XmlDocument xmlMessage, string version) + { + return ParseDocument(xmlMessage, version, DefaultParserOptions); + } + + ///

Creates and populates a Message object from an XML Document that contains an XML-encoded HL7 message.

+ ///

The easiest way to implement this method for a particular message structure is as follows: + ///

  1. Create an instance of the Message type you are going to handle with your subclass + /// of XMLParser
  2. + ///
  3. Go through the given Document and find the Elements that represent the top level of + /// each message segment.
  4. + ///
  5. For each of these segments, call parse(Segment segmentObject, Element segmentElement), + /// providing the appropriate Segment from your Message object, and the corresponding Element.
+ /// At the end of this process, your Message object should be populated with data from the XML + /// Document.

+ ///
+ /// HL7Exception if the message is not correctly formatted. + /// EncodingNotSupportedException if the message encoded. + /// is not supported by this parser. + /// + public abstract IMessage ParseDocument(XmlDocument xmlMessage, string version, ParserOptions parserOptions); ///

Creates an XML Document that corresponds to the given Message object.

///

If you are implementing this method, you should create an XML Document, and insert XML Elements @@ -265,6 +285,17 @@ public override string GetEncoding(string message) ///

public virtual void Parse(ISegment segmentObject, XmlElement segmentElement) { + Parse(segmentObject, segmentElement, DefaultParserOptions); + } + + /// Populates the given Segment object with data from the given XML Element. + /// HL7Exception if the XML Element does not have the correct name and structure. + /// for the given Segment, or if there is an error while setting individual field values. + /// + public virtual void Parse(ISegment segmentObject, XmlElement segmentElement, ParserOptions parserOptions) + { + parserOptions = parserOptions ?? DefaultParserOptions; + var done = new SupportClass.HashSetSupport(); // for (int i = 1; i <= segmentObject.NumFields(); i++) { @@ -298,7 +329,7 @@ public virtual void Parse(ISegment segmentObject, XmlElement segmentElement) // set data type of OBX-5 if (segmentObject.GetType().FullName.IndexOf("OBX") >= 0) { - Varies.FixOBX5(segmentObject, Factory); + Varies.FixOBX5(segmentObject, Factory, parserOptions); } } @@ -485,7 +516,7 @@ protected internal override IMessage DoParse(string message, string version, Par var doc = new XmlDocument(); doc.Load(new StringReader(message)); - m = ParseDocument(doc, version); + m = ParseDocument(doc, version, parserOptions); } catch (XmlException e) { @@ -811,7 +842,7 @@ private void ParsePrimitive(IPrimitive datatypeObject, XmlElement datatypeElemen private class AnonymousClassXMLParser : XMLParser { - public override IMessage ParseDocument(XmlDocument xmlMessage, string version) + public override IMessage ParseDocument(XmlDocument xmlMessage, string version, ParserOptions parserOptions) { return null; } diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV21Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV21Tests.cs index 42de9af65..ab1c5a58b 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV21Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV21Tests.cs @@ -54,6 +54,30 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueInstance); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.1|||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 LegacyPipeParser(); + var options = new ParserOptions { DefaultObx2Type = "ST" }; + + var parsed = (ORU_R01)parser.Parse(message, options); + + var actualObservationValueInstance = parsed.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.OBSERVATIONRESULTS.Data; + var obx2 = parsed.GetPATIENT_RESULT(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.VALUETYPE; + + Assert.AreEqual("ST", obx2.Value); + Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueInstance); + Assert.AreEqual("STValue", ((ST)actualObservationValueInstance).Value); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV231Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV231Tests.cs index 90fc78882..b66c3367b 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV231Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV231Tests.cs @@ -617,6 +617,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3.1|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV23Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV23Tests.cs index 5bb0946e3..5e1d27b05 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV23Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV23Tests.cs @@ -497,6 +497,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(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||||STValue||||||F\r"; + + var parser = new LegacyPipeParser(); + var options = new ParserOptions { DefaultObx2Type = "ST" }; + + var parsed = (ORU_R01)parser.Parse(message, options); + + var actualObservationValueType = parsed.GetRESPONSE(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data; + var obx2 = parsed.GetRESPONSE(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType; + + Assert.AreEqual("ST", obx2.Value); + Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); + Assert.AreEqual("STValue", ((ST)actualObservationValueType).Value); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV24Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV24Tests.cs index 2f3045ad0..cfe9e8bed 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV24Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV24Tests.cs @@ -447,6 +447,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.4|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV251Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV251Tests.cs index 7c9202ddb..693135b36 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV251Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV251Tests.cs @@ -145,6 +145,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.5.1|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV25Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV25Tests.cs index f64417953..28dfb4f19 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV25Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV25Tests.cs @@ -91,6 +91,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.5|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV26Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV26Tests.cs index ca688687a..1878bf6db 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV26Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV26Tests.cs @@ -351,6 +351,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.6|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV271Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV271Tests.cs index bd3fafb9f..a80c27672 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV271Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV271Tests.cs @@ -144,6 +144,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.7.1|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV27Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV27Tests.cs index 9ffe25351..fdc2b1992 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV27Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV27Tests.cs @@ -146,6 +146,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + 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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV281Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV281Tests.cs index ebbba3f99..07b53835d 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV281Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV281Tests.cs @@ -144,6 +144,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueInstance); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.8.1|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/LegacyPipeParserV28Tests.cs b/tests/NHapi.NUnit/Parser/LegacyPipeParserV28Tests.cs index f94537843..8d8052720 100644 --- a/tests/NHapi.NUnit/Parser/LegacyPipeParserV28Tests.cs +++ b/tests/NHapi.NUnit/Parser/LegacyPipeParserV28Tests.cs @@ -144,6 +144,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.8|||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 LegacyPipeParser(); + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserTests.cs b/tests/NHapi.NUnit/Parser/PipeParserTests.cs index 30dc2c666..f538661f7 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserTests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserTests.cs @@ -5,6 +5,7 @@ namespace NHapi.NUnit.Parser using global::NUnit.Framework; + using NHapi.Base; using NHapi.Base.Model; using NHapi.Base.Parser; using NHapi.Base.Util; @@ -308,5 +309,96 @@ public void MoreGreedyMode() } } } + + /// + /// The folllwing 4 tests are ported from hapi + /// https://github.com/hapifhir/hapi-hl7v2/blob/master/hapi-examples/src/main/java/ca/uhn/hl7v2/examples/ParseInvalidObx2Values.java. + /// + [Test] + public void Obx5DataTypeIsSetFromObx2_WhenObx2IsEmpty_Hl7ExceptionIsThrown() + { + 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 parser = new PipeParser(); + + var exception = Assert.Throws(() => parser.Parse(message)); + + Assert.AreEqual( + "OBX-5 is valued, but OBX-2 is not. A datatype for OBX-5 must be specified using OBX-2.", + exception.Message); + } + + [Test] + 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); + } + + [Test] + public void Obx5DataTypeIsSetFromObx2_WhenObx2IsAnInvalidType_Hl7ExceptionIsThrown() + { + 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 exception = Assert.Throws(() => parser.Parse(message)); + + Assert.AreEqual( + "'BAD' in record 1 is invalid for version 2.3: Segment: OBX Field #2", + exception.Message); + } + + [Test] + 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); + } } } \ No newline at end of file diff --git a/tests/NHapi.NUnit/Parser/PipeParserV21Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV21Tests.cs index 4c5eadec9..56a7403c0 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV21Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV21Tests.cs @@ -55,6 +55,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueInstance); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.1|||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.OBSERVATIONRESULTS.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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV231Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV231Tests.cs index 64091e1b0..bed4124d0 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV231Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV231Tests.cs @@ -617,6 +617,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.3.1|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV23Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV23Tests.cs index c775cc7a1..c2df94112 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV23Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV23Tests.cs @@ -497,6 +497,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(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||||STValue||||||F\r"; + + var parser = new PipeParser(); + var options = new ParserOptions { DefaultObx2Type = "ST" }; + + var parsed = (ORU_R01)parser.Parse(message, options); + + var actualObservationValueType = parsed.GetRESPONSE(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.GetObservationValue(0).Data; + var obx2 = parsed.GetRESPONSE(0).GetORDER_OBSERVATION(0).GetOBSERVATION(0).OBX.ValueType; + + Assert.AreEqual("ST", obx2.Value); + Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); + Assert.AreEqual("STValue", ((ST)actualObservationValueType).Value); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV24Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV24Tests.cs index 46a1e9ce7..2d983f7dd 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV24Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV24Tests.cs @@ -447,6 +447,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.4|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV251Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV251Tests.cs index 1f585c868..865886ce0 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV251Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV251Tests.cs @@ -146,6 +146,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.5.1|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV25Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV25Tests.cs index f7514fb56..2d2abd15f 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV25Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV25Tests.cs @@ -91,6 +91,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.5|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV26Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV26Tests.cs index 7854d251c..4799a4e37 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV26Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV26Tests.cs @@ -351,6 +351,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.6|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV271Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV271Tests.cs index 3f4f85d58..d29f8eef3 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV271Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV271Tests.cs @@ -144,6 +144,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.7.1|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV27Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV27Tests.cs index 41139cb75..dc9882b12 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV27Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV27Tests.cs @@ -146,6 +146,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + 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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV281Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV281Tests.cs index 5c26abde6..5db4625b1 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV281Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV281Tests.cs @@ -144,6 +144,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueInstance); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.8.1|||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); + } + /// /// Specified in Table 0125. /// diff --git a/tests/NHapi.NUnit/Parser/PipeParserV28Tests.cs b/tests/NHapi.NUnit/Parser/PipeParserV28Tests.cs index d177a984d..48ef6bc4a 100644 --- a/tests/NHapi.NUnit/Parser/PipeParserV28Tests.cs +++ b/tests/NHapi.NUnit/Parser/PipeParserV28Tests.cs @@ -144,6 +144,31 @@ public void TestObx5DataTypeIsSetFromObx2_AndAllDataTypesAreConstructable(Type e Assert.IsAssignableFrom(expectedObservationValueType, actualObservationValueType); } + [Test] + public void TestObx5DataTypeIsSetFromObx2_WhenObx2IsEmptyAndDefaultIsSet_DefaultTypeIsUsed() + { + var expectedObservationValueType = typeof(ST); + + var message = + "MSH|^~\\&|XPress Arrival||||200610120839||ORU^R01|EBzH1711114101206|P|2.8|||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); + } + /// /// Specified in Table 0125. ///