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