Skip to content

Commit

Permalink
fix_unexpected_event_type
Browse files Browse the repository at this point in the history
  • Loading branch information
alexandre_poichet committed Feb 7, 2025
1 parent 5d5c7cc commit 02c2c7e
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 36 deletions.
56 changes: 27 additions & 29 deletions lib/flutter_eco_mode.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,36 +13,42 @@ const double minScoreLowEndDevice = 0.3;
/// An implementation of [FlutterEcoModePlatform] that uses pigeon.
class FlutterEcoMode extends FlutterEcoModePlatform {
final EcoModeApi _api;
final StreamController<double> _batteryLevelStreamController =
StreamController.broadcast();
final StreamController<String> _batteryStateStreamController =
StreamController.broadcast();
final StreamController<bool> _batteryLowPowerModeStreamController =
StreamController.broadcast();
final StreamController<double> _batteryLevelStreamController = StreamController.broadcast();
final StreamController<String> _batteryStateStreamController = StreamController.broadcast();
final StreamController<bool> _batteryLowPowerModeStreamController = StreamController.broadcast();

FlutterEcoMode({
EcoModeApi? api,
EventChannel? batteryLevelEventChannel,
EventChannel? batteryStatusEventChannel,
EventChannel? batteryModeEventChannel,
}) : _api = api ?? EcoModeApi() {
(batteryLevelEventChannel ??
const EventChannel('sncf.connect.tech/battery.level'))
(batteryLevelEventChannel ?? const EventChannel('sncf.connect.tech/battery.level'))
.receiveBroadcastStream()
.listen((event) {
_batteryLevelStreamController.add(event);
if (event is double) {
_batteryLevelStreamController.add(event);
} else {
log("Battery level event is not a double: $event");
}
});
(batteryStatusEventChannel ??
const EventChannel('sncf.connect.tech/battery.state'))
(batteryStatusEventChannel ?? const EventChannel('sncf.connect.tech/battery.state'))
.receiveBroadcastStream()
.listen((event) {
_batteryStateStreamController.add(event);
if (event is String) {
_batteryStateStreamController.add(event);
} else {
log("Battery state event is not a String: $event");
}
});
(batteryModeEventChannel ??
const EventChannel('sncf.connect.tech/battery.isLowPowerMode'))
(batteryModeEventChannel ?? const EventChannel('sncf.connect.tech/battery.isLowPowerMode'))
.receiveBroadcastStream()
.listen((event) {
_batteryLowPowerModeStreamController.add(event);
if (event is bool) {
_batteryLowPowerModeStreamController.add(event);
} else {
log("Battery low power mode event is not a bool: $event");
}
});
}

Expand Down Expand Up @@ -109,10 +115,7 @@ class FlutterEcoMode extends FlutterEcoModePlatform {
throw Exception('Error while getting eco score');
}
final range = _buildRange(value);
return DeviceRange(
score: value,
range: range,
isLowEndDevice: range == DeviceEcoRange.lowEnd);
return DeviceRange(score: value, range: range, isLowEndDevice: range == DeviceEcoRange.lowEnd);
}).onError((error, stackTrace) {
log(stackTrace.toString(), error: error);
return null;
Expand Down Expand Up @@ -152,8 +155,7 @@ class FlutterEcoMode extends FlutterEcoModePlatform {
return Future.wait([
Future<bool?>.value((await getBatteryLevel())?.isNotEnough),
Future<bool?>.value((await getBatteryState()).isDischarging),
]).then((List<bool?> value) =>
value.every((bool? element) => element ?? false));
]).then((List<bool?> value) => value.every((bool? element) => element ?? false));
} catch (error, stackTrace) {
log(stackTrace.toString(), error: error);
return null;
Expand All @@ -179,18 +181,15 @@ class FlutterEcoMode extends FlutterEcoModePlatform {
}

@override
Stream<bool> get lowPowerModeEventStream =>
_batteryLowPowerModeStreamController.stream;
Stream<bool> get lowPowerModeEventStream => _batteryLowPowerModeStreamController.stream;

@override
Stream<double> get batteryLevelEventStream =>
_batteryLevelStreamController.stream;
Stream<double> get batteryLevelEventStream => _batteryLevelStreamController.stream;

@override
Stream<BatteryState> get batteryStateEventStream =>
_batteryStateStreamController.stream.map((event) => BatteryState.values
.firstWhere((e) => e.name == event.toString().toLowerCase(),
orElse: () => BatteryState.unknown));
.firstWhere((e) => e.name == event.toString().toLowerCase(), orElse: () => BatteryState.unknown));

