@@ -620,6 +620,45 @@ class DrawAreaTaskViewModelTest : BaseHiltTest() {
620620 assertThat(viewModel.isMarkedComplete()).isTrue()
621621 }
622622
623+ @Test
624+ fun `onButtonClick ADD_POINT removes last vertex and resets hasSelfIntersection if it causes self-intersection` () =
625+ runWithTestDispatcher {
626+ setupViewModel()
627+ // Create a non-intersecting path: (0,0) -> (10,10) -> (0,10)
628+ updateLastVertexAndAdd(COORDINATE_1 )
629+ updateLastVertexAndAdd(COORDINATE_2 )
630+ updateLastVertexAndAdd(COORDINATE_6 )
631+
632+ // Move cursor to a point that crosses the first segment: (10,0)
633+ updateLastVertex(COORDINATE_5 )
634+
635+ viewModel.onButtonClick(ButtonAction .ADD_POINT )
636+ advanceUntilIdle()
637+
638+ // The intersecting vertex (10,0) should be dropped.
639+ // Result: 3 fixed vertices + 1 temp cursor vertex = 4 total in geometry
640+ assertGeometry(4 , isLineString = true )
641+ assertThat(viewModel.hasSelfIntersection).isFalse()
642+ }
643+
644+ @Test
645+ fun `onButtonClick COMPLETE does not mark complete if it causes self-intersection` () =
646+ runWithTestDispatcher {
647+ setupViewModel()
648+ // Create a path that will intersect when closed: (0,0) -> (10,0) -> (0,10) -> (10,10)
649+ updateLastVertexAndAdd(COORDINATE_1 )
650+ updateLastVertexAndAdd(COORDINATE_5 )
651+ updateLastVertexAndAdd(COORDINATE_6 )
652+ updateLastVertex(COORDINATE_2 )
653+
654+ viewModel.onButtonClick(ButtonAction .COMPLETE )
655+ advanceUntilIdle()
656+
657+ // Completion should fail and flag should be true
658+ assertThat(viewModel.isMarkedComplete()).isFalse()
659+ assertThat(viewModel.hasSelfIntersection).isTrue()
660+ }
661+
623662 private fun assertGeometry (
624663 expectedVerticesCount : Int ,
625664 isLineString : Boolean = false,
@@ -679,6 +718,8 @@ class DrawAreaTaskViewModelTest : BaseHiltTest() {
679718 private val COORDINATE_2 = Coordinates (10.0 , 10.0 )
680719 private val COORDINATE_3 = Coordinates (20.0 , 20.0 )
681720 private val COORDINATE_4 = Coordinates (30.0 , 30.0 )
721+ private val COORDINATE_5 = Coordinates (10.0 , 0.0 )
722+ private val COORDINATE_6 = Coordinates (0.0 , 10.0 )
682723
683724 private val TASK =
684725 Task (
0 commit comments