xref: /aosp_15_r20/build/bazel/mkcompare/mkdiff_test.go (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
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