Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add key to Polyline, CircleMarker + Test utilities #1403

Merged
merged 8 commits into from
Nov 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/src/layer/circle_layer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:flutter_map/src/map/flutter_map_state.dart';
import 'package:latlong2/latlong.dart' hide Path;

class CircleMarker {
final Key? key;
final LatLng point;
final double radius;
final Color color;
Expand All @@ -11,9 +12,11 @@ class CircleMarker {
final bool useRadiusInMeter;
Offset offset = Offset.zero;
double realRadius = 0;

CircleMarker({
required this.point,
required this.radius,
this.key,
this.useRadiusInMeter = false,
this.color = const Color(0xFF00FF00),
this.borderStrokeWidth = 0.0,
Expand Down Expand Up @@ -46,6 +49,7 @@ class CircleLayer extends StatelessWidget {

circleWidgets.add(
CustomPaint(
key: circle.key,
painter: CirclePainter(circle),
size: size,
),
Expand Down
20 changes: 14 additions & 6 deletions lib/src/layer/polyline_layer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:flutter_map/src/map/flutter_map_state.dart';
import 'package:latlong2/latlong.dart';

class Polyline {
final Key? key;
final List<LatLng> points;
final List<Offset> offsets = [];
final double strokeWidth;
Expand All @@ -22,6 +23,7 @@ class Polyline {

Polyline({
required this.points,
this.key,
this.strokeWidth = 1.0,
this.color = const Color(0xFF00FF00),
this.borderStrokeWidth = 0.0,
Expand Down Expand Up @@ -82,10 +84,13 @@ class PolylineLayer extends StatelessWidget {

_fillOffsets(polylineOpt.offsets, polylineOpt.points, map);

polylineWidgets.add(CustomPaint(
painter: PolylinePainter(polylineOpt, saveLayers),
size: size,
));
polylineWidgets.add(
CustomPaint(
key: polylineOpt.key,
painter: PolylinePainter(polylineOpt, saveLayers),
size: size,
),
);
}

return Stack(
Expand All @@ -95,8 +100,11 @@ class PolylineLayer extends StatelessWidget {
);
}

void _fillOffsets(final List<Offset> offsets, final List<LatLng> points,
FlutterMapState map) {
void _fillOffsets(
final List<Offset> offsets,
final List<LatLng> points,
FlutterMapState map,
) {
final len = points.length;
for (var i = 0; i < len; ++i) {
final point = points[i];
Expand Down
5 changes: 3 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
name: flutter_map
description: A versatile mapping package for Flutter, based off leaflet.js, that's simple and easy to learn, yet completely customizable and configurable.
description: A versatile mapping package for Flutter, based off leaflet.js,
that's simple and easy to learn, yet completely customizable and configurable.
version: 3.0.0
repository: https://github.com/fleaflet/flutter_map
issue_tracker: https://github.com/fleaflet/flutter_map/issues
Expand Down Expand Up @@ -27,5 +28,5 @@ dev_dependencies:
flutter_lints: ^2.0.1
flutter_test:
sdk: flutter
mockito: ^5.3.0
mocktail: ^0.3.0
test: ^1.21.4
34 changes: 5 additions & 29 deletions test/flutter_map_controller_test.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
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 'test_utils/mocks.dart';
import 'test_utils/test_app.dart';

void main() {
setupMocks();

testWidgets('test fit bounds methods', (tester) async {
final controller = MapController();
final bounds = LatLngBounds(
Expand Down Expand Up @@ -115,31 +119,3 @@ void main() {
}
});
}

class TestApp extends StatelessWidget {
final MapController controller;

const TestApp({
required this.controller,
Key? key,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
// ensure that map is always of the same size
child: SizedBox(
width: 200,
height: 200,
child: FlutterMap(
mapController: controller,
options: MapOptions(),
),
),
),
),
);
}
}
129 changes: 20 additions & 109 deletions test/flutter_map_test.dart
Original file line number Diff line number Diff line change
@@ -1,124 +1,35 @@
import 'dart:async';
import 'dart:io';

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:mockito/mockito.dart';

class MockHttpClientResponse extends Mock implements HttpClientResponse {
final _stream = readFile();

@override
int get statusCode => HttpStatus.ok;

@override
int get contentLength => File('test/res/map.png').lengthSync();

@override
HttpClientResponseCompressionState get compressionState =>
HttpClientResponseCompressionState.notCompressed;

@override
StreamSubscription<List<int>> listen(void Function(List<int> event)? onData,
{Function? onError, void Function()? onDone, bool? cancelOnError}) {
return _stream.listen(
onData,
onError: onError,
onDone: onDone,
cancelOnError: cancelOnError,
);
}

static Stream<List<int>> readFile() => File('test/res/map.png').openRead();
}

class MockHttpHeaders extends Mock implements HttpHeaders {}

class MockHttpClientRequest extends Mock implements HttpClientRequest {
@override
HttpHeaders get headers => MockHttpHeaders();

@override
Future<HttpClientResponse> close() => Future.value(MockHttpClientResponse());
}

class MockClient extends Mock implements HttpClient {
@override
Future<HttpClientRequest> getUrl(Uri url) {
return Future.value(MockHttpClientRequest());
}
}

class MockHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? securityContext) => MockClient();
}
import 'test_utils/mocks.dart';
import 'test_utils/test_app.dart';

void main() {
setupMocks();

testWidgets('flutter_map', (tester) async {
HttpOverrides.global = MockHttpOverrides();
await tester.pumpWidget(const TestApp());
final markers = <Marker>[
Marker(
width: 80,
height: 80,
point: LatLng(45.5231, -122.6765),
builder: (_) => const FlutterLogo(),
),
Marker(
width: 80,
height: 80,
point: LatLng(40, -120), // not visible
builder: (_) => const FlutterLogo(),
),
];

await tester.pumpWidget(TestApp(markers: markers));
expect(find.byType(FlutterMap), findsOneWidget);
expect(find.byType(TileLayer), findsOneWidget);
expect(find.byType(RawImage), findsWidgets);
expect(find.byType(MarkerLayer), findsWidgets);
expect(find.byType(FlutterLogo), findsOneWidget);
});
}

class TestApp extends StatefulWidget {
const TestApp({Key? key}) : super(key: key);

@override
State<TestApp> createState() => _TestAppState();
}

class _TestAppState extends State<TestApp> {
final List<Marker> _markers = <Marker>[
Marker(
width: 80,
height: 80,
point: LatLng(45.5231, -122.6765),
builder: (ctx) => const FlutterLogo(),
),
Marker(
width: 80,
height: 80,
point: LatLng(40, -120), // not visible
builder: (ctx) => const FlutterLogo(),
),
];

@override
void initState() {
super.initState();
}

@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: SizedBox(
width: 200,
height: 200,
child: FlutterMap(
options: MapOptions(
center: LatLng(45.5231, -122.6765),
zoom: 13,
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
),
MarkerLayer(markers: _markers),
],
),
),
),
),
);
}
}
31 changes: 31 additions & 0 deletions test/layer/circle_layer_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
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 '../test_utils/mocks.dart';
import '../test_utils/test_app.dart';

void main() {
setupMocks();

testWidgets('test circle marker key', (tester) async {
const key = Key('c-1');

final circles = <CircleMarker>[
CircleMarker(
key: key,
point: LatLng(51.5, -0.09),
color: Colors.blue.withOpacity(0.7),
borderStrokeWidth: 2,
useRadiusInMeter: true,
radius: 2000,
),
];

await tester.pumpWidget(TestApp(circles: circles));
expect(find.byType(FlutterMap), findsOneWidget);
expect(find.byType(CircleLayer), findsWidgets);
expect(find.byKey(key), findsOneWidget);
});
}
30 changes: 30 additions & 0 deletions test/layer/marker_layer_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
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 '../test_utils/mocks.dart';
import '../test_utils/test_app.dart';

void main() {
setupMocks();

testWidgets('test marker key', (tester) async {
const key = Key('m-1');

final markers = <Marker>[
Marker(
key: key,
width: 80,
height: 80,
point: LatLng(45.5231, -122.6765),
builder: (_) => const FlutterLogo(),
),
];

await tester.pumpWidget(TestApp(markers: markers));
expect(find.byType(FlutterMap), findsOneWidget);
expect(find.byType(MarkerLayer), findsWidgets);
expect(find.byKey(key), findsOneWidget);
});
}
35 changes: 35 additions & 0 deletions test/layer/polygon_layer_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
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 '../test_utils/mocks.dart';
import '../test_utils/test_app.dart';

void main() {
setupMocks();

testWidgets('test polygon key', (tester) async {
final filledPoints = <LatLng>[
LatLng(55.5, -0.09),
LatLng(54.3498, -6.2603),
LatLng(52.8566, 2.3522),
];

const key = Key('p-1');

final polygon = Polygon(
key: key,
points: filledPoints,
isFilled: true,
color: Colors.purple,
borderColor: Colors.purple,
borderStrokeWidth: 4,
);

await tester.pumpWidget(TestApp(polygons: [polygon]));
expect(find.byType(FlutterMap), findsOneWidget);
expect(find.byType(PolygonLayer), findsOneWidget);
expect(find.byKey(key), findsOneWidget);
});
}
Loading