gps_speed_test.dart 3.2 KB

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