xref: /aosp_15_r20/external/swiftshader/tests/regres/cov/span_test.go (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1*03ce13f7SAndroid Build Coastguard Worker// Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker//
3*03ce13f7SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker//
7*03ce13f7SAndroid Build Coastguard Worker//    http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker//
9*03ce13f7SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker// limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Workerpackage cov_test
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Workerimport (
18*03ce13f7SAndroid Build Coastguard Worker	"reflect"
19*03ce13f7SAndroid Build Coastguard Worker	"testing"
20*03ce13f7SAndroid Build Coastguard Worker
21*03ce13f7SAndroid Build Coastguard Worker	"swiftshader.googlesource.com/SwiftShader/tests/regres/cov"
22*03ce13f7SAndroid Build Coastguard Worker)
23*03ce13f7SAndroid Build Coastguard Worker
24*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListAddNoMerge(t *testing.T) {
25*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{}
26*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(3, 1, 3, 5))
27*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(3, 1, 3, 5))
28*03ce13f7SAndroid Build Coastguard Worker
29*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(4, 1, 4, 5))
30*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(3, 1, 3, 5), span(4, 1, 4, 5))
31*03ce13f7SAndroid Build Coastguard Worker
32*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(2, 1, 2, 5))
33*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
34*03ce13f7SAndroid Build Coastguard Worker}
35*03ce13f7SAndroid Build Coastguard Worker
36*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListAddExpand(t *testing.T) {
37*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(1, 1, 1, 5), span(5, 4, 5, 7), span(9, 1, 9, 5)}
38*03ce13f7SAndroid Build Coastguard Worker
39*03ce13f7SAndroid Build Coastguard Worker	// Expand front (column)
40*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(5, 1, 5, 5))
41*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 1, 5), span(5, 1, 5, 7), span(9, 1, 9, 5))
42*03ce13f7SAndroid Build Coastguard Worker
43*03ce13f7SAndroid Build Coastguard Worker	// Expand back (column)
44*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(5, 5, 5, 9))
45*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 1, 5), span(5, 1, 5, 9), span(9, 1, 9, 5))
46*03ce13f7SAndroid Build Coastguard Worker
47*03ce13f7SAndroid Build Coastguard Worker	// Expand front (line)
48*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(4, 3, 5, 2))
49*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 1, 5), span(4, 3, 5, 9), span(9, 1, 9, 5))
50*03ce13f7SAndroid Build Coastguard Worker
51*03ce13f7SAndroid Build Coastguard Worker	// Expand back (line)
52*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(5, 4, 6, 3))
53*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 1, 5), span(4, 3, 6, 3), span(9, 1, 9, 5))
54*03ce13f7SAndroid Build Coastguard Worker
55*03ce13f7SAndroid Build Coastguard Worker	// Expand front (touching)
56*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(4, 2, 4, 3))
57*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 1, 5), span(4, 2, 6, 3), span(9, 1, 9, 5))
58*03ce13f7SAndroid Build Coastguard Worker
59*03ce13f7SAndroid Build Coastguard Worker	// Expand back (touching)
60*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(6, 3, 6, 4))
61*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 1, 5), span(4, 2, 6, 4), span(9, 1, 9, 5))
62*03ce13f7SAndroid Build Coastguard Worker}
63*03ce13f7SAndroid Build Coastguard Worker
64*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListAddMergeOverlap(t *testing.T) {
65*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(1, 1, 1, 5), span(5, 4, 5, 7), span(9, 1, 9, 5)}
66*03ce13f7SAndroid Build Coastguard Worker
67*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(1, 3, 5, 6))
68*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 5, 7), span(9, 1, 9, 5))
69*03ce13f7SAndroid Build Coastguard Worker
70*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(5, 5, 9, 3))
71*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 9, 5))
72*03ce13f7SAndroid Build Coastguard Worker}
73*03ce13f7SAndroid Build Coastguard Worker
74*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListAddMergeTouching(t *testing.T) {
75*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(1, 1, 1, 5), span(5, 4, 5, 7), span(9, 1, 9, 5)}
76*03ce13f7SAndroid Build Coastguard Worker
77*03ce13f7SAndroid Build Coastguard Worker	l.Add(span(1, 5, 9, 1))
78*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(1, 1, 9, 5))
79*03ce13f7SAndroid Build Coastguard Worker}
80*03ce13f7SAndroid Build Coastguard Worker
81*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListRemoveNothing(t *testing.T) {
82*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5)}
83*03ce13f7SAndroid Build Coastguard Worker
84*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(1, 1, 2, 1))
85*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
86*03ce13f7SAndroid Build Coastguard Worker
87*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(2, 5, 3, 1))
88*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
89*03ce13f7SAndroid Build Coastguard Worker
90*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 5, 4, 1))
91*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
92*03ce13f7SAndroid Build Coastguard Worker
93*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(4, 5, 10, 10))
94*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
95*03ce13f7SAndroid Build Coastguard Worker}
96*03ce13f7SAndroid Build Coastguard Worker
97*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListRemoveWhole(t *testing.T) {
98*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5)}
99*03ce13f7SAndroid Build Coastguard Worker
100*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 1, 3, 5))
101*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(4, 1, 4, 5))
102*03ce13f7SAndroid Build Coastguard Worker
103*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(1, 1, 3, 3))
104*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(4, 1, 4, 5))
105*03ce13f7SAndroid Build Coastguard Worker
106*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 1, 4, 5))
107*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l)
108*03ce13f7SAndroid Build Coastguard Worker}
109*03ce13f7SAndroid Build Coastguard Worker
110*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListRemoveZeroLength(t *testing.T) {
111*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5)}
112*03ce13f7SAndroid Build Coastguard Worker
113*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 1, 3, 1))
114*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
115*03ce13f7SAndroid Build Coastguard Worker
116*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 5, 3, 5))
117*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
118*03ce13f7SAndroid Build Coastguard Worker}
119*03ce13f7SAndroid Build Coastguard Worker
120*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListRemoveTrim(t *testing.T) {
121*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5)}
122*03ce13f7SAndroid Build Coastguard Worker
123*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(2, 1, 2, 2))
124*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 2, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
125*03ce13f7SAndroid Build Coastguard Worker
126*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(2, 4, 2, 5))
127*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 2, 2, 4), span(3, 1, 3, 5), span(4, 1, 4, 5))
128*03ce13f7SAndroid Build Coastguard Worker
129*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(2, 5, 3, 2))
130*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 2, 2, 4), span(3, 2, 3, 5), span(4, 1, 4, 5))
131*03ce13f7SAndroid Build Coastguard Worker
132*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 4, 3, 5))
133*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 2, 2, 4), span(3, 2, 3, 4), span(4, 1, 4, 5))
134*03ce13f7SAndroid Build Coastguard Worker
135*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(4, 1, 4, 2))
136*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 2, 2, 4), span(3, 2, 3, 4), span(4, 2, 4, 5))
137*03ce13f7SAndroid Build Coastguard Worker
138*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(4, 4, 4, 5))
139*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 2, 2, 4), span(3, 2, 3, 4), span(4, 2, 4, 4))
140*03ce13f7SAndroid Build Coastguard Worker}
141*03ce13f7SAndroid Build Coastguard Worker
142*03ce13f7SAndroid Build Coastguard Workerfunc TestSpanListRemoveSplit(t *testing.T) {
143*03ce13f7SAndroid Build Coastguard Worker	l := cov.SpanList{span(2, 1, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5)}
144*03ce13f7SAndroid Build Coastguard Worker
145*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(2, 2, 2, 3))
146*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 2), span(2, 3, 2, 5), span(3, 1, 3, 5), span(4, 1, 4, 5))
147*03ce13f7SAndroid Build Coastguard Worker
148*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(3, 2, 3, 4))
149*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 2), span(2, 3, 2, 5), span(3, 1, 3, 2), span(3, 4, 3, 5), span(4, 1, 4, 5))
150*03ce13f7SAndroid Build Coastguard Worker
151*03ce13f7SAndroid Build Coastguard Worker	l.Remove(span(4, 2, 4, 2)) // zero length == no split
152*03ce13f7SAndroid Build Coastguard Worker	checkSpanList(t, l, span(2, 1, 2, 2), span(2, 3, 2, 5), span(3, 1, 3, 2), span(3, 4, 3, 5), span(4, 1, 4, 5))
153*03ce13f7SAndroid Build Coastguard Worker}
154*03ce13f7SAndroid Build Coastguard Worker
155*03ce13f7SAndroid Build Coastguard Workerfunc span(startLine, startColumn, endLine, endColumn int) cov.Span {
156*03ce13f7SAndroid Build Coastguard Worker	return cov.Span{
157*03ce13f7SAndroid Build Coastguard Worker		Start: cov.Location{Line: startLine, Column: startColumn},
158*03ce13f7SAndroid Build Coastguard Worker		End:   cov.Location{Line: endLine, Column: endColumn},
159*03ce13f7SAndroid Build Coastguard Worker	}
160*03ce13f7SAndroid Build Coastguard Worker}
161*03ce13f7SAndroid Build Coastguard Worker
162*03ce13f7SAndroid Build Coastguard Workerfunc checkSpanList(t *testing.T, got cov.SpanList, expect ...cov.Span) {
163*03ce13f7SAndroid Build Coastguard Worker	if expect == nil {
164*03ce13f7SAndroid Build Coastguard Worker		expect = cov.SpanList{}
165*03ce13f7SAndroid Build Coastguard Worker	}
166*03ce13f7SAndroid Build Coastguard Worker	if !reflect.DeepEqual(got, cov.SpanList(expect)) {
167*03ce13f7SAndroid Build Coastguard Worker		t.Errorf("SpanList not as expected.\nGot:\n%v\nExpect:\n%v", got, cov.SpanList(expect))
168*03ce13f7SAndroid Build Coastguard Worker	}
169*03ce13f7SAndroid Build Coastguard Worker}
170