Subject: [PATCH] #23008
---
Index: test/unit/org/openstreetmap/josm/data/validation/tests/PowerLinesTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/PowerLinesTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/PowerLinesTest.java
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/PowerLinesTest.java	(revision 18839)
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/PowerLinesTest.java	(date 1695317935299)
@@ -1,10 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.validation.tests;
 
+import static org.junit.jupiter.api.Assertions.assertAll;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.util.ArrayList;
+
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
@@ -15,6 +21,9 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.TagMap;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.testutils.annotations.Projection;
 
@@ -129,4 +138,62 @@
                 new RelationMember("", TestUtils.newWay("", new Node(), new Node())));
         assertDoesNotThrow(() -> this.powerLines.visit(powerLine));
     }
+
+    @Test
+    void testOceanBad() {
+        final Way bottom = TestUtils.newWay("natural=coastline", new Node(new LatLon(0, 0)), new Node(new LatLon(0, 1)));
+        final Way top = TestUtils.newWay("natural=coastline", new Node(new LatLon(0.001, 1)), new Node(new LatLon(0.001, 0)));
+        final Way powerline = TestUtils.newWay("power=minor_line",
+                new Node(new LatLon(-0.00135, 0.5)),
+                new Node(new LatLon(-0.0013, 0.5)),
+                new Node(new LatLon(-0.00125, 0.5)),
+                new Node(new LatLon(0.00125, 0.5)),
+                new Node(new LatLon(0.0013, 0.5)),
+                new Node(new LatLon(0.00135, 0.5)));
+        ds.addPrimitiveRecursive(top);
+        ds.addPrimitiveRecursive(bottom);
+        ds.addPrimitiveRecursive(powerline);
+        for (Node node : powerline.getNodes()) {
+            node.put("power", "pole");
+        }
+
+        this.powerLines.startTest(NullProgressMonitor.INSTANCE);
+        this.powerLines.visit(new ArrayList<>(ds.getWays()));
+        this.powerLines.endTest();
+        assertEquals(1, this.powerLines.getErrors().size());
+        final TestError testError = this.powerLines.getErrors().get(0);
+        assertAll(() -> assertEquals("Possibly missing line support node within power line", testError.getMessage()),
+                () -> assertEquals(2, testError.getPrimitives().size()),
+                () -> assertTrue(testError.getPrimitives().contains(powerline.getNode(2))),
+                () -> assertTrue(testError.getPrimitives().contains(powerline.getNode(3))),
+                () -> assertEquals(1, testError.getHighlighted().size()));
+        final WaySegment segment = assertInstanceOf(WaySegment.class, testError.getHighlighted().iterator().next());
+        assertAll(() -> assertSame(powerline, segment.getWay()),
+                () -> assertEquals(2, segment.getLowerIndex()),
+                () -> assertEquals(3, segment.getUpperIndex()));
+    }
+
+    @Test
+    void testOceanGood() {
+        final Way bottom = TestUtils.newWay("natural=coastline", new Node(new LatLon(0, 0)), new Node(new LatLon(0, 1)));
+        final Way top = TestUtils.newWay("natural=coastline", new Node(new LatLon(0.001, 1)), new Node(new LatLon(0.001, 0)));
+        final Way powerline = TestUtils.newWay("power=minor_line",
+                new Node(new LatLon(-0.003, 0.5)),
+                new Node(new LatLon(-0.002, 0.5)),
+                new Node(new LatLon(-0.001, 0.5)),
+                new Node(new LatLon(0.001, 0.5)),
+                new Node(new LatLon(0.002, 0.5)),
+                new Node(new LatLon(0.003, 0.5)));
+        ds.addPrimitiveRecursive(top);
+        ds.addPrimitiveRecursive(bottom);
+        ds.addPrimitiveRecursive(powerline);
+        for (Node node : powerline.getNodes()) {
+            node.put("power", "pole");
+        }
+
+        this.powerLines.startTest(NullProgressMonitor.INSTANCE);
+        this.powerLines.visit(new ArrayList<>(ds.getWays()));
+        this.powerLines.endTest();
+        assertTrue(this.powerLines.getErrors().isEmpty());
+    }
 }
