import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:motorcycle_dash/services/map/map_provider_interface.dart'; import 'package:motorcycle_dash/services/map/map_providers.dart'; import 'package:motorcycle_dash/services/map/open_street_map_provider.dart'; import 'package:motorcycle_dash/services/map/google_map_provider.dart'; import 'package:motorcycle_dash/services/map/aws_map_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { SharedPreferences.setMockInitialValues({}); }); group('Map Provider Architecture Tests', () { test('AppLatLng equality and initialization', () { const p1 = AppLatLng(37.7749, -122.4194); const p2 = AppLatLng(37.7749, -122.4194); const p3 = AppLatLng(34.0522, -118.2437); expect(p1, equals(p2)); expect(p1, isNot(equals(p3))); }); test('MapConfig defaults', () { const config = MapConfig(); expect(config.tileUrlTemplate, anyOf(contains('cartocdn.com'), contains('openstreetmap.org'))); expect(config.attributionText, contains('OpenStreetMap')); expect(config.userAgent, contains('MotorcycleDashboard')); }); test('OpenStreetMapProvider instance properties', () { final osmProvider = OpenStreetMapProvider(); expect(osmProvider.type, equals(AppMapType.openStreetMap)); expect(osmProvider.name, equals('OpenStreetMap')); }); test('GoogleMapProvider instance properties', () { final googleProvider = GoogleMapProvider(); expect(googleProvider.type, equals(AppMapType.googleMaps)); expect(googleProvider.name, equals('Google Maps')); }); test('AwsMapProvider instance properties', () { final awsProvider = AwsMapProvider(); expect(awsProvider.type, equals(AppMapType.awsMaps)); expect(awsProvider.name, equals('Amazon Satellite')); expect(awsProvider.apiKey, isNotEmpty); expect(awsProvider.region, equals('us-east-2')); }); test('MapFollowNotifier state toggles', () { final container = ProviderContainer(); addTearDown(container.dispose); final notifier = container.read(mapFollowStateProvider.notifier); expect(container.read(mapFollowStateProvider), isTrue); notifier.userInteracted(); expect(container.read(mapFollowStateProvider), isFalse); notifier.recenter(); expect(container.read(mapFollowStateProvider), isTrue); }); test('ActiveMapProvider resolves correct instance', () { final container = ProviderContainer(); addTearDown(container.dispose); // Default is AWS Maps final active = container.read(activeMapProvider); expect(active.type, equals(AppMapType.awsMaps)); expect(active, isA()); // Switch to Google Maps container.read(mapProviderTypeNotifierProvider.notifier).setMapProviderType(AppMapType.googleMaps); final activeGoogle = container.read(activeMapProvider); expect(activeGoogle.type, equals(AppMapType.googleMaps)); // Switch to OpenStreetMap container.read(mapProviderTypeNotifierProvider.notifier).setMapProviderType(AppMapType.openStreetMap); final activeOsm = container.read(activeMapProvider); expect(activeOsm.type, equals(AppMapType.openStreetMap)); // Switch back to AWS Maps container.read(mapProviderTypeNotifierProvider.notifier).setMapProviderType(AppMapType.awsMaps); final activeAws = container.read(activeMapProvider); expect(activeAws.type, equals(AppMapType.awsMaps)); expect(activeAws, isA()); final config = container.read(mapConfigProvider); expect(config.tileUrlTemplate, contains('amazonaws.com')); expect(config.attributionText, contains('AWS')); }); }); }