@@ -842,4 +842,207 @@ class MapControllerTest {
842842 // Second position should match target exactly (no padding)
843843 assertEquals(targetLatLng.latitude, position2.target.latitude, 0.0001 )
844844 }
845+
846+ @Test
847+ fun testSetLatLngBoundsForCameraTarget_GetterReturnsSetValue () {
848+ val bounds = LatLngBounds (LatLng (- 35.0 , 138.58 ), LatLng (- 34.9 , 138.61 ))
849+ controller.setLatLngBoundsForCameraTarget(bounds)
850+ assertEquals(bounds, controller.getLatLngBoundsForCameraTarget())
851+ }
852+
853+ @Test
854+ fun testSetLatLngBoundsForCameraTarget_NullRemovesConstraint () {
855+ val bounds = LatLngBounds (LatLng (- 35.0 , 138.58 ), LatLng (- 34.9 , 138.61 ))
856+ controller.setLatLngBoundsForCameraTarget(bounds)
857+ controller.setLatLngBoundsForCameraTarget(null )
858+ assertNull(controller.getLatLngBoundsForCameraTarget())
859+ }
860+
861+ @Test
862+ fun testSetLatLngBoundsForCameraTarget_ClampsCameraIfOutsideBounds () {
863+ // Set camera far from bounds
864+ controller.setCenter(LatLng (0.0 , 0.0 ))
865+
866+ // Set bounds
867+ val bounds = LatLngBounds (LatLng (- 35.0 , 138.58 ), LatLng (- 34.9 , 138.61 ))
868+ controller.setLatLngBoundsForCameraTarget(bounds)
869+
870+ // Camera should be clamped to nearest point in bounds
871+ val center = controller.getCenter()
872+ assertTrue(center.latitude >= bounds.southwest.latitude)
873+ assertTrue(center.latitude <= bounds.northeast.latitude)
874+ assertTrue(center.longitude >= bounds.southwest.longitude)
875+ assertTrue(center.longitude <= bounds.northeast.longitude)
876+ }
877+
878+ @Test
879+ fun testSetLatLngBoundsForCameraTarget_ConstrainsSetCenter () {
880+ val bounds = LatLngBounds (LatLng (- 35.0 , 138.58 ), LatLng (- 34.9 , 138.61 ))
881+ controller.setLatLngBoundsForCameraTarget(bounds)
882+
883+ // Try to set center outside bounds
884+ controller.setCenter(LatLng (0.0 , 0.0 ))
885+
886+ // Center should be clamped
887+ val center = controller.getCenter()
888+ assertTrue(center.latitude >= bounds.southwest.latitude)
889+ assertTrue(center.latitude <= bounds.northeast.latitude)
890+ assertTrue(center.longitude >= bounds.southwest.longitude)
891+ assertTrue(center.longitude <= bounds.northeast.longitude)
892+ }
893+
894+ @Test
895+ fun testSetLatLngBoundsForCameraTarget_ConstrainsMoveCamera () {
896+ val bounds = LatLngBounds (LatLng (- 35.0 , 138.58 ), LatLng (- 34.9 , 138.61 ))
897+ controller.setLatLngBoundsForCameraTarget(bounds)
898+
899+ // Try to move camera outside bounds
900+ val outsideLocation = LatLng (0.0 , 0.0 )
901+ controller.moveCamera(CameraUpdateFactory .newLatLng(outsideLocation))
902+
903+ // Center should be clamped
904+ val center = controller.getCenter()
905+ assertTrue(center.latitude >= bounds.southwest.latitude)
906+ assertTrue(center.latitude <= bounds.northeast.latitude)
907+ assertTrue(center.longitude >= bounds.southwest.longitude)
908+ assertTrue(center.longitude <= bounds.northeast.longitude)
909+ }
910+
911+ @Test
912+ fun testSetLatLngBoundsForCameraTarget_AllowsMovementWithinBounds () {
913+ val bounds = LatLngBounds (LatLng (- 35.0 , 138.58 ), LatLng (- 34.9 , 138.61 ))
914+ controller.setLatLngBoundsForCameraTarget(bounds)
915+
916+ // Move to center of bounds
917+ val centerOfBounds = bounds.getCenter()
918+ controller.setCenter(centerOfBounds)
919+
920+ assertEquals(centerOfBounds.latitude, controller.getCenter().latitude, 0.0001 )
921+ assertEquals(centerOfBounds.longitude, controller.getCenter().longitude, 0.0001 )
922+ }
923+
924+ @Test
925+ fun testSetLatLngBoundsForCameraTarget_ClampsToSouthwestCorner () {
926+ val bounds = LatLngBounds (LatLng (10.0 , 20.0 ), LatLng (30.0 , 40.0 ))
927+ controller.setLatLngBoundsForCameraTarget(bounds)
928+
929+ // Try to move far southwest of bounds
930+ controller.setCenter(LatLng (- 50.0 , - 50.0 ))
931+
932+ // Should clamp to southwest corner
933+ val center = controller.getCenter()
934+ assertEquals(10.0 , center.latitude, 0.0001 )
935+ assertEquals(20.0 , center.longitude, 0.0001 )
936+ }
937+
938+ @Test
939+ fun testSetLatLngBoundsForCameraTarget_ClampsToNortheastCorner () {
940+ val bounds = LatLngBounds (LatLng (10.0 , 20.0 ), LatLng (30.0 , 40.0 ))
941+ controller.setLatLngBoundsForCameraTarget(bounds)
942+
943+ // Try to move far northeast of bounds
944+ controller.setCenter(LatLng (80.0 , 90.0 ))
945+
946+ // Should clamp to northeast corner
947+ val center = controller.getCenter()
948+ assertEquals(30.0 , center.latitude, 0.0001 )
949+ assertEquals(40.0 , center.longitude, 0.0001 )
950+ }
951+
952+ @Test
953+ fun testSetLatLngBoundsForCameraTarget_ClampsLatitudeOnly () {
954+ val bounds = LatLngBounds (LatLng (10.0 , 20.0 ), LatLng (30.0 , 40.0 ))
955+ controller.setLatLngBoundsForCameraTarget(bounds)
956+
957+ // Set position with valid longitude but invalid latitude
958+ controller.setCenter(LatLng (50.0 , 30.0 ))
959+
960+ val center = controller.getCenter()
961+ assertEquals(30.0 , center.latitude, 0.0001 ) // Clamped
962+ assertEquals(30.0 , center.longitude, 0.0001 ) // Unchanged
963+ }
964+
965+ @Test
966+ fun testSetLatLngBoundsForCameraTarget_ClampsLongitudeOnly () {
967+ val bounds = LatLngBounds (LatLng (10.0 , 20.0 ), LatLng (30.0 , 40.0 ))
968+ controller.setLatLngBoundsForCameraTarget(bounds)
969+
970+ // Set position with valid latitude but invalid longitude
971+ controller.setCenter(LatLng (20.0 , 50.0 ))
972+
973+ val center = controller.getCenter()
974+ assertEquals(20.0 , center.latitude, 0.0001 ) // Unchanged
975+ assertEquals(40.0 , center.longitude, 0.0001 ) // Clamped
976+ }
977+
978+ @Test
979+ fun testSetLatLngBoundsForCameraTarget_WorksWithVerySmallBounds () {
980+ // Create very small bounds (0.01 x 0.01 degrees)
981+ val bounds = LatLngBounds (LatLng (51.5 , - 0.1 ), LatLng (51.51 , - 0.09 ))
982+ controller.setLatLngBoundsForCameraTarget(bounds)
983+
984+ // Try to move outside
985+ controller.setCenter(LatLng (40.0 , 10.0 ))
986+
987+ // Should still clamp
988+ val center = controller.getCenter()
989+ assertTrue(center.latitude >= bounds.southwest.latitude)
990+ assertTrue(center.latitude <= bounds.northeast.latitude)
991+ assertTrue(center.longitude >= bounds.southwest.longitude)
992+ assertTrue(center.longitude <= bounds.northeast.longitude)
993+ }
994+
995+ @Test
996+ fun testSetLatLngBoundsForCameraTarget_NullAllowsFreeMovement () {
997+ // Set bounds, then remove them
998+ val bounds = LatLngBounds (LatLng (10.0 , 20.0 ), LatLng (30.0 , 40.0 ))
999+ controller.setLatLngBoundsForCameraTarget(bounds)
1000+ controller.setLatLngBoundsForCameraTarget(null )
1001+
1002+ // Should be able to move anywhere
1003+ val targetLocation = LatLng (0.0 , 0.0 )
1004+ controller.setCenter(targetLocation)
1005+
1006+ assertEquals(targetLocation.latitude, controller.getCenter().latitude, 0.0001 )
1007+ assertEquals(targetLocation.longitude, controller.getCenter().longitude, 0.0001 )
1008+ }
1009+
1010+ @Test
1011+ fun testSetLatLngBoundsForCameraTarget_WorksAtEquator () {
1012+ val bounds = LatLngBounds (LatLng (- 1.0 , - 1.0 ), LatLng (1.0 , 1.0 ))
1013+ controller.setLatLngBoundsForCameraTarget(bounds)
1014+
1015+ controller.setCenter(LatLng (0.0 , 0.0 ))
1016+ assertEquals(0.0 , controller.getCenter().latitude, 0.0001 )
1017+ assertEquals(0.0 , controller.getCenter().longitude, 0.0001 )
1018+ }
1019+
1020+ @Test
1021+ fun testSetLatLngBoundsForCameraTarget_WorksAtPrimeMeridian () {
1022+ val bounds = LatLngBounds (LatLng (50.0 , - 1.0 ), LatLng (52.0 , 1.0 ))
1023+ controller.setLatLngBoundsForCameraTarget(bounds)
1024+
1025+ controller.setCenter(LatLng (51.0 , 0.0 ))
1026+ assertEquals(51.0 , controller.getCenter().latitude, 0.0001 )
1027+ assertEquals(0.0 , controller.getCenter().longitude, 0.0001 )
1028+ }
1029+
1030+ @Test
1031+ fun testSetLatLngBoundsForCameraTarget_HandlesBoundsUpdate () {
1032+ // Set initial bounds
1033+ val bounds1 = LatLngBounds (LatLng (10.0 , 20.0 ), LatLng (30.0 , 40.0 ))
1034+ controller.setLatLngBoundsForCameraTarget(bounds1)
1035+ controller.setCenter(LatLng (20.0 , 30.0 ))
1036+
1037+ // Update to different bounds
1038+ val bounds2 = LatLngBounds (LatLng (50.0 , 60.0 ), LatLng (70.0 , 80.0 ))
1039+ controller.setLatLngBoundsForCameraTarget(bounds2)
1040+
1041+ // Camera should be clamped to new bounds
1042+ val center = controller.getCenter()
1043+ assertTrue(center.latitude >= bounds2.southwest.latitude)
1044+ assertTrue(center.latitude <= bounds2.northeast.latitude)
1045+ assertTrue(center.longitude >= bounds2.southwest.longitude)
1046+ assertTrue(center.longitude <= bounds2.northeast.longitude)
1047+ }
8451048}
0 commit comments