91 lines
3.1 KiB
Dart
91 lines
3.1 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:flutter_map/flutter_map.dart';
|
||
import 'package:flutter_test/flutter_test.dart';
|
||
import 'package:latlong2/latlong.dart';
|
||
import 'package:maibu_satabot_v2/features/v2/device_list/presentation/widgets/obstacle_resize_layer.dart';
|
||
|
||
void main() {
|
||
testWidgets('map handles change only the dragged sides of an obstacle', (
|
||
tester,
|
||
) async {
|
||
const center = LatLng(31, 120);
|
||
final controller = MapController();
|
||
addTearDown(controller.dispose);
|
||
var corners = const [
|
||
LatLng(30.999991, 119.999990),
|
||
LatLng(30.999991, 120.000010),
|
||
LatLng(31.000009, 120.000010),
|
||
LatLng(31.000009, 119.999990),
|
||
];
|
||
await tester.pumpWidget(
|
||
MaterialApp(
|
||
home: StatefulBuilder(
|
||
builder: (context, setState) => FlutterMap(
|
||
mapController: controller,
|
||
options: const MapOptions(initialCenter: center, initialZoom: 22),
|
||
children: [
|
||
ObstacleResizeLayer(
|
||
corners: corners,
|
||
dimensions: '2 m × 2 m',
|
||
onChanged: (value) => setState(() => corners = value),
|
||
),
|
||
],
|
||
),
|
||
),
|
||
),
|
||
);
|
||
await tester.pumpAndSettle();
|
||
|
||
LatLngBounds bounds() => LatLngBounds.fromPoints(corners);
|
||
Future<void> drag(Alignment handle, Offset offset) async {
|
||
final handleCenter = tester.getCenter(find.byKey(ValueKey(handle)));
|
||
final gesture = await tester.startGesture(handleCenter);
|
||
for (var step = 0; step < 6; step++) {
|
||
await gesture.moveBy(offset / 6);
|
||
await tester.pump();
|
||
}
|
||
await gesture.up();
|
||
await tester.pumpAndSettle();
|
||
}
|
||
|
||
final initial = bounds();
|
||
await drag(Alignment.centerRight, const Offset(55, 20));
|
||
final wider = bounds();
|
||
expect(
|
||
wider.east,
|
||
greaterThan(initial.east),
|
||
reason: 'camera ${controller.camera.center}',
|
||
);
|
||
expect(wider.west, initial.west);
|
||
expect(wider.north, initial.north);
|
||
expect(wider.south, initial.south);
|
||
|
||
await drag(Alignment.topCenter, const Offset(20, -50));
|
||
final taller = bounds();
|
||
expect(taller.north, greaterThan(wider.north));
|
||
expect(taller.south, wider.south);
|
||
expect(taller.west, wider.west);
|
||
expect(taller.east, wider.east);
|
||
|
||
await drag(Alignment.bottomLeft, const Offset(-45, 45));
|
||
final larger = bounds();
|
||
expect(larger.west, lessThan(taller.west));
|
||
expect(larger.south, lessThan(taller.south));
|
||
expect(larger.east, taller.east);
|
||
expect(larger.north, taller.north);
|
||
|
||
await drag(Alignment.centerRight, const Offset(-280, 0));
|
||
final smallest = bounds();
|
||
expect(smallest.east, greaterThan(smallest.west));
|
||
expect(smallest.west, larger.west);
|
||
expect(smallest.east, lessThan(larger.east));
|
||
expect(controller.camera.center, center);
|
||
|
||
await tester.dragFrom(const Offset(100, 100), const Offset(80, 0));
|
||
await tester.pumpAndSettle();
|
||
expect(controller.camera.center, isNot(center));
|
||
expect(bounds().east, smallest.east);
|
||
expect(tester.takeException(), isNull);
|
||
});
|
||
}
|