@override
Stream<bool?> get isBatteryEcoModeStream => CombineLatestStream.list([
Expand All @@ -213,8 +212,7 @@ extension on BatteryState {
}

extension on ThermalState {
bool get isSeriousAtLeast =>
this == ThermalState.serious || this == ThermalState.critical;
bool get isSeriousAtLeast => this == ThermalState.serious || this == ThermalState.critical;
}

extension StreamExtensions<T> on Stream<T> {
Expand Down
34 changes: 27 additions & 7 deletions test/flutter_eco_mode_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ class MockEcoModeApi extends Mock implements EcoModeApi {}

void main() {
late EventChannel batteryLevelEventChannel;
late EventChannel batteryStatusEventChannel;
late EventChannel batteryStateEventChannel;
late EventChannel batteryModeEventChannel;
late EcoModeApi ecoModeApi;

FlutterEcoMode buildEcoMode() => FlutterEcoMode(
api: ecoModeApi,
batteryLevelEventChannel: batteryLevelEventChannel,
batteryStatusEventChannel: batteryStatusEventChannel,
batteryStatusEventChannel: batteryStateEventChannel,
batteryModeEventChannel: batteryModeEventChannel,
);

Expand All @@ -34,11 +34,11 @@ void main() {
when(() => ecoModeApi.getThermalState())
.thenAnswer((_) async => ThermalState.safe);
batteryLevelEventChannel = MockEventChannel();
batteryStatusEventChannel = MockEventChannel();
batteryStateEventChannel = MockEventChannel();
batteryModeEventChannel = MockEventChannel();
when(() => batteryLevelEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<double>.value(100.0));
when(() => batteryStatusEventChannel.receiveBroadcastStream())
when(() => batteryStateEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<String>.value(BatteryState.charging.name));
when(() => batteryModeEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<bool>.value(false));
Expand Down Expand Up @@ -136,7 +136,7 @@ void main() {
test('should return false when not enough battery and charging', () async {
when(() => batteryLevelEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<double>.value(minEnoughBattery - 1));
when(() => batteryStatusEventChannel.receiveBroadcastStream())
when(() => batteryStateEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<String>.value(BatteryState.charging.name));
buildEcoMode().isBatteryEcoModeStream.listen(expectAsync1((event) {
expect(event, false);
Expand All @@ -146,7 +146,7 @@ void main() {
test('should return false when enough battery and discharging', () async {
when(() => batteryLevelEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<double>.value(minEnoughBattery + 1));
when(() => batteryStatusEventChannel.receiveBroadcastStream()).thenAnswer(
when(() => batteryStateEventChannel.receiveBroadcastStream()).thenAnswer(
(_) => Stream<String>.value(BatteryState.discharging.name));
buildEcoMode().isBatteryEcoModeStream.listen(expectAsync1((event) {
expect(event, false);
Expand All @@ -157,7 +157,7 @@ void main() {
() async {
when(() => batteryLevelEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<double>.value(minEnoughBattery - 1));
when(() => batteryStatusEventChannel.receiveBroadcastStream()).thenAnswer(
when(() => batteryStateEventChannel.receiveBroadcastStream()).thenAnswer(
(_) => Stream<String>.value(BatteryState.discharging.name));
buildEcoMode().isBatteryEcoModeStream.listen(expectAsync1((event) {
expect(event, true);
Expand All @@ -171,6 +171,26 @@ void main() {
expect(event, true);
}, count: 1));
});

test('should return nothing when battery state event is not a string', () async {
when(() => batteryStateEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<bool>.value(false));
try {
await buildEcoMode().batteryStateEventStream.timeout(const Duration(milliseconds: 1)).first;
} on TimeoutException catch (e) {
expect(e.message, 'No stream event');
}
});

test('should return nothing when level battery event is not a double', () async {
when(() => batteryLevelEventChannel.receiveBroadcastStream())
.thenAnswer((_) => Stream<bool>.value(false));
try {
await buildEcoMode().batteryLevelEventStream.timeout(const Duration(milliseconds: 1)).first;
} on TimeoutException catch (e) {
expect(e.message, 'No stream event');
}
});
});

group(
Expand Down

0 comments on commit 02c2c7e

Please sign in to comment.