Skip to content
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
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ jobs:
# run: |
# flutter drive \
# --driver=test_driver/integration_test.dart \
# --target=integration_test/smoke_test.dart \
# --target=integration_test/main.dart \
# -d web-server \
# --release \
# --browser-name=chrome
Expand Down
3 changes: 2 additions & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,10 @@ android {
}

dependencies {
// noinspection GradleDynamicVersion
implementation 'org.maplibre.gl:android-sdk:11.6.+' // JNIGEN
// JNIGEN implementation project(":MapLibreAndroid")
// JNIGEN implementation 'com.google.code.gson:gson:2.11.0'
implementation 'org.maplibre.gl:android-sdk:11.6.0' // JNIGEN
// JNIGEN implementation 'org.maplibre.gl:maplibre-android-gestures:0.0.3'
// JNIGEN implementation 'org.maplibre.gl:android-sdk-geojson:6.0.1'
// JNIGEN implementation 'org.maplibre.gl:android-sdk-turf:6.0.1'
Expand Down
4 changes: 2 additions & 2 deletions codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ comment:

ignore:
- "**/*.g.dart"
- "lib/src/platform/android/jni"
- "example"
- "lib/src/platform/android/jni/**"
- "example/**"
3 changes: 1 addition & 2 deletions jnigen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ maven_downloads:
preamble: |
// Autogenerated by jnigen. DO NOT EDIT!

// coverage:ignore-file
// ignore_for_file: public_member_api_docs
// ignore_for_file: require_trailing_commas
// ignore_for_file: unnecessary_raw_strings
Expand All @@ -24,7 +23,7 @@ android_sdk_config:
suspend_fun_to_async: true
output:
dart:
path: 'lib/src/native/jni/'
path: 'lib/src/platform/android/jni/'
source_path:
- 'android/src/main'
classes:
Expand Down
4 changes: 2 additions & 2 deletions lib/src/annotation/circle_annotation_layer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ class CircleAnnotationLayer extends AnnotationLayer<Point> {
'circle-radius': radius,
'circle-color': color.toHexStringNoOpacity(),
'circle-blur': blur,
'circle-opacity': color.opacity,
'circle-opacity': opacity,
'circle-stroke-width': strokeWidth,
'circle-stroke-color': strokeColor.toHexStringNoOpacity(),
'circle-stroke-opacity': strokeColor.opacity,
'circle-stroke-opacity': strokeOpacity,
};

@override
Expand Down
2 changes: 1 addition & 1 deletion lib/src/annotation/polygon_annotation_layer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class PolygonAnnotationLayer extends AnnotationLayer<Polygon> {
@override
Map<String, Object> getPaint() => {
'fill-color': color.toHexStringNoOpacity(),
'fill-opacity': color.opacity,
'fill-opacity': opacity,
'fill-outline-color': outlineColor.toHexStringNoOpacity(),
};

Expand Down
2 changes: 1 addition & 1 deletion lib/src/annotation/polyline_annotation_layer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class PolylineAnnotationLayer extends AnnotationLayer<LineString> {
@override
Map<String, Object> getPaint() => {
'line-color': color.toHexStringNoOpacity(),
'line-opacity': color.opacity,
'line-opacity': opacity,
'line-width': width,
'line-gap-width': gapWidth,
if (dashArray case final List<int> dashArray)
Expand Down
8 changes: 4 additions & 4 deletions lib/src/map_options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ class MapOptions {

/// Find the [MapOptions] of the closest [MapLibreMap] in the widget tree.
/// Returns null if called outside of the [MapLibreMap.children].
static MapController? maybeOf(BuildContext context) =>
MapLibreInheritedModel.maybeMapControllerOf(context);
static MapOptions? maybeOf(BuildContext context) =>
MapLibreInheritedModel.maybeMapControllerOf(context)?.options;

/// Find the [MapOptions] of the closest [MapLibreMap] in the widget tree.
/// Throws an [StateError] if called outside of the [MapLibreMap.children].
static MapController of(BuildContext context) =>
static MapOptions of(BuildContext context) =>
maybeOf(context) ??
(throw StateError('Unable to find an instance of MapController'));
(throw StateError('Unable to find an instance of MapOptions'));

/// The style URL that should get used. If not set, the default MapLibre style
/// is used (https://demotiles.maplibre.org/style.json).
Expand Down
2 changes: 1 addition & 1 deletion test/annotation/annotation_manager_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:maplibre/maplibre.dart';
import 'package:maplibre/src/annotation/annotation_manager.dart';
import 'package:mocktail/mocktail.dart';

import '../shared/ui_app.dart';
import '../shared/mocks.dart';

class MockSource extends Mock implements Source {}

Expand Down
20 changes: 20 additions & 0 deletions test/annotation/models_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@ void main() {
expect(o, isNot(equals(o2)));
expect(o.hashCode, equals(o.hashCode));
expect(o.hashCode, isNot(equals(o2.hashCode)));

expect(o.getSourceId(5123), contains(5123.toString()));
expect(o.getLayerId(1532), contains(1532.toString()));
expect(o.getLayout(), isA<Map<String, Object>>());
expect(o.getPaint(), isA<Map<String, Object>>());
});
test('MarkerAnnotationLayer', () {
final o = MarkerAnnotationLayer(
Expand All @@ -48,6 +53,11 @@ void main() {
expect(o, isNot(equals(o2)));
expect(o.hashCode, equals(o.hashCode));
expect(o.hashCode, isNot(equals(o2.hashCode)));

expect(o.getSourceId(5123), contains(5123.toString()));
expect(o.getLayerId(1532), contains(1532.toString()));
expect(o.getLayout(), isA<Map<String, Object>>());
expect(o.getPaint(), isA<Map<String, Object>>());
});
test('PolygonAnnotationLayer', () {
final o = PolygonAnnotationLayer(
Expand All @@ -74,6 +84,11 @@ void main() {
expect(o, isNot(equals(o2)));
expect(o.hashCode, equals(o.hashCode));
expect(o.hashCode, isNot(equals(o2.hashCode)));

expect(o.getSourceId(5123), contains(5123.toString()));
expect(o.getLayerId(1532), contains(1532.toString()));
expect(o.getLayout(), isA<Map<String, Object>>());
expect(o.getPaint(), isA<Map<String, Object>>());
});
test('PolylineAnnotationLayer', () {
final o = PolylineAnnotationLayer(
Expand Down Expand Up @@ -103,6 +118,11 @@ void main() {
expect(o, isNot(equals(o2)));
expect(o.hashCode, equals(o.hashCode));
expect(o.hashCode, isNot(equals(o2.hashCode)));

expect(o.getSourceId(5123), contains(5123.toString()));
expect(o.getLayerId(1532), contains(1532.toString()));
expect(o.getLayout(), isA<Map<String, Object>>());
expect(o.getPaint(), isA<Map<String, Object>>());
});
});
}
74 changes: 74 additions & 0 deletions test/dependency_injection.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:maplibre/maplibre.dart';
import 'package:mocktail/mocktail.dart';

import 'shared/mocks.dart';
import 'shared/ui_app.dart';

void main() {
group('Dependency Injection', () {
testWidgets('MapController', (tester) async {
final mockCamera = MockMapCamera();
final mockController = MockMapController();

final app = App(
camera: mockCamera,
controller: mockController,
children: [
Builder(
builder: (context) {
expect(MapController.maybeOf(context), equals(mockController));
expect(MapController.of(context), equals(mockController));
return const SizedBox.shrink();
},
),
],
);
await tester.pumpWidget(app);
await tester.pumpAndSettle();
});
testWidgets('MapCamera', (tester) async {
final mockCamera = MockMapCamera();
final mockController = MockMapController();

final app = App(
camera: mockCamera,
controller: mockController,
children: [
Builder(
builder: (context) {
expect(MapCamera.maybeOf(context), equals(mockCamera));
expect(MapCamera.of(context), equals(mockCamera));
return const SizedBox.shrink();
},
),
],
);
await tester.pumpWidget(app);
await tester.pumpAndSettle();
});
testWidgets('MapOptions', (tester) async {
final mockCamera = MockMapCamera();
final mockController = MockMapController();
final mockOptions = MockMapOptions();
when(() => mockController.options).thenReturn(mockOptions);

final app = App(
camera: mockCamera,
controller: mockController,
children: [
Builder(
builder: (context) {
expect(MapOptions.maybeOf(context), equals(mockOptions));
expect(MapOptions.of(context), equals(mockOptions));
return const SizedBox.shrink();
},
),
],
);
await tester.pumpWidget(app);
await tester.pumpAndSettle();
});
});
}
47 changes: 47 additions & 0 deletions test/models_test.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:maplibre/maplibre.dart';

import 'shared/mocks.dart';

void main() {
group('Model Classes', () {
test('QueriedLayer', () {
Expand Down Expand Up @@ -165,5 +167,50 @@ void main() {
expect(oString, contains(o.totalTiles.toString()));
expect(oString, contains(o.totalTilesEstimated.toString()));
});
test('MapEvents', () {
final controller = MockMapController();
final camera = MockMapCamera();
final position = MockPosition();

final mapCreated = MapEventMapCreated(mapController: controller);
expect(mapCreated, isA<MapEvent>());
expect(mapCreated.mapController, equals(controller));

final moveCamera = MapEventMoveCamera(camera: camera);
expect(moveCamera, isA<MapEvent>());
expect(moveCamera.camera, equals(camera));

const startMoveCamera = MapEventStartMoveCamera(
reason: CameraChangeReason.apiGesture,
);
expect(startMoveCamera, isA<MapEvent>());
expect(startMoveCamera.reason, equals(CameraChangeReason.apiGesture));

final click = MapEventClick(point: position);
expect(click, isA<MapEvent>());
expect(click.point, equals(position));
expect(click.toString(), contains('MapEventClick'));

final doubleClick = MapEventDoubleClick(point: position);
expect(doubleClick, isA<MapEvent>());
expect(doubleClick.point, equals(position));
expect(doubleClick.toString(), contains('MapEventDoubleClick'));

final secondaryClick = MapEventSecondaryClick(point: position);
expect(secondaryClick, isA<MapEvent>());
expect(secondaryClick.point, equals(position));
expect(secondaryClick.toString(), contains('MapEventSecondaryClick'));

final longClick = MapEventLongClick(point: position);
expect(longClick, isA<MapEvent>());
expect(longClick.point, equals(position));
expect(longClick.toString(), contains('MapEventLongClick'));

const idle = MapEventIdle();
expect(idle, isA<MapEvent>());

const cameraIdle = MapEventCameraIdle();
expect(cameraIdle, isA<MapEvent>());
});
});
}
5 changes: 0 additions & 5 deletions test/shared/annotation_app.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:maplibre/maplibre.dart';
import 'package:maplibre/src/inherited_model.dart';
import 'package:mocktail/mocktail.dart';

class App extends StatelessWidget {
const App({
Expand Down Expand Up @@ -29,7 +28,3 @@ class App extends StatelessWidget {
);
}
}

class MockMapController extends Mock implements MapController {}

class MockDuration extends Mock implements Duration {}
12 changes: 12 additions & 0 deletions test/shared/mocks.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:maplibre/maplibre.dart';
import 'package:mocktail/mocktail.dart';

class MockMapController extends Mock implements MapController {}

class MockMapCamera extends Mock implements MapCamera {}

class MockMapOptions extends Mock implements MapOptions {}

class MockDuration extends Mock implements Duration {}

class MockPosition extends Mock implements Position {}
5 changes: 0 additions & 5 deletions test/shared/ui_app.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:maplibre/maplibre.dart';
import 'package:maplibre/src/inherited_model.dart';
import 'package:mocktail/mocktail.dart';

class App extends StatelessWidget {
const App({
Expand Down Expand Up @@ -29,7 +28,3 @@ class App extends StatelessWidget {
);
}
}

class MockMapController extends Mock implements MapController {}

class MockDuration extends Mock implements Duration {}
Loading