diff --git a/geotrek/core/tests/test_commands.py b/geotrek/core/tests/test_commands.py index 3c2c31a25b..b7cb38e3b3 100644 --- a/geotrek/core/tests/test_commands.py +++ b/geotrek/core/tests/test_commands.py @@ -234,6 +234,16 @@ def test_load_paths_within_spatial_extent_no_srid_geom(self): @skipIf(not settings.TREKKING_TOPOLOGY_ENABLED, 'Test with dynamic segmentation only') class ReorderTopologiesPathAggregationTest(TestCase): + + def assertRecursiveAlmostEqual(self, a, b): + if type(a) is float: + assert type(b) is float + self.assertAlmostEqual(a, b) + else: + assert len(a) == len(b) + for i in range(len(a)): + self.assertRecursiveAlmostEqual(a[i], b[i]) + def setUp(self): """ ⠳ ⠞ @@ -299,25 +309,37 @@ def test_split_reorder_1(self): 🡥 3 ⠳ ⠳ """ topo = TopologyFactory.create(paths=[(self.path_1_a, 0, 1), (self.path_1_b, 0, 1)]) - self.assertEqual(LineString((700000, 6600000), (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700050, 6600050), (700100, 6600100), srid=settings.SRID), + topo.geom + ) PathFactory.create(geom=LineString(Point(700000, 6600090), Point(700090, 6600000), srid=settings.SRID)) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), + topo.geom + ) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 0, 1]) output = StringIO() call_command('reorder_topologies', stdout=output) self.assertEqual('1 topologies has beeen updated\n', output.getvalue()) geometries = self.get_geometries(topo) - self.assertEqual(geometries, [LineString((700000, 6600000), (700045, 6600045), srid=2154), - LineString((700045, 6600045), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700100, 6600100), srid=2154)]) + self.assertRecursiveAlmostEqual( + geometries, + [ + LineString((700000, 6600000), (700045, 6600045), srid=2154), + LineString((700045, 6600045), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700100, 6600100), srid=2154) + ] + ) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 1, 2]) topo.reload() - self.assertEqual( + self.assertRecursiveAlmostEqual( LineString((700000, 6600000), (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), - topo.geom) + topo.geom + ) def test_split_reorder_2(self): """ @@ -356,30 +378,45 @@ def test_split_reorder_2(self): (self.path_1_a, 0.5, 0.5), (self.path_1_a, 0.5, 1), (self.path_1_b, 0, 1)]) - self.assertEqual(LineString((700000, 6600000), (700047.5, 6600047.5), (700025, 6600025), - (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700047.5, 6600047.5), (700025, 6600025), (700050, 6600050), + (700100, 6600100), srid=settings.SRID), + topo.geom + ) PathFactory.create(geom=LineString(Point(700000, 6600090), Point(700090, 6600000), srid=settings.SRID)) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 0, 1, 2, 2, 3, 4, 4, 5]) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700045, 6600045), (700047.5, 6600047.5), (700045, 6600045), - (700025, 6600025), (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700045, 6600045), (700047.5, 6600047.5), (700045, 6600045), (700025, 6600025), + (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), + topo.geom + ) call_command('reorder_topologies', verbosity=0) geometries = self.get_geometries(topo) - self.assertEqual(geometries, [LineString((700000, 6600000), (700045, 6600045), srid=2154), - LineString((700045, 6600045), (700047.5, 6600047.5), srid=2154), - Point(700047.5, 6600047.5, srid=2154), - LineString((700047.5, 6600047.5), (700045, 6600045), srid=2154), - LineString((700045, 6600045), (700025, 6600025), srid=2154), - Point(700025, 6600025, srid=2154), - LineString((700025, 6600025), (700045, 6600045), srid=2154), - LineString((700045, 6600045), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700100, 6600100), srid=2154)]) + for geom, expected_geom in zip( + geometries, + [ + LineString((700000, 6600000), (700045, 6600045), srid=2154), + LineString((700045, 6600045), (700047.5, 6600047.5), srid=2154), + Point(700047.5, 6600047.5, srid=2154), + LineString((700047.5, 6600047.5), (700045, 6600045), srid=2154), + LineString((700045, 6600045), (700025, 6600025), srid=2154), + Point(700025, 6600025, srid=2154), + LineString((700025, 6600025), (700045, 6600045), srid=2154), + LineString((700045, 6600045), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700100, 6600100), srid=2154) + ] + ): + self.assertRecursiveAlmostEqual(geom, expected_geom) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 1, 2, 3, 4, 5, 6, 7, 8]) - self.assertEqual(LineString((700000, 6600000), (700045, 6600045), (700047.5, 6600047.5), (700045, 6600045), - (700025, 6600025), (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700045, 6600045), (700047.5, 6600047.5), (700045, 6600045), + (700025, 6600025), (700045, 6600045), (700050, 6600050), (700100, 6600100), srid=settings.SRID), + topo.geom + ) def test_split_reorder_3(self): """ @@ -417,39 +454,52 @@ def test_split_reorder_3(self): (self.path_2_a, 0.1, 0.1), (self.path_2_a, 0.1, 1), (self.path_1_b, 0, 1)]) - self.assertEqual(LineString((700000, 6600000), (700050, 6600050), (700005, 6600095), - (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700050, 6600050), (700005, 6600095), (700050, 6600050), + (700100, 6600100), srid=settings.SRID), + topo.geom + ) PathFactory.create(geom=LineString(Point(700070, 6600000), Point(700020, 6600050), Point(700060, 6600090), Point(700100, 6600050), srid=settings.SRID)) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), (700035, 6600065), - (700007.1428571428, 6600092.857142857), (700035, 6600065), - (700050, 6600050), (700075, 6600075), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), (700035, 6600065), + (700007.1428571428, 6600092.857142857), (700035, 6600065), (700050, 6600050), + (700075, 6600075), (700100, 6600100), srid=settings.SRID), + topo.geom + ) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 0, 1, 1, 2, 3, 3, 4, 4]) call_command('reorder_topologies', verbosity=0) geometries = self.get_geometries(topo) - self.assertEqual(geometries, [LineString((700000, 6600000), (700035, 6600035), srid=2154), - LineString((700035, 6600035), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700035, 6600065), srid=2154), - LineString((700035, 6600065), - (700007.142857143, 6600092.85714286), srid=2154), - Point(700007.142857143, 6600092.85714286, srid=2154), - LineString((700007.142857143, 6600092.85714286), (700035, 6600065), srid=2154), - LineString((700035, 6600065), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700075, 6600075), srid=2154), - LineString((700075, 6600075), (700100, 6600100), srid=2154)]) + for geom, expected_geom in zip( + geometries, + [ + LineString((700000, 6600000), (700035, 6600035), srid=2154), + LineString((700035, 6600035), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700035, 6600065), srid=2154), + LineString((700035, 6600065), (700007.142857143, 6600092.85714286), srid=2154), + Point(700007.142857143, 6600092.85714286, srid=2154), + LineString((700007.142857143, 6600092.85714286), (700035, 6600065), srid=2154), + LineString((700035, 6600065), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700075, 6600075), srid=2154), + LineString((700075, 6600075), (700100, 6600100), srid=2154) + ] + ): + self.assertRecursiveAlmostEqual(geom, expected_geom) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 1, 2, 3, 4, 5, 6, 7, 8]) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), (700035, 6600065), - (700007.1428571428, 6600092.857142857), (700035, 6600065), - (700050, 6600050), (700075, 6600075), (700100, 6600100), srid=settings.SRID), - topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), (700035, 6600065), + (700007.1428571428, 6600092.857142857), (700035, 6600065), (700050, 6600050), + (700075, 6600075), (700100, 6600100), srid=settings.SRID), + topo.geom + ) def test_split_reorder_4(self): """ @@ -487,35 +537,46 @@ def test_split_reorder_4(self): (self.path_2_a, 0.5, 0.5), (self.path_2_a, 0.5, 1), (self.path_1_b, 0, 1)]) - self.assertEqual(LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), - (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), (700050, 6600050), (700100, 6600100), srid=settings.SRID), + topo.geom + ) PathFactory.create(geom=LineString(Point(700070, 6600000), Point(700020, 6600050), Point(700060, 6600090), Point(700100, 6600050), srid=settings.SRID)) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), - (700035, 6600065), (700050, 6600050), (700075, 6600075), - (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), (700035, 6600065), (700050, 6600050), + (700075, 6600075), (700100, 6600100), srid=settings.SRID), + topo.geom + ) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 0, 1, 3, 4, 4]) call_command('reorder_topologies', verbosity=0) geometries = self.get_geometries(topo) - self.assertEqual(geometries, [LineString((700000, 6600000), (700035, 6600035), srid=2154), - LineString((700035, 6600035), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700035, 6600065), srid=2154), - LineString((700035, 6600065), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700075, 6600075), srid=2154), - LineString((700075, 6600075), (700100, 6600100), srid=2154)] - ) + for geom, expected_geom in zip( + geometries, + [ + LineString((700000, 6600000), (700035, 6600035), srid=2154), + LineString((700035, 6600035), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700035, 6600065), srid=2154), + LineString((700035, 6600065), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700075, 6600075), srid=2154), + LineString((700075, 6600075), (700100, 6600100), srid=2154) + ] + ): + self.assertRecursiveAlmostEqual(geom, expected_geom) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 1, 2, 3, 4, 5]) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), - (700035, 6600065), (700050, 6600050), (700075, 6600075), - (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700035, 6600035), (700050, 6600050), (700035, 6600065), (700050, 6600050), + (700075, 6600075), (700100, 6600100), srid=settings.SRID), + topo.geom + ) def test_split_reorder_5(self): """ @@ -553,36 +614,45 @@ def test_split_reorder_5(self): (self.path_2_a, 0.5, 0.5), (self.path_2_a, 0.5, 1), (self.path_1_b, 0, 1)]) - self.assertEqual(LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), - (700050, 6600050), (700100, 6600100), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), (700050, 6600050), (700100, 6600100), srid=settings.SRID), + topo.geom + ) self.path_1_b.geom = LineString(Point(700050, 6600050), Point(700100, 6600100), Point(700050, 6600100), Point(700000, 6600050), srid=settings.SRID) self.path_1_b.save() topo.reload() - self.assertEqual(LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), - (700050, 6600050), (700100, 6600100), (700050, 6600100), (700025, 6600075), - (700000, 6600050), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), (700050, 6600050), (700100, 6600100), + (700050, 6600100), (700025, 6600075), (700000, 6600050), srid=settings.SRID), + topo.geom + ) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 1, 1, 2, 2, 2, 3, 3, 4, 4]) # /!\ Duplicated Point call_command('reorder_topologies', verbosity=0) geometries = self.get_geometries(topo) - self.assertEqual(geometries, [LineString((700000, 6600000), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700025, 6600075), srid=2154), - Point(700025, 6600075, srid=2154), - LineString((700025, 6600075), (700050, 6600050), srid=2154), - LineString((700050, 6600050), (700100, 6600100), - (700050, 6600100), (700025, 6600075), srid=2154), - Point(700025, 6600075, srid=2154), - LineString((700025, 6600075), (700000, 6600050), srid=2154) - ] - ) + for geom, expected_geom in zip( + geometries, + [ + LineString((700000, 6600000), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700025, 6600075), srid=2154), + Point(700025, 6600075, srid=2154), + LineString((700025, 6600075), (700050, 6600050), srid=2154), + LineString((700050, 6600050), (700100, 6600100), (700050, 6600100), (700025, 6600075), srid=2154), + Point(700025, 6600075, srid=2154), + LineString((700025, 6600075), (700000, 6600050), srid=2154) + ] + ): + self.assertRecursiveAlmostEqual(geom, expected_geom) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 1, 2, 3, 4, 5, 6]) topo.reload() - self.assertEqual(LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), - (700050, 6600050), (700100, 6600100), (700050, 6600100), (700025, 6600075), - (700000, 6600050), srid=settings.SRID), topo.geom) + self.assertRecursiveAlmostEqual( + LineString((700000, 6600000), (700050, 6600050), (700025, 6600075), (700050, 6600050), (700100, 6600100), + (700050, 6600100), (700025, 6600075), (700000, 6600050), srid=settings.SRID), + topo.geom + ) def test_split_reorder_fail(self): """ @@ -610,17 +680,22 @@ def test_split_reorder_fail(self): (self.path_2_a, 0.5, 0.5), # (self.path_2_a, 0.5, 1), Doesn't exist in this test => MultiLinestring (self.path_1_b, 0, 1)]) - self.assertEqual(MultiLineString(LineString((700000, 6600000), (700050, 6600050)), - LineString((700050, 6600050), (700025, 6600075)), - LineString((700050, 6600050), (700100, 6600100)), - srid=settings.SRID), topo.geom) + expected = MultiLineString( + LineString((700000, 6600000), (700050, 6600050)), + LineString((700050, 6600050), (700025, 6600075)), + LineString((700050, 6600050), (700100, 6600100)), + srid=settings.SRID + ) + self.assertRecursiveAlmostEqual(expected, topo.geom) PathFactory.create(geom=LineString(Point(700000, 6600090), Point(700090, 6600000), srid=settings.SRID)) topo.reload() - self.assertEqual(MultiLineString(LineString((700000, 6600000), (700045, 6600045)), - LineString((700045, 6600045), (700050, 6600050)), - LineString((700050, 6600050), (700025, 6600075)), - LineString((700050, 6600050), (700100, 6600100)), - srid=settings.SRID), topo.geom) + expected = MultiLineString( + LineString((700000, 6600000), (700045, 6600045)), + LineString((700045, 6600045), (700050, 6600050)), + LineString((700050, 6600050), (700025, 6600075)), + LineString((700050, 6600050), (700100, 6600100)), + srid=settings.SRID) + self.assertRecursiveAlmostEqual(expected, topo.geom) self.assertEqual(list(PathAggregation.objects.filter(topo_object=topo).values_list('order', flat=True)), [0, 0, 1, 2, 3]) output = StringIO()