github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/geo/geomfn/binary_predicates_test.go (about) 1 // Copyright 2020 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package geomfn 12 13 import ( 14 "fmt" 15 "testing" 16 17 "github.com/cockroachdb/cockroach/pkg/geo" 18 "github.com/stretchr/testify/require" 19 ) 20 21 var ( 22 emptyRect = geo.MustParseGeometry("POLYGON EMPTY") 23 emptyLine = geo.MustParseGeometry("LINESTRING EMPTY") 24 leftRect = geo.MustParseGeometry("POLYGON((-1.0 0.0, 0.0 0.0, 0.0 1.0, -1.0 1.0, -1.0 0.0))") 25 leftRectPoint = geo.MustParseGeometry("POINT(-0.5 0.5)") 26 rightRect = geo.MustParseGeometry("POLYGON((0.0 0.0, 1.0 0.0, 1.0 1.0, 0.0 1.0, 0.0 0.0))") 27 rightRectPoint = geo.MustParseGeometry("POINT(0.5 0.5)") 28 overlappingRightRect = geo.MustParseGeometry("POLYGON((-0.1 0.0, 1.0 0.0, 1.0 1.0, -0.1 1.0, -0.1 0.0))") 29 middleLine = geo.MustParseGeometry("LINESTRING(-0.5 0.5, 0.5 0.5)") 30 ) 31 32 func TestCovers(t *testing.T) { 33 testCases := []struct { 34 a *geo.Geometry 35 b *geo.Geometry 36 expected bool 37 }{ 38 {rightRect, rightRectPoint, true}, 39 {rightRectPoint, rightRect, false}, 40 {leftRect, rightRect, false}, 41 } 42 43 for i, tc := range testCases { 44 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 45 g, err := Covers(tc.a, tc.b) 46 require.NoError(t, err) 47 require.Equal(t, tc.expected, g) 48 }) 49 } 50 51 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 52 _, err := Covers(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 53 requireMismatchingSRIDError(t, err) 54 }) 55 } 56 57 func TestCoveredBy(t *testing.T) { 58 testCases := []struct { 59 a *geo.Geometry 60 b *geo.Geometry 61 expected bool 62 }{ 63 {rightRect, rightRectPoint, false}, 64 {rightRectPoint, rightRect, true}, 65 {leftRect, rightRect, false}, 66 } 67 68 for i, tc := range testCases { 69 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 70 g, err := CoveredBy(tc.a, tc.b) 71 require.NoError(t, err) 72 require.Equal(t, tc.expected, g) 73 }) 74 } 75 76 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 77 _, err := CoveredBy(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 78 requireMismatchingSRIDError(t, err) 79 }) 80 } 81 82 func TestContains(t *testing.T) { 83 testCases := []struct { 84 a *geo.Geometry 85 b *geo.Geometry 86 expected bool 87 }{ 88 {rightRect, rightRectPoint, true}, 89 {rightRectPoint, rightRect, false}, 90 {rightRectPoint, rightRectPoint, true}, 91 {rightRect, rightRect, true}, 92 {leftRect, rightRect, false}, 93 } 94 95 for i, tc := range testCases { 96 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 97 g, err := Contains(tc.a, tc.b) 98 require.NoError(t, err) 99 require.Equal(t, tc.expected, g) 100 }) 101 } 102 103 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 104 _, err := Contains(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 105 requireMismatchingSRIDError(t, err) 106 }) 107 } 108 109 func TestContainsProperly(t *testing.T) { 110 testCases := []struct { 111 a *geo.Geometry 112 b *geo.Geometry 113 expected bool 114 }{ 115 {rightRect, rightRect, false}, 116 {rightRect, rightRectPoint, true}, 117 {rightRectPoint, rightRectPoint, true}, 118 } 119 120 for i, tc := range testCases { 121 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 122 g, err := ContainsProperly(tc.a, tc.b) 123 require.NoError(t, err) 124 require.Equal(t, tc.expected, g) 125 }) 126 } 127 128 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 129 _, err := ContainsProperly(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 130 requireMismatchingSRIDError(t, err) 131 }) 132 } 133 134 func TestCrosses(t *testing.T) { 135 testCases := []struct { 136 a *geo.Geometry 137 b *geo.Geometry 138 expected bool 139 }{ 140 {rightRect, rightRectPoint, false}, 141 {rightRectPoint, rightRect, false}, 142 {leftRect, rightRect, false}, 143 {leftRect, middleLine, true}, 144 {rightRect, middleLine, true}, 145 } 146 147 for i, tc := range testCases { 148 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 149 g, err := Crosses(tc.a, tc.b) 150 require.NoError(t, err) 151 require.Equal(t, tc.expected, g) 152 }) 153 } 154 155 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 156 _, err := Crosses(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 157 requireMismatchingSRIDError(t, err) 158 }) 159 } 160 161 func TestEquals(t *testing.T) { 162 testCases := []struct { 163 a *geo.Geometry 164 b *geo.Geometry 165 expected bool 166 }{ 167 {emptyLine, emptyRect, true}, 168 {emptyLine, emptyLine, true}, 169 {emptyRect, emptyRect, true}, 170 {rightRect, rightRectPoint, false}, 171 {rightRectPoint, rightRect, false}, 172 {leftRect, rightRect, false}, 173 {leftRect, geo.MustParseGeometry("POLYGON((0.0 0.0, 0.0 1.0, -1.0 1.0, -1.0 0.0, 0.0 0.0))"), true}, 174 } 175 176 for i, tc := range testCases { 177 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 178 g, err := Equals(tc.a, tc.b) 179 require.NoError(t, err) 180 require.Equal(t, tc.expected, g) 181 }) 182 } 183 184 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 185 _, err := Equals(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 186 requireMismatchingSRIDError(t, err) 187 }) 188 } 189 190 func TestIntersects(t *testing.T) { 191 testCases := []struct { 192 a *geo.Geometry 193 b *geo.Geometry 194 expected bool 195 }{ 196 {rightRect, leftRectPoint, false}, 197 {rightRect, rightRectPoint, true}, 198 {rightRectPoint, rightRect, true}, 199 {leftRect, rightRect, true}, 200 {leftRect, middleLine, true}, 201 {rightRect, middleLine, true}, 202 } 203 204 for i, tc := range testCases { 205 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 206 g, err := Intersects(tc.a, tc.b) 207 require.NoError(t, err) 208 require.Equal(t, tc.expected, g) 209 }) 210 } 211 212 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 213 _, err := Intersects(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 214 requireMismatchingSRIDError(t, err) 215 }) 216 } 217 218 func TestOverlaps(t *testing.T) { 219 testCases := []struct { 220 a *geo.Geometry 221 b *geo.Geometry 222 expected bool 223 }{ 224 {rightRect, rightRectPoint, false}, 225 {rightRectPoint, rightRect, false}, 226 {leftRect, rightRect, false}, 227 {leftRect, overlappingRightRect, true}, 228 } 229 230 for i, tc := range testCases { 231 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 232 g, err := Overlaps(tc.a, tc.b) 233 require.NoError(t, err) 234 require.Equal(t, tc.expected, g) 235 }) 236 } 237 238 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 239 _, err := Overlaps(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 240 requireMismatchingSRIDError(t, err) 241 }) 242 } 243 244 func TestTouches(t *testing.T) { 245 testCases := []struct { 246 a *geo.Geometry 247 b *geo.Geometry 248 expected bool 249 }{ 250 {rightRect, rightRectPoint, false}, 251 {rightRectPoint, rightRect, false}, 252 {leftRect, rightRect, true}, 253 } 254 255 for i, tc := range testCases { 256 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 257 g, err := Touches(tc.a, tc.b) 258 require.NoError(t, err) 259 require.Equal(t, tc.expected, g) 260 }) 261 } 262 263 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 264 _, err := Touches(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 265 requireMismatchingSRIDError(t, err) 266 }) 267 } 268 269 func TestWithin(t *testing.T) { 270 testCases := []struct { 271 a *geo.Geometry 272 b *geo.Geometry 273 expected bool 274 }{ 275 {rightRect, rightRectPoint, false}, 276 {rightRectPoint, rightRect, true}, 277 {leftRect, rightRect, false}, 278 } 279 280 for i, tc := range testCases { 281 t.Run(fmt.Sprintf("tc:%d", i), func(t *testing.T) { 282 g, err := Within(tc.a, tc.b) 283 require.NoError(t, err) 284 require.Equal(t, tc.expected, g) 285 }) 286 } 287 288 t.Run("errors if SRIDs mismatch", func(t *testing.T) { 289 _, err := Within(mismatchingSRIDGeometryA, mismatchingSRIDGeometryB) 290 requireMismatchingSRIDError(t, err) 291 }) 292 }