// 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{variantName: "testModuleA"} testModuleB = &moduleInfo{variantName: "testModuleB"} testModuleC = &moduleInfo{variantName: "testModuleC"} testModuleD = &moduleInfo{variantName: "testModuleD"} testModuleE = &moduleInfo{variantName: "testModuleE"} testModuleF = &moduleInfo{variantName: "testModuleF"} ) func (m *moduleInfo) String() string { return m.variantName } var spliceModulesTestCases = []struct { in []*moduleInfo replace *moduleInfo with []*moduleInfo out []*moduleInfo reallocate bool }{ { // Insert at the beginning in: []*moduleInfo{testModuleA, testModuleB, testModuleC}, replace: testModuleA, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleD, testModuleE, testModuleB, testModuleC}, reallocate: true, }, { // Insert in the middle in: []*moduleInfo{testModuleA, testModuleB, testModuleC}, replace: testModuleB, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleA, testModuleD, testModuleE, testModuleC}, reallocate: true, }, { // Insert at the end in: []*moduleInfo{testModuleA, testModuleB, testModuleC}, replace: testModuleC, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleA, testModuleB, testModuleD, testModuleE}, reallocate: true, }, { // Insert over a single element in: []*moduleInfo{testModuleA}, replace: testModuleA, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleD, testModuleE}, reallocate: true, }, { // Insert at the beginning without reallocating in: []*moduleInfo{testModuleA, testModuleB, testModuleC, nil}[0:3], replace: testModuleA, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleD, testModuleE, testModuleB, testModuleC}, reallocate: false, }, { // Insert in the middle without reallocating in: []*moduleInfo{testModuleA, testModuleB, testModuleC, nil}[0:3], replace: testModuleB, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleA, testModuleD, testModuleE, testModuleC}, reallocate: false, }, { // Insert at the end without reallocating in: []*moduleInfo{testModuleA, testModuleB, testModuleC, nil}[0:3], replace: testModuleC, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleA, testModuleB, testModuleD, testModuleE}, reallocate: false, }, { // Insert over a single element without reallocating in: []*moduleInfo{testModuleA, nil}[0:1], replace: testModuleA, with: []*moduleInfo{testModuleD, testModuleE}, out: []*moduleInfo{testModuleD, testModuleE}, reallocate: false, }, } func TestSpliceModules(t *testing.T) { for _, testCase := range spliceModulesTestCases { in := make([]*moduleInfo, len(testCase.in), cap(testCase.in)) copy(in, testCase.in) origIn := in got := spliceModules(in, testCase.replace, testCase.with) if !reflect.DeepEqual(got, testCase.out) { t.Errorf("test case: %v, %v -> %v", testCase.in, testCase.replace, testCase.with) t.Errorf("incorrect output:") t.Errorf(" expected: %v", testCase.out) t.Errorf(" got: %v", got) } if sameArray(origIn, got) != !testCase.reallocate { t.Errorf("test case: %v, %v -> %v", testCase.in, testCase.replace, testCase.with) not := "" if !testCase.reallocate { not = " not" } t.Errorf(" expected to%s reallocate", not) } } } func sameArray(a, b []*moduleInfo) bool { return &a[0:cap(a)][cap(a)-1] == &b[0:cap(b)][cap(b)-1] }