Commit 822e638a authored by Joseph Siddons's avatar Joseph Siddons
Browse files

test: Test wrapping at -180, 180 for rectangular query

parent 1404d879
import random
import unittest import unittest
from datetime import datetime, timedelta from datetime import datetime, timedelta
...@@ -27,6 +28,50 @@ class TestRect(unittest.TestCase): ...@@ -27,6 +28,50 @@ class TestRect(unittest.TestCase):
res = list(map(rect.contains, points)) res = list(map(rect.contains, points))
assert res == expected assert res == expected
def test_intersection(self):
d = datetime(2009, 1, 1, 0, 0)
dt = timedelta(days=14)
rect = Rectangle(10, 5, d, 20, 10, dt)
test_rects: list[Rectangle] = [
Rectangle(10, 5, d + timedelta(days=2), 18, 8, dt),
Rectangle(25, 5, d, 9, 12, timedelta(hours=7)),
Rectangle(
15, 8, d - timedelta(hours=18), 12, 7, timedelta(hours=4)
),
Rectangle(15, 8, d + timedelta(days=25), 12, 7, dt),
]
expected = [True, False, True, False]
res = list(map(rect.intersects, test_rects))
assert res == expected
def test_wrap(self):
d = datetime(2009, 1, 1, 0, 0)
dt = timedelta(days=14)
rect = Rectangle(170, 45, d, 180, 20, dt)
assert rect.east < 0
assert rect.west > 0
test_points: list[Record] = [
Record(-140, 40, d),
Record(0, 50, d),
Record(100, 45, d - timedelta(hours=2)),
Record(100, 45, d + timedelta(days=12)),
]
expected = [True, False, True, False]
res = list(map(rect.contains, test_points))
assert res == expected
test_rect = Rectangle(
-100, 40, d + timedelta(days=3), 80, 40, timedelta(days=2)
)
assert test_rect.east < rect.west
assert rect.intersects(test_rect)
# TEST: spatially match, time fail
test_rect = Rectangle(
-100, 40, d + timedelta(days=13), 80, 40, timedelta(days=2)
)
assert not rect.intersects(test_rect)
class TestOctTree(unittest.TestCase): class TestOctTree(unittest.TestCase):
def test_divides(self): def test_divides(self):
...@@ -130,6 +175,36 @@ class TestOctTree(unittest.TestCase): ...@@ -130,6 +175,36 @@ class TestOctTree(unittest.TestCase):
assert res == expected assert res == expected
def test_wrap_query(self):
N = 100
d = datetime(2023, 3, 24, 12, 0)
dt = timedelta(days=10)
boundary = Rectangle(0, 0, d, 360, 180, dt)
ot = OctTree(boundary, capacity=3)
quert_rect = Rectangle(
170, 45, d + timedelta(days=4), 60, 10, timedelta(days=8)
)
points_want: list[Record] = [
Record(175, 43, d + timedelta(days=2)),
Record(-172, 49, d + timedelta(days=4)),
]
points: list[Record] = [
Record(
random.choice(range(-150, 130)),
random.choice(range(-90, 91)),
d + timedelta(hours=random.choice(range(-120, 120))),
)
for _ in range(N)
]
points.extend(points_want)
for p in points:
ot.insert(p)
res = ot.query(quert_rect)
assert len(res) == len(points_want)
assert all([p in res for p in points_want])
def test_ellipse_query(self): def test_ellipse_query(self):
d1 = haversine(0, 2.5, 1, 2.5) d1 = haversine(0, 2.5, 1, 2.5)
d2 = haversine(0, 2.5, 0, 3.0) d2 = haversine(0, 2.5, 0, 3.0)
......
from math import pi import random
import unittest import unittest
from GeoSpatialTools import haversine from GeoSpatialTools import haversine
from GeoSpatialTools.quadtree import QuadTree, Record, Rectangle, Ellipse from GeoSpatialTools.quadtree import QuadTree, Record, Rectangle, Ellipse
...@@ -29,6 +30,23 @@ class TestRect(unittest.TestCase): ...@@ -29,6 +30,23 @@ class TestRect(unittest.TestCase):
res = list(map(rect.intersects, test_rects)) res = list(map(rect.intersects, test_rects))
assert res == expected assert res == expected
def test_wrap(self):
rect = Rectangle(170, 45, 180, 20)
assert rect.east < 0
assert rect.west > 0
test_points: list[Record] = [
Record(-140, 40),
Record(0, 50),
Record(100, 45),
]
expected = [True, False, True]
res = list(map(rect.contains, test_points))
assert res == expected
test_rect = Rectangle(-100, 40, 80, 40)
assert test_rect.east < rect.west
assert rect.intersects(test_rect)
class TestQuadTree(unittest.TestCase): class TestQuadTree(unittest.TestCase):
def test_divides(self): def test_divides(self):
...@@ -98,6 +116,31 @@ class TestQuadTree(unittest.TestCase): ...@@ -98,6 +116,31 @@ class TestQuadTree(unittest.TestCase):
assert res == expected assert res == expected
def test_wrap_query(self):
N = 100
qt_boundary = Rectangle(0, 0, 360, 180)
qt = QuadTree(qt_boundary, capacity=3)
quert_rect = Rectangle(170, 45, 60, 10)
points_want: list[Record] = [
Record(175, 43),
Record(-172, 49),
]
points: list[Record] = [
Record(
random.choice(range(-150, 130)),
random.choice(range(-90, 91)),
)
for _ in range(N)
]
points.extend(points_want)
for p in points:
qt.insert(p)
res = qt.query(quert_rect)
assert len(res) == len(points_want)
assert all([p in res for p in points_want])
def test_ellipse_query(self): def test_ellipse_query(self):
d1 = haversine(0, 2.5, 1, 2.5) d1 = haversine(0, 2.5, 1, 2.5)
d2 = haversine(0, 2.5, 0, 3.0) d2 = haversine(0, 2.5, 0, 3.0)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment