61 lines
2.0 KiB
Dart
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,
|
|
);
|