public void GetCoreModelTypeByName() { var pat = source.GetStructureDefinitionForCoreType("Patient"); Assert.IsNotNull(pat); Assert.AreEqual("Patient",pat.Snapshot.Element[0].Path); var boolean = source.GetStructureDefinitionForCoreType(FHIRDefinedType.Boolean); Assert.IsNotNull(boolean); Assert.AreEqual("boolean", boolean.Snapshot.Element[0].Path); }
internal static bool ExpandElement(ElementNavigator nav, ArtifactResolver resolver) { if (resolver == null) { throw Error.ArgumentNull("source"); } if (nav.Current == null) { throw Error.ArgumentNull("Navigator is not positioned on an element"); } if (nav.HasChildren) { return(true); // already has children, we're not doing anything extra } var defn = nav.Current; if (!String.IsNullOrEmpty(defn.NameReference)) { var sourceNav = new ElementNavigator(nav); var success = sourceNav.JumpToNameReference(defn.NameReference); if (!success) { throw Error.InvalidOperation("Trying to navigate down a node that has a nameReference of '{0}', which cannot be found in the StructureDefinition".FormatWith(defn.NameReference)); } nav.CopyChildren(sourceNav); } else if (defn.Type != null && defn.Type.Count > 0) { if (defn.Type.Count > 1) { throw new NotSupportedException("Element at path {0} has a choice of types, cannot expand".FormatWith(nav.Path)); } else { var coreType = resolver.GetStructureDefinitionForCoreType(defn.Type[0].Code.ToString()); if (coreType == null) { throw Error.NotSupported("Trying to navigate down a node that has a declared base type of '{0}', which is unknown".FormatWith(defn.Type[0].Code)); } if (coreType.Snapshot == null) { throw Error.NotSupported("Found definition of base type '{0}', but is does not contain a snapshot representation".FormatWith(defn.Type[0].Code)); } generateBaseElements(coreType.Snapshot.Element); var sourceNav = new ElementNavigator(coreType.Snapshot.Element); sourceNav.MoveToFirstChild(); nav.CopyChildren(sourceNav); } } return(true); }
public void GetCoreModelTypeByName() { var pat = source.GetStructureDefinitionForCoreType("Patient"); Assert.IsNotNull(pat); Assert.AreEqual("Patient",pat.Snapshot.Element[0].Path); }
private void TestExpandElement(string srcProfileUrl, string expandElemPath) { const string Indent = " "; // Prepare... var sd = _testSource.GetStructureDefinition(srcProfileUrl); Assert.IsNotNull(sd); Assert.IsNotNull(sd.Snapshot); var elems = sd.Snapshot.Element; Assert.IsNotNull(elems); Debug.WriteLine("Input:"); Debug.WriteLine(string.Join(Environment.NewLine, elems.Where(e => e.Path.StartsWith(expandElemPath)).Select(e => Indent + e.Path))); var elem = elems.FirstOrDefault(e => e.Path == expandElemPath); Assert.IsNotNull(elem); // Test... var generator = new SnapshotGenerator(_testSource, _settings); var result = generator.ExpandElement(elems, elem); // Verify results Debug.WriteLine("\r\nOutput:"); Debug.WriteLine(string.Join(Environment.NewLine, result.Where(e => e.Path.StartsWith(expandElemPath)).Select(e => Indent + e.Path))); Assert.IsNotNull(elem.Type); var elemType = elem.Type.FirstOrDefault(); var nameRef = elem.NameReference; if (elemType != null) { // Validate type profile expansion var elemTypeCode = elemType.Code.Value; Assert.IsNotNull(elemTypeCode); var elemProfile = elemType.Profile.FirstOrDefault(); var sdType = elemProfile != null ? _testSource.GetStructureDefinition(elemProfile) : _testSource.GetStructureDefinitionForCoreType(elemTypeCode); Assert.IsNotNull(sdType); Assert.IsNotNull(sdType.Snapshot); Debug.WriteLine("\r\nType:"); Debug.WriteLine(string.Join(Environment.NewLine, sdType.Snapshot.Element.Select(e => Indent + e.Path))); sdType.Snapshot.Rebase(expandElemPath); var typeElems = sdType.Snapshot.Element; Assert.IsTrue(result.Count == elems.Count + typeElems.Count - 1); Assert.IsTrue(result.Where(e => e.Path.StartsWith(expandElemPath)).Count() == typeElems.Count); var startPos = result.IndexOf(elem); for (int i = 0; i < typeElems.Count; i++) { var path = typeElems[i].Path; Assert.IsTrue(result[startPos + i].Path.EndsWith(path, StringComparison.OrdinalIgnoreCase)); } } else if (nameRef != null) { // Validate name reference expansion var nav = new ElementNavigator(elems); Assert.IsTrue(nav.JumpToNameReference(nameRef)); var prefix = nav.Path; Assert.IsTrue(nav.MoveToFirstChild()); var pos = result.IndexOf(elem); Debug.WriteLine("\r\nName Reference:"); do { Debug.WriteLine(Indent + nav.Path); var srcPath = nav.Path.Substring(prefix.Length); var tgtPath = result[++pos].Path.Substring(expandElemPath.Length); Assert.AreEqual(srcPath, tgtPath); } while (nav.MoveToNext()); } }
internal static bool expandElement(ElementNavigator nav, ArtifactResolver resolver, SnapshotGeneratorSettings settings) { if (resolver == null) { throw Error.ArgumentNull("source"); } if (nav.Current == null) { throw Error.ArgumentNull("Navigator is not positioned on an element"); } if (nav.HasChildren) { return(true); // already has children, we're not doing anything extra } var defn = nav.Current; if (!String.IsNullOrEmpty(defn.NameReference)) { var sourceNav = new ElementNavigator(nav); var success = sourceNav.JumpToNameReference(defn.NameReference); if (!success) { throw Error.InvalidOperation("Trying to navigate down a node that has a nameReference of '{0}', which cannot be found in the StructureDefinition".FormatWith(defn.NameReference)); } nav.CopyChildren(sourceNav); } else if (defn.Type != null && defn.Type.Count > 0) { if (defn.Type.Count > 1) { throw new NotSupportedException("Element at path '{0}' has a choice of types, cannot expand".FormatWith(nav.Path)); } else { // [WMR 20160720] Handle custom type profiles (GForge #9791) // var coreType = resolver.GetStructureDefinitionForCoreType(defn.Type[0].Code.Value); var primaryType = defn.Type[0]; var typeProfile = primaryType.Profile.FirstOrDefault(); StructureDefinition coreType = null; if (!defn.IsExtension() && !defn.IsReference() && !string.IsNullOrEmpty(typeProfile) && settings.ExpandTypeProfiles) { coreType = resolver.GetStructureDefinition(typeProfile); if ((coreType == null || coreType.Snapshot == null) && settings.IgnoreMissingTypeProfiles) { coreType = resolver.GetStructureDefinitionForCoreType(primaryType.Code.Value); } } else { coreType = resolver.GetStructureDefinitionForCoreType(primaryType.Code.Value); } if (coreType == null) { throw Error.NotSupported("Trying to navigate down a node that has a declared base type of '{0}', which is unknown".FormatWith(defn.Type[0].Code)); } if (coreType.Snapshot == null) { throw Error.NotSupported("Found definition of base type '{0}', but is does not contain a snapshot representation".FormatWith(defn.Type[0].Code)); } generateBaseElements(coreType.Snapshot.Element); var sourceNav = new ElementNavigator(coreType.Snapshot.Element); sourceNav.MoveToFirstChild(); nav.CopyChildren(sourceNav); } } return(true); }