You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
5.0 KiB

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/services.dart';
import 'package:deep_voice/core/services/floating_window_manager.dart';
/// iOS ReplayKit 悬浮窗功能测试
void main() {
group('iOS ReplayKit 悬浮窗测试', () {
late FloatingWindowManager floatingWindowManager;
late List<MethodCall> methodCalls;
setUp(() {
methodCalls = [];
floatingWindowManager = FloatingWindowManager();
// 模拟 iOS 平台的方法通道调用
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('floating_window'),
(MethodCall methodCall) async {
methodCalls.add(methodCall);
switch (methodCall.method) {
case 'enableFloatingWindow':
return true;
case 'disableFloatingWindow':
return true;
case 'showFloatingWindow':
return true;
case 'hideFloatingWindow':
return true;
case 'updateContent':
return true;
case 'setPosition':
return true;
default:
return null;
}
},
);
});
tearDown(() {
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('floating_window'),
null,
);
});
test('启用悬浮窗功能 (ReplayKit)', () async {
final result = await floatingWindowManager.enableFloatingWindow();
expect(result, isTrue);
expect(methodCalls.length, equals(1));
expect(methodCalls[0].method, equals('enableFloatingWindow'));
});
test('禁用悬浮窗功能', () async {
await floatingWindowManager.disableFloatingWindow();
expect(methodCalls.length, equals(1));
expect(methodCalls[0].method, equals('disableFloatingWindow'));
});
test('显示悬浮窗', () async {
await floatingWindowManager.showFloatingWindow();
expect(methodCalls.length, equals(1));
expect(methodCalls[0].method, equals('showFloatingWindow'));
});
test('隐藏悬浮窗', () async {
await floatingWindowManager.hideFloatingWindow();
expect(methodCalls.length, equals(1));
expect(methodCalls[0].method, equals('hideFloatingWindow'));
});
test('更新悬浮窗内容', () async {
final testData = FloatingWindowData(
sourceText: '你好',
translatedText: 'Hello',
sourceLanguage: '中文',
targetLanguage: '英语',
timestamp: DateTime.now(),
isIntermediate: false,
);
await floatingWindowManager.updateFloatingWindowContent(testData);
expect(methodCalls.length, equals(1));
expect(methodCalls[0].method, equals('updateContent'));
final arguments = methodCalls[0].arguments as Map<String, dynamic>;
expect(arguments['sourceText'], equals('你好'));
expect(arguments['translatedText'], equals('Hello'));
expect(arguments['sourceLanguage'], equals('中文'));
expect(arguments['targetLanguage'], equals('英语'));
expect(arguments['isIntermediate'], equals(false));
});
test('设置悬浮窗位置', () async {
await floatingWindowManager.setFloatingWindowPosition(100.0, 200.0);
expect(methodCalls.length, equals(1));
expect(methodCalls[0].method, equals('setPosition'));
final arguments = methodCalls[0].arguments as Map<String, dynamic>;
expect(arguments['x'], equals(100.0));
expect(arguments['y'], equals(200.0));
});
test('悬浮窗状态管理', () async {
// 初始状态
expect(floatingWindowManager.isEnabled, isFalse);
expect(floatingWindowManager.currentState, equals(FloatingWindowState.hidden));
// 启用悬浮窗
await floatingWindowManager.enableFloatingWindow();
expect(floatingWindowManager.isEnabled, isTrue);
// 显示悬浮窗
await floatingWindowManager.showFloatingWindow();
// 注意:实际状态变化需要通过原生回调触发,这里只测试方法调用
});
});
group('悬浮窗数据模型测试', () {
test('FloatingWindowData 序列化', () {
final data = FloatingWindowData(
sourceText: '测试文本',
translatedText: 'Test Text',
sourceLanguage: '中文(简体)',
targetLanguage: '英语',
timestamp: DateTime(2024, 1, 1, 12, 0, 0),
isIntermediate: true,
);
final map = data.toMap();
expect(map['sourceText'], equals('测试文本'));
expect(map['translatedText'], equals('Test Text'));
expect(map['sourceLanguage'], equals('中文(简体)'));
expect(map['targetLanguage'], equals('英语'));
expect(map['timestamp'], equals(DateTime(2024, 1, 1, 12, 0, 0).millisecondsSinceEpoch));
expect(map['isIntermediate'], equals(true));
});
});
}