51 lines
3.2 KiB
Dart
51 lines
3.2 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:integration_test/integration_test.dart';
|
|
import 'package:jj_mkvmaker/platform/windows/start_menu.dart';
|
|
import 'package:path/path.dart' as p;
|
|
|
|
/// 99: 실제 시작 메뉴 · HKCU 등록 · 이 앱 이름의 알림 (JJ_TEST_START_MENU=1 일 때만 - 사용자의 시작 메뉴를 바꾸므로).
|
|
/// 끝나면 만든 바로 가기와 jjmkvmaker:// 등록을 지워 시험 전 상태로 돌린다.
|
|
/// JJ_TEST_LAUNCHER: 바로 가기가 가리킬 시험용 배포 폴더의 jj_mkvmaker.exe
|
|
void main() {
|
|
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
|
final launcher = Platform.environment['JJ_TEST_LAUNCHER'] ?? '';
|
|
final shot = Platform.environment['JJ_TEST_SHOT'] ?? '';
|
|
|
|
Future<String> ps(String cmd) async => '${(await Process.run('powershell.exe', ['-NoProfile', '-Command', cmd])).stdout}'.trim();
|
|
|
|
testWidgets('시작 메뉴 바로 가기 (AUMID) · jjmkvmaker:// · JJ_MKVMaker 이름의 알림 · 폴더를 옮기면 고침 · 정리', (t) async {
|
|
final lnk = StartMenu.user.shortcutPath;
|
|
expect(File(lnk).existsSync(), isFalse, reason: '시험 전에는 없어야 한다');
|
|
try {
|
|
expect(await StartMenu.user.ensure(exe: launcher), isTrue);
|
|
expect(File(lnk).existsSync(), isTrue);
|
|
final dir = p.dirname(lnk), name = p.basename(lnk);
|
|
expect(await ps("(New-Object -ComObject Shell.Application).Namespace('$dir').ParseName('$name').ExtendedProperty('System.AppUserModel.ID')"),
|
|
StartMenu.aumid);
|
|
expect((await ps("(New-Object -ComObject WScript.Shell).CreateShortcut('$lnk').TargetPath")).toLowerCase(), launcher.toLowerCase());
|
|
final cmd = await ps(r"(Get-ItemProperty -LiteralPath 'HKCU:\Software\Classes\jjmkvmaker\shell\open\command').'(default)'");
|
|
expect(cmd.toLowerCase(), contains(launcher.toLowerCase()));
|
|
// 이 앱 이름으로 알림 (보낸 이 확인용으로 화면을 찍어 둔다)
|
|
expect(await StartMenu.toast('JJ_MKVMaker 알림 시험 (99)', '실시간 동기화가 멈췄습니다 - 시험입니다\n무시해도 됩니다'), isTrue);
|
|
if (shot.isNotEmpty) {
|
|
await Future<void>.delayed(const Duration(seconds: 2));
|
|
await ps('Add-Type -AssemblyName System.Windows.Forms,System.Drawing; '
|
|
r'$b = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds; '
|
|
r'$bmp = New-Object System.Drawing.Bitmap $b.Width, $b.Height; '
|
|
r'$g = [System.Drawing.Graphics]::FromImage($bmp); $g.CopyFromScreen($b.Location, [System.Drawing.Point]::Empty, $b.Size); '
|
|
"\$bmp.Save('$shot')");
|
|
}
|
|
// 앱 폴더를 옮긴 경우: 다음 실행 때 새 위치로 고친다
|
|
final moved = p.join(p.dirname(launcher), 'Lib', p.basename(launcher));
|
|
expect(await StartMenu.user.ensure(exe: moved), isTrue);
|
|
expect((await ps("(New-Object -ComObject WScript.Shell).CreateShortcut('$lnk').TargetPath")).toLowerCase(), moved.toLowerCase());
|
|
} finally {
|
|
await StartMenu.user.remove();
|
|
}
|
|
expect(File(lnk).existsSync(), isFalse);
|
|
expect(await ps(r"Test-Path 'HKCU:\Software\Classes\jjmkvmaker'"), 'False');
|
|
}, skip: !Platform.isWindows || Platform.environment['JJ_TEST_START_MENU'] != '1');
|
|
}
|