JJ_MKVMaker/test/usage_test.dart

95 lines
4.4 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jj_mkvmaker/app/app_controller.dart';
import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart';
import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart';
import 'package:jj_mkvmaker/platform/windows/windows_usage.dart';
import 'package:jj_mkvmaker/services/platform_services.dart';
import 'package:jj_mkvmaker/services/system_usage.dart';
import 'package:jj_mkvmaker/ui/app_actions.dart';
class _Fake implements SystemUsage {
UsageSample? next;
(int, int)? space;
@override
UsageSample? read() => next;
@override
(int, int)? disk(String path) => space;
}
void main() {
test('Windows: 실제 CPU · 메모리 값 읽기', () async {
if (!Platform.isWindows) return markTestSkipped('Windows 전용');
final u = WindowsUsage();
expect(u.read(), isNull); // 첫 호출은 기준점만
// 조금 일하게 한 뒤 다시
final end = DateTime.now().add(const Duration(milliseconds: 300));
var x = 0;
while (DateTime.now().isBefore(end)) {
x += 1;
}
expect(x, greaterThan(0));
final s = u.read()!;
// ignore: avoid_print
print('RESULT CPU ${(s.cpu * 100).toStringAsFixed(1)}% MEM ${(s.mem * 100).toStringAsFixed(1)}% '
'(${s.memUsed ~/ (1 << 20)}MB / ${s.memTotal ~/ (1 << 20)}MB)');
expect(s.cpu, inInclusiveRange(0.0, 1.0));
expect(s.cpu, greaterThan(0)); // 방금 이 테스트가 CPU 를 썼다
expect(s.memTotal, greaterThan(1 << 30)); // 1GB 이상
expect(s.memUsed, inExclusiveRange(0, s.memTotal));
// 디스크: 이 테스트가 도는 드라이브
final root = Directory.current.path.substring(0, 3);
final (free, total) = u.disk(root)!;
// ignore: avoid_print
print('RESULT DISK $root 남은 ${free ~/ (1 << 30)}GB / 전체 ${total ~/ (1 << 30)}GB');
expect(total, greaterThan(1 << 30));
expect(free, inInclusiveRange(0, total));
expect(u.disk(r'?:\없는 드라이브'), isNull);
});
testWidgets('위쪽 막대: 환경 설정 앞에 CPU · MEM 표시, 값이 바뀌면 갱신', (tester) async {
final fake = _Fake();
final c = AppController(PlatformServices(
mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService(), usage: fake));
await tester.pumpWidget(MaterialApp(
home: Scaffold(body: Row(children: [const Spacer(), AppActions(c: c, onExit: () {})]))));
expect(find.textContaining('--%', findRichText: true), findsNWidgets(2)); // 아직 값이 없음
fake.next = const UsageSample(cpu: 0.234, memUsed: 6 << 30, memTotal: 16 << 30);
await tester.pump(const Duration(seconds: 2));
await tester.pump();
expect(find.textContaining('CPU 23%', findRichText: true), findsOneWidget);
expect(find.textContaining('MEM 38%', findRichText: true), findsOneWidget);
expect(find.textContaining('DISK', findRichText: true), findsNothing); // 디스크 값을 모르면 숨김
// DISK: MEM 뒤, 환경 설정 앞. 남은 용량이 적으면 diskLow.
fake.space = (128 << 30, 931 << 30);
await tester.pump(const Duration(seconds: 2));
await tester.pump();
final disk = find.textContaining('DISK 128GB', findRichText: true);
expect(disk, findsOneWidget);
expect(tester.getCenter(disk).dx,
greaterThan(tester.getCenter(find.textContaining('MEM 38%', findRichText: true)).dx));
expect(tester.getCenter(disk).dx, lessThan(tester.getCenter(find.byTooltip('환경 설정')).dx));
expect(c.usage!.value!.diskLow, isFalse);
expect(const UsageSample(cpu: 0, memUsed: 1, memTotal: 2, diskFree: 5 << 30, diskTotal: 100 << 30).diskLow, isTrue);
expect(const UsageSample(cpu: 0, memUsed: 1, memTotal: 2, diskFree: 30 << 30, diskTotal: 2000 << 30).diskLow, isTrue);
// 환경 설정 버튼의 왼쪽
expect(tester.getCenter(find.textContaining('MEM 38%', findRichText: true)).dx,
lessThan(tester.getCenter(find.byTooltip('환경 설정')).dx));
// 화면이 사라지면 재는 것도 멈춘다
await tester.pumpWidget(const SizedBox());
// ignore: invalid_use_of_protected_member
expect(c.usage!.hasListeners, isFalse);
});
test('사용량을 지원하지 않으면 표시 없음', () {
final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService()));
expect(c.usage, isNull);
});
}