xref: /aosp_15_r20/build/blueprint/proptools/configurable_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
1*1fa6dee9SAndroid Build Coastguard Workerpackage proptools
2*1fa6dee9SAndroid Build Coastguard Worker
3*1fa6dee9SAndroid Build Coastguard Workerimport (
4*1fa6dee9SAndroid Build Coastguard Worker	"fmt"
5*1fa6dee9SAndroid Build Coastguard Worker	"reflect"
6*1fa6dee9SAndroid Build Coastguard Worker	"testing"
7*1fa6dee9SAndroid Build Coastguard Worker)
8*1fa6dee9SAndroid Build Coastguard Worker
9*1fa6dee9SAndroid Build Coastguard Workerfunc TestPostProcessor(t *testing.T) {
10*1fa6dee9SAndroid Build Coastguard Worker	// Same as the ascii art example in Configurable.evaluate()
11*1fa6dee9SAndroid Build Coastguard Worker	prop := NewConfigurable[[]string](nil, nil)
12*1fa6dee9SAndroid Build Coastguard Worker	prop.AppendSimpleValue([]string{"a"})
13*1fa6dee9SAndroid Build Coastguard Worker	prop.AppendSimpleValue([]string{"b"})
14*1fa6dee9SAndroid Build Coastguard Worker	prop.AddPostProcessor(addToElements("1"))
15*1fa6dee9SAndroid Build Coastguard Worker
16*1fa6dee9SAndroid Build Coastguard Worker	prop2 := NewConfigurable[[]string](nil, nil)
17*1fa6dee9SAndroid Build Coastguard Worker	prop2.AppendSimpleValue([]string{"c"})
18*1fa6dee9SAndroid Build Coastguard Worker
19*1fa6dee9SAndroid Build Coastguard Worker	prop3 := NewConfigurable[[]string](nil, nil)
20*1fa6dee9SAndroid Build Coastguard Worker	prop3.AppendSimpleValue([]string{"d"})
21*1fa6dee9SAndroid Build Coastguard Worker	prop3.AppendSimpleValue([]string{"e"})
22*1fa6dee9SAndroid Build Coastguard Worker	prop3.AddPostProcessor(addToElements("2"))
23*1fa6dee9SAndroid Build Coastguard Worker
24*1fa6dee9SAndroid Build Coastguard Worker	prop4 := NewConfigurable[[]string](nil, nil)
25*1fa6dee9SAndroid Build Coastguard Worker	prop4.AppendSimpleValue([]string{"f"})
26*1fa6dee9SAndroid Build Coastguard Worker
27*1fa6dee9SAndroid Build Coastguard Worker	prop5 := NewConfigurable[[]string](nil, nil)
28*1fa6dee9SAndroid Build Coastguard Worker	prop5.AppendSimpleValue([]string{"g"})
29*1fa6dee9SAndroid Build Coastguard Worker	prop5.AddPostProcessor(addToElements("3"))
30*1fa6dee9SAndroid Build Coastguard Worker
31*1fa6dee9SAndroid Build Coastguard Worker	prop2.Append(prop3)
32*1fa6dee9SAndroid Build Coastguard Worker	prop2.AddPostProcessor(addToElements("z"))
33*1fa6dee9SAndroid Build Coastguard Worker
34*1fa6dee9SAndroid Build Coastguard Worker	prop.Append(prop2)
35*1fa6dee9SAndroid Build Coastguard Worker	prop.AddPostProcessor(addToElements("y"))
36*1fa6dee9SAndroid Build Coastguard Worker	prop.Append(prop4)
37*1fa6dee9SAndroid Build Coastguard Worker	prop.Append(prop5)
38*1fa6dee9SAndroid Build Coastguard Worker
39*1fa6dee9SAndroid Build Coastguard Worker	expected := []string{"a1y", "b1y", "czy", "d2zy", "e2zy", "f", "g3"}
40*1fa6dee9SAndroid Build Coastguard Worker	x := prop.Get(&configurableEvalutorForTesting{})
41*1fa6dee9SAndroid Build Coastguard Worker	if !reflect.DeepEqual(x.Get(), expected) {
42*1fa6dee9SAndroid Build Coastguard Worker		t.Fatalf("Expected %v, got %v", expected, x.Get())
43*1fa6dee9SAndroid Build Coastguard Worker	}
44*1fa6dee9SAndroid Build Coastguard Worker}
45*1fa6dee9SAndroid Build Coastguard Worker
46*1fa6dee9SAndroid Build Coastguard Workerfunc TestPostProcessorWhenPassedToHelperFunction(t *testing.T) {
47*1fa6dee9SAndroid Build Coastguard Worker	prop := NewConfigurable[[]string](nil, nil)
48*1fa6dee9SAndroid Build Coastguard Worker	prop.AppendSimpleValue([]string{"a"})
49*1fa6dee9SAndroid Build Coastguard Worker	prop.AppendSimpleValue([]string{"b"})
50*1fa6dee9SAndroid Build Coastguard Worker
51*1fa6dee9SAndroid Build Coastguard Worker	helper := func(p Configurable[[]string]) {
52*1fa6dee9SAndroid Build Coastguard Worker		p.AddPostProcessor(addToElements("1"))
53*1fa6dee9SAndroid Build Coastguard Worker	}
54*1fa6dee9SAndroid Build Coastguard Worker
55*1fa6dee9SAndroid Build Coastguard Worker	helper(prop)
56*1fa6dee9SAndroid Build Coastguard Worker
57*1fa6dee9SAndroid Build Coastguard Worker	expected := []string{"a1", "b1"}
58*1fa6dee9SAndroid Build Coastguard Worker	x := prop.Get(&configurableEvalutorForTesting{})
59*1fa6dee9SAndroid Build Coastguard Worker	if !reflect.DeepEqual(x.Get(), expected) {
60*1fa6dee9SAndroid Build Coastguard Worker		t.Fatalf("Expected %v, got %v", expected, x.Get())
61*1fa6dee9SAndroid Build Coastguard Worker	}
62*1fa6dee9SAndroid Build Coastguard Worker}
63*1fa6dee9SAndroid Build Coastguard Worker
64*1fa6dee9SAndroid Build Coastguard Workerfunc addToElements(s string) func([]string) []string {
65*1fa6dee9SAndroid Build Coastguard Worker	return func(arr []string) []string {
66*1fa6dee9SAndroid Build Coastguard Worker		for i := range arr {
67*1fa6dee9SAndroid Build Coastguard Worker			arr[i] = arr[i] + s
68*1fa6dee9SAndroid Build Coastguard Worker		}
69*1fa6dee9SAndroid Build Coastguard Worker		return arr
70*1fa6dee9SAndroid Build Coastguard Worker	}
71*1fa6dee9SAndroid Build Coastguard Worker}
72*1fa6dee9SAndroid Build Coastguard Worker
73*1fa6dee9SAndroid Build Coastguard Workertype configurableEvalutorForTesting struct {
74*1fa6dee9SAndroid Build Coastguard Worker	vars map[string]string
75*1fa6dee9SAndroid Build Coastguard Worker}
76*1fa6dee9SAndroid Build Coastguard Worker
77*1fa6dee9SAndroid Build Coastguard Workerfunc (e *configurableEvalutorForTesting) EvaluateConfiguration(condition ConfigurableCondition, property string) ConfigurableValue {
78*1fa6dee9SAndroid Build Coastguard Worker	if condition.functionName != "f" {
79*1fa6dee9SAndroid Build Coastguard Worker		panic("Expected functionName to be f")
80*1fa6dee9SAndroid Build Coastguard Worker	}
81*1fa6dee9SAndroid Build Coastguard Worker	if len(condition.args) != 1 {
82*1fa6dee9SAndroid Build Coastguard Worker		panic("Expected exactly 1 arg")
83*1fa6dee9SAndroid Build Coastguard Worker	}
84*1fa6dee9SAndroid Build Coastguard Worker	val, ok := e.vars[condition.args[0]]
85*1fa6dee9SAndroid Build Coastguard Worker	if ok {
86*1fa6dee9SAndroid Build Coastguard Worker		return ConfigurableValueString(val)
87*1fa6dee9SAndroid Build Coastguard Worker	}
88*1fa6dee9SAndroid Build Coastguard Worker	return ConfigurableValueUndefined()
89*1fa6dee9SAndroid Build Coastguard Worker}
90*1fa6dee9SAndroid Build Coastguard Worker
91*1fa6dee9SAndroid Build Coastguard Workerfunc (e *configurableEvalutorForTesting) PropertyErrorf(property, fmtString string, args ...interface{}) {
92*1fa6dee9SAndroid Build Coastguard Worker	panic(fmt.Sprintf(fmtString, args...))
93*1fa6dee9SAndroid Build Coastguard Worker}
94*1fa6dee9SAndroid Build Coastguard Worker
95*1fa6dee9SAndroid Build Coastguard Workervar _ ConfigurableEvaluator = (*configurableEvalutorForTesting)(nil)
96