173 lines
5.5 KiB
Dart
173 lines
5.5 KiB
Dart
import 'package:flutter/services.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:plezy/services/display_mode_service.dart';
|
|
import 'package:plezy/services/fullscreen_state_manager.dart';
|
|
import 'package:plezy/services/settings_service.dart';
|
|
import 'package:plezy/utils/app_logger.dart';
|
|
|
|
import '../test_helpers/prefs.dart';
|
|
|
|
void main() {
|
|
TestWidgetsFlutterBinding.ensureInitialized();
|
|
|
|
const channel = MethodChannel('test_display_mode_service');
|
|
late DisplayModeService service;
|
|
late List<String> calls;
|
|
|
|
void setHandler(Future<dynamic> Function(MethodCall call)? handler) {
|
|
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, handler);
|
|
}
|
|
|
|
Future<void> seedNativeState({required bool mode, required bool hdr}) async {
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
return switch (call.method) {
|
|
'isModeChanged' => mode,
|
|
'isHDRChanged' => hdr,
|
|
_ => throw StateError('Unexpected method ${call.method}'),
|
|
};
|
|
});
|
|
await service.syncWithNative();
|
|
calls.clear();
|
|
}
|
|
|
|
setUp(() async {
|
|
calls = <String>[];
|
|
MemoryLogOutput.clearLogs();
|
|
setLoggerLevel(true);
|
|
resetSharedPreferencesForTest();
|
|
SettingsService.resetForTesting();
|
|
final settings = await SettingsService.getInstance();
|
|
service = DisplayModeService.forTesting(settings, FullscreenStateManager(), channel: channel);
|
|
});
|
|
|
|
tearDown(() {
|
|
setHandler(null);
|
|
MemoryLogOutput.clearLogs();
|
|
});
|
|
|
|
test('false display-mode payload retains state for a later retry', () async {
|
|
await seedNativeState(mode: true, hdr: false);
|
|
var accepted = false;
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
expect(call.method, 'restoreDisplayMode');
|
|
return accepted;
|
|
});
|
|
|
|
await service.restoreAll();
|
|
expect(service.anyChangeApplied, isTrue);
|
|
|
|
accepted = true;
|
|
await service.restoreAll();
|
|
expect(calls, ['restoreDisplayMode', 'restoreDisplayMode']);
|
|
expect(service.anyChangeApplied, isFalse);
|
|
});
|
|
|
|
test('false HDR payload warns without logging restoration success', () async {
|
|
await seedNativeState(mode: false, hdr: true);
|
|
var accepted = false;
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
expect(call.method, 'restoreSystemHDR');
|
|
return accepted;
|
|
});
|
|
|
|
await service.restoreAll();
|
|
expect(service.hdrStateChanged, isTrue);
|
|
var messages = MemoryLogOutput.getLogs().map((entry) => entry.message).join('\n');
|
|
expect(messages, contains('retaining retry state'));
|
|
expect(messages, isNot(contains('Restored system HDR state')));
|
|
|
|
accepted = true;
|
|
await service.restoreAll();
|
|
messages = MemoryLogOutput.getLogs().map((entry) => entry.message).join('\n');
|
|
expect(calls, ['restoreSystemHDR', 'restoreSystemHDR']);
|
|
expect(service.hdrStateChanged, isFalse);
|
|
expect(service.anyChangeApplied, isFalse);
|
|
expect(messages, contains('Restored system HDR state'));
|
|
});
|
|
|
|
test('HDR failure does not suppress successful mode restoration', () async {
|
|
await seedNativeState(mode: true, hdr: true);
|
|
var hdrAccepted = false;
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
return switch (call.method) {
|
|
'restoreSystemHDR' => hdrAccepted,
|
|
'restoreDisplayMode' => true,
|
|
_ => throw StateError('Unexpected method ${call.method}'),
|
|
};
|
|
});
|
|
|
|
await service.restoreAll();
|
|
expect(calls, ['restoreSystemHDR', 'restoreDisplayMode']);
|
|
expect(service.hdrStateChanged, isTrue);
|
|
expect(service.anyChangeApplied, isTrue);
|
|
|
|
calls.clear();
|
|
hdrAccepted = true;
|
|
await service.restoreAll();
|
|
expect(calls, ['restoreSystemHDR']);
|
|
expect(service.anyChangeApplied, isFalse);
|
|
});
|
|
|
|
test('mode failure does not suppress successful HDR restoration', () async {
|
|
await seedNativeState(mode: true, hdr: true);
|
|
var modeAccepted = false;
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
return switch (call.method) {
|
|
'restoreSystemHDR' => true,
|
|
'restoreDisplayMode' => modeAccepted,
|
|
_ => throw StateError('Unexpected method ${call.method}'),
|
|
};
|
|
});
|
|
|
|
await service.restoreAll();
|
|
expect(calls, ['restoreSystemHDR', 'restoreDisplayMode']);
|
|
expect(service.hdrStateChanged, isFalse);
|
|
expect(service.anyChangeApplied, isTrue);
|
|
|
|
calls.clear();
|
|
modeAccepted = true;
|
|
await service.restoreAll();
|
|
expect(calls, ['restoreDisplayMode']);
|
|
expect(service.anyChangeApplied, isFalse);
|
|
});
|
|
|
|
test('a channel exception retains only the throwing restoration', () async {
|
|
await seedNativeState(mode: true, hdr: true);
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
if (call.method == 'restoreSystemHDR') {
|
|
throw PlatformException(code: 'RESTORE_FAILED');
|
|
}
|
|
if (call.method == 'restoreDisplayMode') return true;
|
|
throw StateError('Unexpected method ${call.method}');
|
|
});
|
|
|
|
await service.restoreAll();
|
|
expect(calls, ['restoreSystemHDR', 'restoreDisplayMode']);
|
|
expect(service.hdrStateChanged, isTrue);
|
|
expect(service.anyChangeApplied, isTrue);
|
|
});
|
|
|
|
test('non-Windows override performs no native work', () async {
|
|
service = DisplayModeService.forTesting(
|
|
SettingsService.instance,
|
|
FullscreenStateManager(),
|
|
channel: channel,
|
|
isWindows: false,
|
|
);
|
|
setHandler((call) async {
|
|
calls.add(call.method);
|
|
return true;
|
|
});
|
|
|
|
await service.syncWithNative();
|
|
await service.restoreAll();
|
|
expect(calls, isEmpty);
|
|
});
|
|
}
|