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  }