@@ -650,6 +650,43 @@ describe('ValueSetExporter', () => {
650650 } ) ;
651651 } ) ;
652652
653+ it ( 'should export a value set that includes a component from a local value set with a version' , ( ) => {
654+ const valueSet = new FshValueSet ( 'DinnerVS' ) ;
655+ const component = new ValueSetConceptComponentRule ( true ) ;
656+ component . from = {
657+ valueSets : [ 'http://food.org/food/ValueSet/hot-food|1.2.3' ]
658+ } ;
659+ valueSet . rules . push ( component ) ;
660+ doc . valueSets . set ( valueSet . name , valueSet ) ;
661+ const hotFoodVS = new FshValueSet ( 'HotFoodVS' ) ;
662+ hotFoodVS . id = 'hot-food' ;
663+ const setVsUrlRule = new CaretValueRule ( '' ) ;
664+ setVsUrlRule . caretPath = 'url' ;
665+ setVsUrlRule . value = 'http://food.org/food/ValueSet/hot-food' ;
666+ hotFoodVS . rules . push ( setVsUrlRule ) ;
667+ const setVsVersionRule = new CaretValueRule ( '' ) ;
668+ setVsVersionRule . caretPath = 'version' ;
669+ setVsVersionRule . value = '1.2.3' ;
670+ hotFoodVS . rules . push ( setVsVersionRule ) ;
671+ doc . valueSets . set ( hotFoodVS . name , hotFoodVS ) ;
672+ const exported = exporter . export ( ) . valueSets ;
673+ expect ( exported . length ) . toBe ( 2 ) ;
674+ expect ( exported [ 0 ] ) . toEqual ( {
675+ resourceType : 'ValueSet' ,
676+ id : 'DinnerVS' ,
677+ name : 'DinnerVS' ,
678+ url : 'http://hl7.org/fhir/us/minimal/ValueSet/DinnerVS' ,
679+ status : 'draft' ,
680+ compose : {
681+ include : [
682+ {
683+ valueSet : [ 'http://food.org/food/ValueSet/hot-food|1.2.3' ]
684+ }
685+ ]
686+ }
687+ } ) ;
688+ } ) ;
689+
653690 it ( 'should export a value set that includes a component from a named value set' , ( ) => {
654691 const valueSet = new FshValueSet ( 'DinnerVS' ) ;
655692 const component = new ValueSetConceptComponentRule ( true ) ;
@@ -685,6 +722,91 @@ describe('ValueSetExporter', () => {
685722 } ) ;
686723 } ) ;
687724
725+ it ( 'should export a value set that includes a component from a named versioned value set' , ( ) => {
726+ const valueSet = new FshValueSet ( 'DinnerVS' ) ;
727+ const component = new ValueSetConceptComponentRule ( true ) ;
728+ component . from = {
729+ valueSets : [ 'HotFoodVS|1.2.3' , 'ColdFoodVS' ]
730+ } ;
731+ valueSet . rules . push ( component ) ;
732+ doc . valueSets . set ( valueSet . name , valueSet ) ;
733+ const hotFoodVS = new FshValueSet ( 'HotFoodVS' ) ;
734+ hotFoodVS . id = 'hot-food' ;
735+ const setHotVsVersionRule = new CaretValueRule ( '' ) ;
736+ setHotVsVersionRule . caretPath = 'version' ;
737+ setHotVsVersionRule . value = '1.2.3' ;
738+ hotFoodVS . rules . push ( setHotVsVersionRule ) ;
739+ doc . valueSets . set ( hotFoodVS . name , hotFoodVS ) ;
740+ const coldFoodVS = new FshValueSet ( 'ColdFoodVS' ) ;
741+ coldFoodVS . id = 'cold-food' ;
742+ doc . valueSets . set ( coldFoodVS . name , coldFoodVS ) ;
743+ const exported = exporter . export ( ) . valueSets ;
744+ expect ( exported . length ) . toBe ( 3 ) ;
745+ expect ( exported [ 0 ] ) . toEqual ( {
746+ resourceType : 'ValueSet' ,
747+ id : 'DinnerVS' ,
748+ name : 'DinnerVS' ,
749+ url : 'http://hl7.org/fhir/us/minimal/ValueSet/DinnerVS' ,
750+ status : 'draft' ,
751+ compose : {
752+ include : [
753+ {
754+ valueSet : [
755+ 'http://hl7.org/fhir/us/minimal/ValueSet/hot-food|1.2.3' ,
756+ 'http://hl7.org/fhir/us/minimal/ValueSet/cold-food'
757+ ]
758+ }
759+ ]
760+ }
761+ } ) ;
762+ expect ( loggerSpy . getAllMessages ( 'error' ) ) . toHaveLength ( 0 ) ;
763+ expect ( loggerSpy . getAllMessages ( 'warn' ) ) . toHaveLength ( 0 ) ;
764+ } ) ;
765+
766+ it ( 'should export a value set that includes a component from a named versioned value set and warn on version mismatch' , ( ) => {
767+ const valueSet = new FshValueSet ( 'DinnerVS' ) ;
768+ const component = new ValueSetConceptComponentRule ( true ) ;
769+ component . from = {
770+ valueSets : [ 'HotFoodVS|4.5.6' , 'ColdFoodVS' ]
771+ } ;
772+ valueSet . rules . push ( component ) ;
773+ doc . valueSets . set ( valueSet . name , valueSet ) ;
774+ const hotFoodVS = new FshValueSet ( 'HotFoodVS' ) ;
775+ hotFoodVS . id = 'hot-food' ;
776+ const setHotVsVersionRule = new CaretValueRule ( '' ) ;
777+ setHotVsVersionRule . caretPath = 'version' ;
778+ setHotVsVersionRule . value = '1.2.3' ;
779+ hotFoodVS . rules . push ( setHotVsVersionRule ) ;
780+ doc . valueSets . set ( hotFoodVS . name , hotFoodVS ) ;
781+ const coldFoodVS = new FshValueSet ( 'ColdFoodVS' ) ;
782+ coldFoodVS . id = 'cold-food' ;
783+ doc . valueSets . set ( coldFoodVS . name , coldFoodVS ) ;
784+ const exported = exporter . export ( ) . valueSets ;
785+ expect ( exported . length ) . toBe ( 3 ) ;
786+ expect ( exported [ 0 ] ) . toEqual ( {
787+ resourceType : 'ValueSet' ,
788+ id : 'DinnerVS' ,
789+ name : 'DinnerVS' ,
790+ url : 'http://hl7.org/fhir/us/minimal/ValueSet/DinnerVS' ,
791+ status : 'draft' ,
792+ compose : {
793+ include : [
794+ {
795+ valueSet : [
796+ 'http://hl7.org/fhir/us/minimal/ValueSet/hot-food|4.5.6' ,
797+ 'http://hl7.org/fhir/us/minimal/ValueSet/cold-food'
798+ ]
799+ }
800+ ]
801+ }
802+ } ) ;
803+ expect ( loggerSpy . getAllMessages ( 'error' ) ) . toHaveLength ( 0 ) ;
804+ expect ( loggerSpy . getAllMessages ( 'warn' ) ) . toHaveLength ( 1 ) ;
805+ expect ( loggerSpy . getLastMessage ( 'warn' ) ) . toBe (
806+ 'HotFoodVS|4.5.6 was requested, but SUSHI found HotFoodVS|1.2.3'
807+ ) ;
808+ } ) ;
809+
688810 // TODO: as part of a later task, confirm that this is in fact correct. it seems to be what the IG publisher expects,
689811 // but doesn't quite fit the spec for ValueSet.compose.include.valueSet
690812 it . skip ( 'should export a value set that includes a component from a contained inline instance of value set' , ( ) => {
0 commit comments