platform_build_blueprint/splice_modules_test.go
Colin Cross 5df74a8e38 Maintain ordering between variants and aliases
AddFarVariationDependencies takes the first matching variant.  To
maintain sensible behavior on a module with aliases, the ordering
of aliases and module variants needs to be maintained so that
AddFarVariationDependencies can find an earlier matching alias
instead of a more specific variant.

Test: go test .
Change-Id: I78f4e96edd98159f3a62d94e240e5d652667bec4
2020-09-09 18:29:15 -07:00

144 lines
4.7 KiB
Go

// Copyright 2015 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package blueprint
import (
"reflect"
"testing"
)
var (
testModuleA = &moduleInfo{variant: variant{name: "testModuleA"}}
testModuleB = &moduleInfo{variant: variant{name: "testModuleB"}}
testModuleC = &moduleInfo{variant: variant{name: "testModuleC"}}
testModuleD = &moduleInfo{variant: variant{name: "testModuleD"}}
testModuleE = &moduleInfo{variant: variant{name: "testModuleE"}}
testModuleF = &moduleInfo{variant: variant{name: "testModuleF"}}
)
var spliceModulesTestCases = []struct {
in modulesOrAliases
at int
with modulesOrAliases
out modulesOrAliases
outAt int
reallocate bool
}{
{
// Insert at the beginning
in: modulesOrAliases{testModuleA, testModuleB, testModuleC},
at: 0,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleD, testModuleE, testModuleB, testModuleC},
outAt: 1,
reallocate: true,
},
{
// Insert in the middle
in: modulesOrAliases{testModuleA, testModuleB, testModuleC},
at: 1,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleA, testModuleD, testModuleE, testModuleC},
outAt: 2,
reallocate: true,
},
{
// Insert at the end
in: modulesOrAliases{testModuleA, testModuleB, testModuleC},
at: 2,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleA, testModuleB, testModuleD, testModuleE},
outAt: 3,
reallocate: true,
},
{
// Insert over a single element
in: modulesOrAliases{testModuleA},
at: 0,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleD, testModuleE},
outAt: 1,
reallocate: true,
},
{
// Insert at the beginning without reallocating
in: modulesOrAliases{testModuleA, testModuleB, testModuleC, nil}[0:3],
at: 0,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleD, testModuleE, testModuleB, testModuleC},
outAt: 1,
reallocate: false,
},
{
// Insert in the middle without reallocating
in: modulesOrAliases{testModuleA, testModuleB, testModuleC, nil}[0:3],
at: 1,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleA, testModuleD, testModuleE, testModuleC},
outAt: 2,
reallocate: false,
},
{
// Insert at the end without reallocating
in: modulesOrAliases{testModuleA, testModuleB, testModuleC, nil}[0:3],
at: 2,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleA, testModuleB, testModuleD, testModuleE},
outAt: 3,
reallocate: false,
},
{
// Insert over a single element without reallocating
in: modulesOrAliases{testModuleA, nil}[0:1],
at: 0,
with: modulesOrAliases{testModuleD, testModuleE},
out: modulesOrAliases{testModuleD, testModuleE},
outAt: 1,
reallocate: false,
},
}
func TestSpliceModules(t *testing.T) {
for _, testCase := range spliceModulesTestCases {
in := make(modulesOrAliases, len(testCase.in), cap(testCase.in))
copy(in, testCase.in)
origIn := in
got, gotAt := spliceModules(in, testCase.at, testCase.with)
if !reflect.DeepEqual(got, testCase.out) {
t.Errorf("test case: %v, %v -> %v", testCase.in, testCase.at, testCase.with)
t.Errorf("incorrect output:")
t.Errorf(" expected: %v", testCase.out)
t.Errorf(" got: %v", got)
}
if gotAt != testCase.outAt {
t.Errorf("test case: %v, %v -> %v", testCase.in, testCase.at, testCase.with)
t.Errorf("incorrect index:")
t.Errorf(" expected: %d", testCase.outAt)
t.Errorf(" got: %d", gotAt)
}
if sameArray(origIn, got) != !testCase.reallocate {
t.Errorf("test case: %v, %v -> %v", testCase.in, testCase.at, testCase.with)
not := ""
if !testCase.reallocate {
not = " not"
}
t.Errorf(" expected to%s reallocate", not)
}
}
}
func sameArray(a, b modulesOrAliases) bool {
return &a[0:cap(a)][cap(a)-1] == &b[0:cap(b)][cap(b)-1]
}