Files
flutterApp/test/support/control_mode_fakes.dart
2026-11-06 08:34:19 +08:00

61 lines
2.0 KiB
Dart

import 'dart:async';
import 'package:fpdart/fpdart.dart';
import 'package:maibu_satabot_v2/core/error/failure.dart';
import 'package:maibu_satabot_v2/features/device_control_mode/domain/entities/device_control_mode.dart';
import 'package:maibu_satabot_v2/features/device_control_mode/domain/repositories/device_control_mode_repository.dart';
import 'package:maibu_satabot_v2/features/device_control_mode/domain/usecases/device_control_mode_usecases.dart';
import 'package:maibu_satabot_v2/features/device_control_mode/presentation/cubit/control_mode_entry_cubit.dart';
class FakeModes implements DeviceControlModeRepository {
final reports = StreamController<DeviceControlModeReading>.broadcast(
sync: true,
);
final requests = <(String, ControlModeTarget)>[];
String? initial;
Completer<Either<Failure, Unit>>? pending;
Failure? failure;
@override
Stream<DeviceControlModeReading> watch(String deviceId) {
final cached = initial;
if (cached != null) {
scheduleMicrotask(() {
if (reports.isClosed) return;
reports.add(
DeviceControlModeReading(deviceId: deviceId, rawMode: cached),
);
});
}
return reports.stream;
}
void report(String? mode, {String deviceId = 'SN002'}) =>
reports.add(DeviceControlModeReading(deviceId: deviceId, rawMode: mode));
@override
Future<Either<Failure, Unit>> change(
String deviceId,
ControlModeTarget target,
) async {
requests.add((deviceId, target));
return pending?.future ??
(failure == null ? const Right(unit) : Left(failure!));
}
}
Future<void> flushModes() async {
for (var i = 0; i < 4; i++) {
await Future<void>.delayed(Duration.zero);
}
}
ControlModeEntryCubit modeCubit(
FakeModes repo, {
ControlModeTarget target = ControlModeTarget.autonomous,
Duration timeout = const Duration(seconds: 12),
}) => ControlModeEntryCubit(
deviceId: 'SN002',
target: target,
watchMode: WatchDeviceControlModeUseCase(repo),
changeMode: ChangeDeviceControlModeUseCase(repo),
timeout: timeout,
);