1*7594170eSAndroid Build Coastguard Workerpackage mkcompare 2*7594170eSAndroid Build Coastguard Worker 3*7594170eSAndroid Build Coastguard Workerimport ( 4*7594170eSAndroid Build Coastguard Worker "github.com/google/go-cmp/cmp" 5*7594170eSAndroid Build Coastguard Worker "reflect" 6*7594170eSAndroid Build Coastguard Worker "testing" 7*7594170eSAndroid Build Coastguard Worker) 8*7594170eSAndroid Build Coastguard Worker 9*7594170eSAndroid Build Coastguard Workerfunc TestClassify(t *testing.T) { 10*7594170eSAndroid Build Coastguard Worker tests := []struct { 11*7594170eSAndroid Build Coastguard Worker name string 12*7594170eSAndroid Build Coastguard Worker mLeft map[string]int 13*7594170eSAndroid Build Coastguard Worker mRight map[string]int 14*7594170eSAndroid Build Coastguard Worker wantLeft []string 15*7594170eSAndroid Build Coastguard Worker wantCommon []string 16*7594170eSAndroid Build Coastguard Worker wantRight []string 17*7594170eSAndroid Build Coastguard Worker }{ 18*7594170eSAndroid Build Coastguard Worker { 19*7594170eSAndroid Build Coastguard Worker name: "one", 20*7594170eSAndroid Build Coastguard Worker mLeft: map[string]int{"a": 1, "b": 2}, 21*7594170eSAndroid Build Coastguard Worker mRight: map[string]int{"b": 3, "c": 4}, 22*7594170eSAndroid Build Coastguard Worker wantLeft: []string{"a"}, 23*7594170eSAndroid Build Coastguard Worker wantCommon: []string{"b"}, 24*7594170eSAndroid Build Coastguard Worker wantRight: []string{"c"}, 25*7594170eSAndroid Build Coastguard Worker }, 26*7594170eSAndroid Build Coastguard Worker { 27*7594170eSAndroid Build Coastguard Worker name: "two", 28*7594170eSAndroid Build Coastguard Worker mLeft: map[string]int{"a": 1, "b": 2}, 29*7594170eSAndroid Build Coastguard Worker mRight: map[string]int{"a": 3}, 30*7594170eSAndroid Build Coastguard Worker wantLeft: []string{"b"}, 31*7594170eSAndroid Build Coastguard Worker wantCommon: []string{"a"}, 32*7594170eSAndroid Build Coastguard Worker wantRight: nil, 33*7594170eSAndroid Build Coastguard Worker }, 34*7594170eSAndroid Build Coastguard Worker } 35*7594170eSAndroid Build Coastguard Worker for _, tt := range tests { 36*7594170eSAndroid Build Coastguard Worker t.Run(tt.name, func(t *testing.T) { 37*7594170eSAndroid Build Coastguard Worker gotLeft, gotCommon, gotRight := Classify(tt.mLeft, tt.mRight, func(_ string) bool { return true }) 38*7594170eSAndroid Build Coastguard Worker if !reflect.DeepEqual(gotLeft, tt.wantLeft) { 39*7594170eSAndroid Build Coastguard Worker t.Errorf("classify() gotLeft = %v, want %v", gotLeft, tt.wantLeft) 40*7594170eSAndroid Build Coastguard Worker } 41*7594170eSAndroid Build Coastguard Worker if !reflect.DeepEqual(gotCommon, tt.wantCommon) { 42*7594170eSAndroid Build Coastguard Worker t.Errorf("classify() gotCommon = %v, want %v", gotCommon, tt.wantCommon) 43*7594170eSAndroid Build Coastguard Worker } 44*7594170eSAndroid Build Coastguard Worker if !reflect.DeepEqual(gotRight, tt.wantRight) { 45*7594170eSAndroid Build Coastguard Worker t.Errorf("classify() gotRight = %v, want %v", gotRight, tt.wantRight) 46*7594170eSAndroid Build Coastguard Worker } 47*7594170eSAndroid Build Coastguard Worker }) 48*7594170eSAndroid Build Coastguard Worker } 49*7594170eSAndroid Build Coastguard Worker} 50*7594170eSAndroid Build Coastguard Worker 51*7594170eSAndroid Build Coastguard Workerfunc Test_compareVariableValues(t *testing.T) { 52*7594170eSAndroid Build Coastguard Worker tests := []struct { 53*7594170eSAndroid Build Coastguard Worker name string 54*7594170eSAndroid Build Coastguard Worker ref string 55*7594170eSAndroid Build Coastguard Worker our string 56*7594170eSAndroid Build Coastguard Worker sort bool 57*7594170eSAndroid Build Coastguard Worker want_missing []string 58*7594170eSAndroid Build Coastguard Worker want_extra []string 59*7594170eSAndroid Build Coastguard Worker }{ 60*7594170eSAndroid Build Coastguard Worker {name: "Same", ref: "x a b", our: "a b x", sort: true}, 61*7594170eSAndroid Build Coastguard Worker {name: "diff1", ref: "a b c", our: "d a", sort: true, want_missing: []string{"b", "c"}, want_extra: []string{"d"}}, 62*7594170eSAndroid Build Coastguard Worker } 63*7594170eSAndroid Build Coastguard Worker for _, tt := range tests { 64*7594170eSAndroid Build Coastguard Worker t.Run(tt.name, func(t *testing.T) { 65*7594170eSAndroid Build Coastguard Worker got_missing, got_extra := compareVariableValues(tt.ref, tt.our, tt.sort) 66*7594170eSAndroid Build Coastguard Worker if diff := cmp.Diff(got_missing, tt.want_missing); diff != "" { 67*7594170eSAndroid Build Coastguard Worker t.Errorf("missing items differ: %s", diff) 68*7594170eSAndroid Build Coastguard Worker } 69*7594170eSAndroid Build Coastguard Worker if diff := cmp.Diff(got_extra, tt.want_extra); diff != "" { 70*7594170eSAndroid Build Coastguard Worker t.Errorf("extra items differ: %s", diff) 71*7594170eSAndroid Build Coastguard Worker } 72*7594170eSAndroid Build Coastguard Worker }) 73*7594170eSAndroid Build Coastguard Worker } 74*7594170eSAndroid Build Coastguard Worker} 75*7594170eSAndroid Build Coastguard Worker 76*7594170eSAndroid Build Coastguard Workerfunc TestCompare(t *testing.T) { 77*7594170eSAndroid Build Coastguard Worker refMod1 := MkModule{Type: "foo", Location: 1, Variables: map[string]string{"var1": "a", "var2": "b"}} 78*7594170eSAndroid Build Coastguard Worker ourMod1 := MkModule{Type: "foo", Location: 3, Variables: map[string]string{"var1": "a", "var2": "c"}} 79*7594170eSAndroid Build Coastguard Worker tests := []struct { 80*7594170eSAndroid Build Coastguard Worker name string 81*7594170eSAndroid Build Coastguard Worker refMod *MkModule 82*7594170eSAndroid Build Coastguard Worker ourMod *MkModule 83*7594170eSAndroid Build Coastguard Worker isGoodVar func(string) bool 84*7594170eSAndroid Build Coastguard Worker want MkModuleDiff 85*7594170eSAndroid Build Coastguard Worker }{ 86*7594170eSAndroid Build Coastguard Worker { 87*7594170eSAndroid Build Coastguard Worker name: "Ignored vars", 88*7594170eSAndroid Build Coastguard Worker refMod: &refMod1, 89*7594170eSAndroid Build Coastguard Worker ourMod: &ourMod1, 90*7594170eSAndroid Build Coastguard Worker isGoodVar: func(v string) bool { return v == "var1" }, 91*7594170eSAndroid Build Coastguard Worker want: MkModuleDiff{}, 92*7594170eSAndroid Build Coastguard Worker }, 93*7594170eSAndroid Build Coastguard Worker { 94*7594170eSAndroid Build Coastguard Worker name: "Different values", 95*7594170eSAndroid Build Coastguard Worker refMod: &refMod1, 96*7594170eSAndroid Build Coastguard Worker ourMod: &ourMod1, 97*7594170eSAndroid Build Coastguard Worker isGoodVar: func(_ string) bool { return true }, 98*7594170eSAndroid Build Coastguard Worker want: MkModuleDiff{ 99*7594170eSAndroid Build Coastguard Worker DiffVars: []MkVarDiff{{"var2", []string{"b"}, []string{"c"}}}, 100*7594170eSAndroid Build Coastguard Worker }, 101*7594170eSAndroid Build Coastguard Worker }, 102*7594170eSAndroid Build Coastguard Worker { 103*7594170eSAndroid Build Coastguard Worker name: "DifferentVars", 104*7594170eSAndroid Build Coastguard Worker refMod: &refMod1, 105*7594170eSAndroid Build Coastguard Worker ourMod: &MkModule{Type: "foo", Variables: map[string]string{"var2": "b", "var3": "c"}}, 106*7594170eSAndroid Build Coastguard Worker isGoodVar: func(_ string) bool { return true }, 107*7594170eSAndroid Build Coastguard Worker want: MkModuleDiff{ 108*7594170eSAndroid Build Coastguard Worker MissingVars: []string{"var1"}, 109*7594170eSAndroid Build Coastguard Worker ExtraVars: []string{"var3"}, 110*7594170eSAndroid Build Coastguard Worker }, 111*7594170eSAndroid Build Coastguard Worker }, 112*7594170eSAndroid Build Coastguard Worker } 113*7594170eSAndroid Build Coastguard Worker for _, tt := range tests { 114*7594170eSAndroid Build Coastguard Worker t.Run(tt.name, func(t *testing.T) { 115*7594170eSAndroid Build Coastguard Worker tt.want.Ref = tt.refMod 116*7594170eSAndroid Build Coastguard Worker tt.want.Our = tt.ourMod 117*7594170eSAndroid Build Coastguard Worker if got := Compare(tt.refMod, tt.ourMod, tt.isGoodVar); !reflect.DeepEqual(got, tt.want) { 118*7594170eSAndroid Build Coastguard Worker t.Errorf("Compare() = %v, want %v (diff = %s)", got, tt.want, cmp.Diff(got, tt.want)) 119*7594170eSAndroid Build Coastguard Worker } 120*7594170eSAndroid Build Coastguard Worker }) 121*7594170eSAndroid Build Coastguard Worker } 122*7594170eSAndroid Build Coastguard Worker} 123