@@ -697,6 +697,58 @@ var nestedSchema = func() (*typed.Parser, string) {
697697 return parser , name
698698}
699699
700+ var associativeListSchema = func () (* typed.Parser , string ) {
701+ name := "type"
702+ parser := mustParse (`types:
703+ - name: type
704+ map:
705+ fields:
706+ - name: values
707+ type:
708+ list:
709+ elementRelationship: associative
710+ keys: ["keyAStr", "keyBInt"]
711+ elementType:
712+ map:
713+ fields:
714+ - name: keyAStr
715+ type:
716+ scalar: string
717+ - name: keyBInt
718+ type:
719+ scalar: numeric
720+ - name: value
721+ type:
722+ scalar: numeric
723+ ` )
724+ return parser , name
725+ }
726+
727+ var oldAssociativeListSchema = func () (* typed.Parser , string ) {
728+ name := "type"
729+ // No keyBInt yet!
730+ parser := mustParse (`types:
731+ - name: type
732+ map:
733+ fields:
734+ - name: values
735+ type:
736+ list:
737+ elementRelationship: associative
738+ keys: ["keyAStr"]
739+ elementType:
740+ map:
741+ fields:
742+ - name: keyAStr
743+ type:
744+ scalar: string
745+ - name: value
746+ type:
747+ scalar: numeric
748+ ` )
749+ return parser , name
750+ }
751+
700752func mustParse (schema typed.YAMLObject ) * typed.Parser {
701753 parser , err := typed .NewParser (schema )
702754 if err != nil {
@@ -707,12 +759,15 @@ func mustParse(schema typed.YAMLObject) *typed.Parser {
707759
708760func TestEnsureNamedFieldsAreMembers (t * testing.T ) {
709761 table := []struct {
762+ schemaFn func () (* typed.Parser , string )
763+ newSchemaFn func () (* typed.Parser , string )
710764 value typed.YAMLObject
711765 expectedBefore * Set
712766 expectedAfter * Set
713767 }{
714768 {
715- value : `{"named": {"named": {"value": 0}}}` ,
769+ schemaFn : nestedSchema ,
770+ value : `{"named": {"named": {"value": 0}}}` ,
716771 expectedBefore : NewSet (
717772 _P ("named" , "named" , "value" ),
718773 ),
@@ -723,7 +778,8 @@ func TestEnsureNamedFieldsAreMembers(t *testing.T) {
723778 ),
724779 },
725780 {
726- value : `{"named": {"a": {"named": {"value": 42}}}, "a": {"named": {"value": 1}}}` ,
781+ schemaFn : nestedSchema ,
782+ value : `{"named": {"a": {"named": {"value": 42}}}, "a": {"named": {"value": 1}}}` ,
727783 expectedBefore : NewSet (
728784 _P ("named" , "a" , "named" , "value" ),
729785 _P ("a" , "named" , "value" ),
@@ -739,7 +795,8 @@ func TestEnsureNamedFieldsAreMembers(t *testing.T) {
739795 ),
740796 },
741797 {
742- value : `{"named": {"list": [{"keyAStr": "a", "keyBInt": 1, "named": {"value": 0}}]}}` ,
798+ schemaFn : nestedSchema ,
799+ value : `{"named": {"list": [{"keyAStr": "a", "keyBInt": 1, "named": {"value": 0}}]}}` ,
743800 expectedBefore : NewSet (
744801 _P ("named" , "list" , KeyByFields ("keyAStr" , "a" , "keyBInt" , 1 ), "keyAStr" ),
745802 _P ("named" , "list" , KeyByFields ("keyAStr" , "a" , "keyBInt" , 1 ), "keyBInt" ),
@@ -756,11 +813,46 @@ func TestEnsureNamedFieldsAreMembers(t *testing.T) {
756813 _P ("named" ),
757814 ),
758815 },
816+ {
817+ // Generate the value using the old schema to get missing key entries,
818+ // then process with new schema which has keyBInt.
819+ schemaFn : oldAssociativeListSchema ,
820+ newSchemaFn : associativeListSchema ,
821+ value : `{"values": [{"keyAStr": "a", "value": 0}]}` ,
822+ expectedBefore : NewSet (
823+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "keyAStr" ),
824+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "value" ),
825+ _P ("values" , KeyByFields ("keyAStr" , "a" )),
826+ ),
827+ expectedAfter : NewSet (
828+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "keyAStr" ),
829+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "value" ),
830+ _P ("values" , KeyByFields ("keyAStr" , "a" )),
831+ _P ("values" ),
832+ ),
833+ },
834+ {
835+ // Check that converting the value with the missing key and
836+ // the recent schema doesn't add the missing key.
837+ schemaFn : associativeListSchema ,
838+ value : `{"values": [{"keyAStr": "a", "value": 1}]}` ,
839+ expectedBefore : NewSet (
840+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "keyAStr" ),
841+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "value" ),
842+ _P ("values" , KeyByFields ("keyAStr" , "a" )),
843+ ),
844+ expectedAfter : NewSet (
845+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "keyAStr" ),
846+ _P ("values" , KeyByFields ("keyAStr" , "a" ), "value" ),
847+ _P ("values" , KeyByFields ("keyAStr" , "a" )),
848+ _P ("values" ),
849+ ),
850+ },
759851 }
760852
761853 for _ , test := range table {
762854 t .Run (string (test .value ), func (t * testing.T ) {
763- parser , typeName := nestedSchema ()
855+ parser , typeName := test . schemaFn ()
764856 typeRef := schema.TypeRef {NamedType : & typeName }
765857 typedValue , err := parser .Type (typeName ).FromYAML (test .value )
766858 if err != nil {
@@ -780,6 +872,11 @@ func TestEnsureNamedFieldsAreMembers(t *testing.T) {
780872 }
781873
782874 schema := & parser .Schema
875+ if test .newSchemaFn != nil {
876+ newParser , _ := test .newSchemaFn ()
877+ schema = & newParser .Schema
878+ }
879+
783880 got := set .EnsureNamedFieldsAreMembers (schema , typeRef )
784881 if ! got .Equals (test .expectedAfter ) {
785882 t .Errorf ("expected after EnsureNamedFieldsAreMembers:\n %v\n \n got:\n %v\n \n missing:\n %v\n \n superfluous:\n \n %v" ,
0 commit comments