blob: 53feb13ec2a904e634c4c1009bea8506902c05c8 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You 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 protosource
import (
"fmt"
"strconv"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func TestCheckTagRangeIsSubset(t *testing.T) {
t.Parallel()
testExpectedSubset(t, "1", "1", "")
testExpectedSubset(t, "1-2", "1", "")
testExpectedSubset(t, "1", "1-2", "1-2")
testExpectedSubset(t, "5,4,3,2,1", "1-5", "")
testExpectedSubset(t, "1-5", "1,2,4,5,3", "")
testExpectedSubset(t, "90-199,200", "100-200", "")
testExpectedSubset(t, "100-200", "90-199,200", "90-199")
testExpectedSubset(t, "1-5,200,1000-1001,2000", "1-3,5,1001,3000", "3000")
testExpectedSubset(t, "1-92,93-95,96-99,100", "1-93,3-100,5-200", "5-200")
testExpectedSubset(t, "1-92,3-50,5-75,10-90,15-30", "1-20,5-10,30-75,91,92,93", "93")
}
func testExpectedSubset(
t *testing.T,
supersetRangesString string,
subsetRangesString string,
expectedMissingString string,
) {
supersetRanges := stringToTestRanges(supersetRangesString)
subsetRanges := stringToTestRanges(subsetRangesString)
expectedMissing := stringToTestRanges(expectedMissingString)
isSubset, actualMissing := CheckTagRangeIsSubset(supersetRanges, subsetRanges)
if isSubset && len(actualMissing) > 0 {
t.Error("Subset flag should be cleared when missing ranges are found")
} else if !isSubset && len(actualMissing) == 0 {
t.Error("Subset flag should be set when missing ranges aren't found")
}
assert.Equal(t, len(expectedMissing), len(actualMissing), fmt.Sprint(actualMissing))
if len(expectedMissing) == len(actualMissing) {
for i := range actualMissing {
assert.Equal(t, expectedMissing[i], actualMissing[i])
}
}
}
// Parses a string like 5-10,12 into test ranges.
func stringToTestRanges(rangesString string) []TagRange {
results := []TagRange{}
if rangesString == "" {
return results
}
rangeStrings := strings.Split(rangesString, ",")
for _, rangeString := range rangeStrings {
beginString, endString, hasEnd := strings.Cut(rangeString, "-")
if !hasEnd {
endString = beginString
}
begin, err := strconv.Atoi(beginString)
if err != nil {
panic(err)
}
end, err := strconv.Atoi(endString)
if err != nil {
panic(err)
}
results = append(results, testTagRange{begin, end})
}
return results
}
// Implementation of TagRange for testing.
type testTagRange struct {
start, end int
}
func (testTagRange) File() File { return nil }
func (testTagRange) Location() Location { return nil }
func (r testTagRange) Start() int { return r.start }
func (r testTagRange) End() int { return r.end }
func (testTagRange) Max() bool { return false }