github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/analytics/dimensions/dimensions_test.go (about) 1 package dimensions 2 3 import ( 4 "fmt" 5 "reflect" 6 "strings" 7 "testing" 8 9 "github.com/ActiveState/cli/internal/rtutils/ptr" 10 ) 11 12 func TestMap_Merge(t *testing.T) { 13 tests := []struct { 14 name string 15 input *Values 16 mergeWith *Values 17 expected *Values 18 }{ 19 { 20 "Simple", 21 &Values{Version: ptr.To("inputVersion")}, 22 &Values{ChannelName: ptr.To("mergeChannelName")}, 23 &Values{Version: ptr.To("inputVersion"), ChannelName: ptr.To("mergeChannelName")}, 24 }, 25 { 26 "Override", 27 &Values{Version: ptr.To("inputVersion")}, 28 &Values{Version: ptr.To("mergeVersion")}, 29 &Values{Version: ptr.To("mergeVersion")}, 30 }, 31 { 32 "Nils don't count", 33 &Values{Version: ptr.To("inputVersion")}, 34 &Values{Version: nil}, 35 &Values{Version: ptr.To("inputVersion")}, 36 }, 37 } 38 for _, tt := range tests { 39 t.Run(tt.name, func(t *testing.T) { 40 tt.input.Merge(tt.mergeWith) 41 different, diffValue := diff(tt.input, tt.expected) 42 if different { 43 t.Errorf("%v", diffValue) 44 } 45 }) 46 } 47 } 48 49 func diff(m1 *Values, m2 *Values) (bool, string) { 50 fields1 := reflect.ValueOf(m1).Elem().Type() 51 fields2 := reflect.ValueOf(m2).Elem().Type() 52 values1 := reflect.ValueOf(m1) 53 values2 := reflect.ValueOf(m2) 54 55 result := []string{} 56 for i := 0; i < fields1.NumField(); i++ { 57 field1 := fields1.Field(i) 58 field2 := fields2.Field(i) 59 val1Elem := values1.Elem().Field(i) 60 val2Elem := values2.Elem().Field(i) 61 62 if strings.ToUpper(field1.Name[0:1]) != field1.Name[0:1] { 63 continue 64 } 65 66 val1 := val1Elem.Elem().String() 67 val2 := val2Elem.Elem().String() 68 69 if val1Elem.IsNil() { 70 val1 = "<nil>" 71 } 72 if val2Elem.IsNil() { 73 val2 = "<nil>" 74 } 75 76 if val1 != val2 { 77 result = append(result, fmt.Sprintf("%s:%s != %s:%s", field1.Name, val1, field2.Name, val2)) 78 } 79 } 80 81 if len(result) > 0 { 82 return true, strings.Join(result, "\n") 83 } 84 85 return false, "" 86 }