gps_speed_test.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import 'package:cardash_launcher/core/theme/app_theme.dart';
  2. import 'package:cardash_launcher/data/models/bluetooth_device_info.dart';
  3. import 'package:cardash_launcher/data/models/gps_speed.dart';
  4. import 'package:cardash_launcher/data/models/location_reading.dart';
  5. import 'package:cardash_launcher/data/models/obd_state.dart';
  6. import 'package:cardash_launcher/data/services/telemetry_bridge.dart';
  7. import 'package:cardash_launcher/features/home/gps_speed_controller.dart';
  8. import 'package:cardash_launcher/features/home/widgets/gps_speed_card.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:flutter_test/flutter_test.dart';
  11. class _GpsPlatform implements TelemetryPlatform {
  12. _GpsPlatform({this.permission = true, this.speedKmh = 0});
  13. final bool permission;
  14. final double speedKmh;
  15. var started = false;
  16. @override
  17. Future<bool> startGpsSpeed() async {
  18. started = true;
  19. return permission;
  20. }
  21. @override
  22. Future<void> stopGpsSpeed() async {}
  23. @override
  24. Future<GpsSpeed> getGpsSpeed() async {
  25. if (!permission) return const GpsSpeed();
  26. return GpsSpeed(
  27. hasPermission: true,
  28. hasFix: true,
  29. speedKmh: speedKmh,
  30. updatedAt: DateTime(2026).millisecondsSinceEpoch,
  31. );
  32. }
  33. @override
  34. Future<List<BluetoothDeviceInfo>> listBondedDevices() async => const [];
  35. @override
  36. Future<bool> isBluetoothEnabled() async => false;
  37. @override
  38. Future<bool> ensureBluetoothPermission() async => false;
  39. @override
  40. Future<bool> openBluetoothSettings() async => true;
  41. @override
  42. Future<bool> ensureLocationPermission() async => permission;
  43. @override
  44. Future<LocationReading> getLocation() async =>
  45. const LocationReading(latitude: 0, longitude: 0, place: '');
  46. @override
  47. Future<void> connectObd(String address) async {}
  48. @override
  49. Future<void> disconnectObd() async {}
  50. @override
  51. Future<ObdState> getObdState() async => const ObdState();
  52. }
  53. void main() {
  54. test('stationary GPS fix reports 0 km/h', () async {
  55. final platform = _GpsPlatform(speedKmh: 0);
  56. final controller = GpsSpeedController(
  57. platform,
  58. clock: () => DateTime(2026),
  59. );
  60. addTearDown(controller.dispose);
  61. await controller.start();
  62. expect(platform.started, isTrue);
  63. expect(controller.speedKmh, 0);
  64. controller.stop();
  65. });
  66. test('no precise location means no prompt and no speed', () async {
  67. final platform = _GpsPlatform(permission: false);
  68. final controller = GpsSpeedController(
  69. platform,
  70. clock: () => DateTime(2026),
  71. );
  72. addTearDown(controller.dispose);
  73. await controller.start();
  74. expect(controller.hasPermission, isFalse);
  75. expect(controller.hasSpeed, isFalse);
  76. controller.stop();
  77. });
  78. testWidgets('GPS card displays 0 km/h', (tester) async {
  79. await tester.pumpWidget(
  80. MaterialApp(
  81. theme: AppTheme.dark(),
  82. home: const Scaffold(
  83. body: SizedBox(width: 380, child: GpsSpeedCard(speedKmh: 0)),
  84. ),
  85. ),
  86. );
  87. expect(find.text('0'), findsOneWidget);
  88. expect(find.text('km/h'), findsOneWidget);
  89. expect(find.text('GPS'), findsOneWidget);
  90. });
  91. }