JJ_MKVMaker/test/row_fit_contract_test.dart

60 lines
3.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jj_mkvmaker/ui/row_fit.dart';
/// 약속 (row_fit - 82a87da P2 에서 옮김): fitRow 는 판단만 (나눌지 · 줄일 것의 폭 · 모자란 폭), FitButtonRows 는 그 판단대로 그린다 -
/// 단추 크기는 줄이지 않고, 한 줄에 안 들면 두 줄, 줄일 것은 남는 폭 (최대 flexMax, flexMin 보다 작으면 뺌). 모듈 하나에 한 번만 둔다
void main() {
test('fitRow: 넉넉하면 한 줄 · 줄일 것은 최대 폭', () {
final r = fitRow(maxWidth: 960, first: List.filled(6, 40), second: List.filled(6, 40), gap: 8, flexMin: 48, flexMax: 100);
expect([r.split, r.flexWidth, r.overflow], [false, 100, 0]);
});
test('fitRow: 412 는 두 줄 · 줄일 것은 아래 줄의 남는 폭', () {
final r = fitRow(maxWidth: 412, first: List.filled(6, 40), second: List.filled(6, 40), gap: 8, flexMin: 48, flexMax: 100);
expect([r.split, r.flexWidth, r.overflow], [true, 100, 0]);
});
test('fitRow: 남는 폭이 flexMin 보다 작으면 줄일 것을 뺌 · 두 줄로도 안 들면 모자란 폭', () {
final r = fitRow(maxWidth: 260, first: List.filled(6, 40), second: List.filled(6, 40), flexMin: 48, flexMax: 100);
expect([r.split, r.flexWidth], [true, 0]);
final over = fitRow(maxWidth: 200, first: List.filled(6, 40), second: List.filled(2, 40));
expect([over.split, over.overflow], [true, 40]);
});
test('fitRow: forceSplit (손가락 화면) 이면 넓어도 두 줄', () {
expect(fitRow(maxWidth: 2000, first: [48], second: [48], forceSplit: true).split, isTrue);
});
for (final width in [412.0, 600.0, 960.0]) {
testWidgets('FitButtonRows $width: 넘치지 않고 끝 단추가 화면 안 · 단추 크기 그대로', (t) async {
t.view.physicalSize = Size(width, 400);
t.view.devicePixelRatio = 1;
addTearDown(t.view.reset);
Widget b(IconData i, String tip) => IconButton(tooltip: tip, icon: Icon(i), onPressed: () {});
await t.pumpWidget(MaterialApp(
home: Scaffold(
body: Align(
alignment: Alignment.bottomCenter,
child: FitButtonRows(
buttonWidth: 48,
first: [for (var i = 0; i < 6; i++) b(Icons.play_arrow, '재생 $i')],
secondLead: [b(Icons.volume_up, '음소거')],
flex: (w) => SizedBox(width: w, child: Slider(value: 50, max: 100, onChanged: (_) {})),
flexMin: 48,
flexMax: 100,
secondTail: [for (final n in ['속도', '자막', '목록', '팝업', '전체 화면']) b(Icons.more_horiz, n)],
),
),
),
));
expect(t.takeException(), isNull);
final full = t.getRect(find.byTooltip('전체 화면'));
expect(full.right, lessThanOrEqualTo(width));
expect(full.width, greaterThanOrEqualTo(40), reason: '단추를 줄이지 않음');
final twoRows = t.getRect(find.byTooltip('재생 0')).top < t.getRect(find.byTooltip('음소거')).top - 10;
expect(twoRows, width < 6 * 48 + 8 + 6 * 48 + 100, reason: '한 줄에 안 들 때만 두 줄');
});
}
}