gps_speed_test.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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> ensureLocationPermission() async => permission;
  41. @override
  42. Future<LocationReading> getLocation() async =>
  43. const LocationReading(latitude: 0, longitude: 0, place: '');
  44. @override
  45. Future<void> connectObd(String address) async {}
  46. @override
  47. Future<void> disconnectObd() async {}
  48. @override
  49. Future<ObdState> getObdState() async => const ObdState();
  50. }
  51. void main() {
  52. test('stationary GPS fix reports 0 km/h', () async {
  53. final platform = _GpsPlatform(speedKmh: 0);
  54. final controller = GpsSpeedController(
  55. platform,
  56. clock: () => DateTime(2026),
  57. );
  58. addTearDown(controller.dispose);
  59. await controller.start();
  60. expect(platform.started, isTrue);
  61. expect(controller.speedKmh, 0);
  62. controller.stop();
  63. });
  64. test('no precise location means no prompt and no speed', () async {
  65. final platform = _GpsPlatform(permission: false);
  66. final controller = GpsSpeedController(
  67. platform,
  68. clock: () => DateTime(2026),
  69. );
  70. addTearDown(controller.dispose);
  71. await controller.start();
  72. expect(controller.hasPermission, isFalse);
  73. expect(controller.hasSpeed, isFalse);
  74. controller.stop();
  75. });
  76. testWidgets('GPS card displays 0 km/h', (tester) async {
  77. await tester.pumpWidget(
  78. MaterialApp(
  79. theme: AppTheme.dark(),
  80. home: const Scaffold(
  81. body: SizedBox(width: 380, child: GpsSpeedCard(speedKmh: 0)),
  82. ),
  83. ),
  84. );
  85. expect(find.text('0'), findsOneWidget);
  86. expect(find.text('km/h'), findsOneWidget);
  87. expect(find.text('GPS'), findsOneWidget);
  88. });
  89. }