@@ -7669,14 +7669,12 @@ public async Tasks.Task TestAbsoluteContentReferenceGeneration()
7669
7669
var zipSource = ZipSource . CreateValidationSource ( ) ;
7670
7670
var generator = new SnapshotGenerator ( zipSource , SnapshotGeneratorSettings . CreateDefault ( ) ) ;
7671
7671
7672
-
7673
7672
//Test if core resource has relative content references.
7674
7673
var coreQuestionnaire = await _testResolver . FindStructureDefinitionAsync ( "http://hl7.org/fhir/StructureDefinition/Questionnaire" ) ;
7675
7674
var coreSnapshot = await generator . GenerateAsync ( coreQuestionnaire ) ;
7676
7675
var item = coreSnapshot . Where ( e => e . Path == "Questionnaire.item.item" ) . FirstOrDefault ( ) ;
7677
7676
item . ContentReference . Should ( ) . Be ( "#Questionnaire.item" ) ;
7678
7677
7679
-
7680
7678
//Create profile for testing creation of absolute references.
7681
7679
var profile = new StructureDefinition
7682
7680
{
@@ -7718,15 +7716,9 @@ public async Tasks.Task TestAbsoluteContentReferenceGeneration()
7718
7716
} ,
7719
7717
new ElementDefinition
7720
7718
{
7721
- ElementId = "Questionnaire.item:booleanItem.type" ,
7722
- Path = "Questionnaire.item.type" ,
7723
- Fixed = new Code ( "boolean" )
7724
- } ,
7725
- new ElementDefinition
7726
- {
7727
- ElementId = "Questionnaire.item:booleanItem.item.type" ,
7728
- Path = "Questionnaire.item.item.type" ,
7729
- Fixed = new Code ( "string" )
7719
+ ElementId = "Questionnaire.item:booleanItem.item" ,
7720
+ Path = "Questionnaire.item.item" ,
7721
+ Min = 1
7730
7722
}
7731
7723
}
7732
7724
}
@@ -7737,9 +7729,6 @@ public async Tasks.Task TestAbsoluteContentReferenceGeneration()
7737
7729
7738
7730
var cref1 = profileSnapshot . Where ( e => e . ElementId == "Questionnaire.item:booleanItem.item" ) . FirstOrDefault ( ) ;
7739
7731
cref1 . ContentReference . Should ( ) . Be ( "http://hl7.org/fhir/StructureDefinition/Questionnaire#Questionnaire.item" ) ;
7740
-
7741
- var cref2 = profileSnapshot . Where ( e => e . ElementId == "Questionnaire.item:booleanItem.item.item" ) . FirstOrDefault ( ) ;
7742
- cref2 . ContentReference . Should ( ) . Be ( "http://hl7.org/fhir/StructureDefinition/Questionnaire#Questionnaire.item" ) ;
7743
7732
}
7744
7733
7745
7734
[ TestMethod ]
@@ -8460,5 +8449,121 @@ public async Tasks.Task TestMergingAPreviouslyRemovedElement()
8460
8449
Assert . IsNull ( valueQuantityEld ) ;
8461
8450
8462
8451
}
8452
+
8453
+ // Test whether we have fixed issue https://github.com/FirelyTeam/firely-net-sdk/issues/3177.
8454
+ [ TestMethod ]
8455
+ public async Tasks . Task TestSliceWithContentReference ( )
8456
+ {
8457
+ var sd = buildSliceOnContentReference ( ) ;
8458
+ _generator = new SnapshotGenerator ( _testResolver , _settings ) ;
8459
+ var snapshot = await _generator . GenerateAsync ( sd ) ;
8460
+
8461
+ // If we have copied the contentReference's children to the slice, there should not be a contentReference
8462
+ // on the slice itself anymore (but it should still exist on the intro).
8463
+ snapshot . Single ( e => e . ElementId == "Parameters.parameter.part" )
8464
+ . ContentReference . Should ( ) . NotBeNull ( ) ;
8465
+ snapshot . Should ( ) . ContainSingle ( e => e . ElementId == "Parameters.parameter.part:medicationDispense.name" ) ;
8466
+
8467
+ // The slice itself should not have a contentReference, because it is copied the children below it.
8468
+ var firstSlice = snapshot . Single ( e => e . ElementId == "Parameters.parameter.part:medicationDispense" ) ;
8469
+ firstSlice . ContentReference . Should ( ) . BeNull ( ) ;
8470
+
8471
+ // But it should now have a TypeRef element!
8472
+ firstSlice . Type . Should ( ) . ContainSingle ( tr => tr . Code == "BackboneElement" ) ;
8473
+ }
8474
+
8475
+ // Test whether fixing issue https://github.com/FirelyTeam/firely-net-sdk/issues/3177 does
8476
+ // not break the snapshot generation when just the cardinality of the contentReference is changed.
8477
+ [ TestMethod ]
8478
+ public async Tasks . Task TestContentReferenceWithCardinalityChangeOnPart ( )
8479
+ {
8480
+ var sd = changeCardinalityOnContentReference ( ) ;
8481
+ _generator = new SnapshotGenerator ( _testResolver , _settings ) ;
8482
+ var snapshot = await _generator . GenerateAsync ( sd ) ;
8483
+
8484
+ // Changing the cardinality will not copy the children, so the contentReference should still
8485
+ // be there and NOT have a typeref.
8486
+ var firstPart = snapshot . Single ( e => e . ElementId == "Parameters.parameter.part" ) ;
8487
+ firstPart . ContentReference . Should ( ) . NotBeNull ( ) ;
8488
+ firstPart . Type . Should ( ) . BeEmpty ( ) ;
8489
+ }
8490
+
8491
+ // Test whether fixing issue https://github.com/FirelyTeam/firely-net-sdk/issues/3177 does
8492
+ // not break the snapshot generation when just the cardinality of a nested contentReference is changed.
8493
+ [ TestMethod ]
8494
+ public async Tasks . Task TestContentReferenceWithCardinalityChangeOnNestedPart ( )
8495
+ {
8496
+ var sd = changeCardinalityOnNestedContentReference ( ) ;
8497
+ _generator = new SnapshotGenerator ( _testResolver , _settings ) ;
8498
+ var snapshot = await _generator . GenerateAsync ( sd ) ;
8499
+
8500
+ // Changing the cardinality in a child *will* copy the children, so the contentReference should
8501
+ // now be gone, and it should have a TypeRef instead.
8502
+ var firstPart = snapshot . Single ( e => e . ElementId == "Parameters.parameter.part" ) ;
8503
+ firstPart . ContentReference . Should ( ) . BeNull ( ) ;
8504
+ firstPart . Type . Should ( ) . ContainSingle ( tr => tr . Code == "BackboneElement" ) ;
8505
+
8506
+ // But the nested part should still have a contentReference, and no typeref.
8507
+ var nestedPart = snapshot . Single ( e => e . ElementId == "Parameters.parameter.part.part" ) ;
8508
+ nestedPart . ContentReference . Should ( ) . NotBeNull ( ) ;
8509
+ nestedPart . Type . Should ( ) . BeEmpty ( ) ;
8510
+ }
8511
+
8512
+ private static StructureDefinition buildSliceOnContentReference ( )
8513
+ {
8514
+ var result = TestProfileArtifactSource . CreateTestSD ( "http://validationtest.org/fhir/StructureDefinition/Parameters-issue-3177" , "Parameters-issue-3177" ,
8515
+ "Parameters with sliced parts - and so copied contentReferences" , FHIRAllTypes . Parameters ) ;
8516
+
8517
+ var cons = result . Differential . Element ;
8518
+
8519
+ var slicingIntro = new ElementDefinition ( "Parameters.parameter.part" )
8520
+ . WithSlicingIntro ( ElementDefinition . SlicingRules . Closed ,
8521
+ ( ElementDefinition . DiscriminatorType . Pattern , "name" ) )
8522
+ . Required ( ) ;
8523
+
8524
+ cons . Add ( slicingIntro ) ;
8525
+
8526
+ cons . Add ( new ElementDefinition ( "Parameters.parameter.part" )
8527
+ {
8528
+ ElementId = "Parameters.parameter.part:medicationDispense" , SliceName = "medicationDispense" ,
8529
+ } . Required ( ) ) ;
8530
+
8531
+ cons . Add ( new ElementDefinition ( "Parameters.parameter.part.name" )
8532
+ {
8533
+ ElementId = "Parameters.parameter.part:medicationDispense.name" ,
8534
+ Pattern = new FhirString ( "medicationDispense" )
8535
+ } ) ;
8536
+
8537
+ return result ;
8538
+ }
8539
+
8540
+ private static StructureDefinition changeCardinalityOnContentReference ( )
8541
+ {
8542
+ var result = TestProfileArtifactSource . CreateTestSD ( "http://validationtest.org/fhir/StructureDefinition/Parameters-issue-3177" , "Parameters-issue-3177" ,
8543
+ "Parameters with new cardinality on parts" , FHIRAllTypes . Parameters ) ;
8544
+
8545
+ var cons = result . Differential . Element ;
8546
+
8547
+ var mainPart = new ElementDefinition ( "Parameters.parameter.part" )
8548
+ . Required ( ) ;
8549
+
8550
+ cons . Add ( mainPart ) ;
8551
+
8552
+ return result ;
8553
+ }
8554
+
8555
+ private static StructureDefinition changeCardinalityOnNestedContentReference ( )
8556
+ {
8557
+ var result = TestProfileArtifactSource . CreateTestSD ( "http://validationtest.org/fhir/StructureDefinition/Parameters-issue-3177" , "Parameters-issue-3177" ,
8558
+ "Parameters with new cardinality on part.part" , FHIRAllTypes . Parameters ) ;
8559
+
8560
+ var cons = result . Differential . Element ;
8561
+
8562
+ var nestedPart = new ElementDefinition ( "Parameters.parameter.part.part" )
8563
+ . Required ( ) ;
8564
+
8565
+ cons . Add ( nestedPart ) ;
8566
+
8567
+ return result ; }
8463
8568
}
8464
8569
}
0 commit comments