Files
BadNote/test/double_page_layout_test.dart

97 lines
2.9 KiB
Dart
Raw Normal View History

// Tests for the two-up spread layout foundation (F2/F3).
import 'dart:ui' show Size;
import 'package:flutter_test/flutter_test.dart';
import 'package:badnote/editor/layout/double_page_layout.dart';
import 'package:badnote/editor/pdf/pdf_document_source.dart';
class _Src implements PageDocumentSource {
_Src(this._sizes);
final List<Size> _sizes;
@override
int get pageCount => _sizes.length;
@override
Size pageSize(int index) => _sizes[index];
}
void main() {
group('pairIntoRows', () {
test('pairs from 0 by default', () {
expect(pairIntoRows(4), [
[0, 1],
[2, 3],
]);
});
test('trailing odd page gets a single-page row', () {
expect(pairIntoRows(5), [
[0, 1],
[2, 3],
[4],
]);
});
test('coverAlone puts page 0 alone, then pairs', () {
expect(pairIntoRows(5, coverAlone: true), [
[0],
[1, 2],
[3, 4],
]);
});
test('edge counts', () {
expect(pairIntoRows(0), isEmpty);
expect(pairIntoRows(1), [
[0],
]);
expect(pairIntoRows(1, coverAlone: true), [
[0],
]);
expect(pairIntoRows(2, coverAlone: true), [
[0],
[1],
]);
});
});
group('spreadRowHeights', () {
test('row height is the tallest page at half column width', () {
// page0 600x800 (aspect 800/600), page1 600x400. At column 600 → half 300.
// page0 fit = 300 * 800/600 = 400; page1 fit = 300 * 400/600 = 200.
final src = _Src([const Size(600, 800), const Size(600, 400)]);
final rows = pairIntoRows(2);
expect(spreadRowHeights(src, 600, rows), [400.0]); // max(400,200)
});
test('single-page row uses that page only', () {
final src = _Src([const Size(400, 800)]);
final rows = pairIntoRows(1);
// half = 150; fit = 150 * 800/400 = 300.
expect(spreadRowHeights(src, 300, rows), [300.0]);
});
test('non-positive width contributes 0', () {
final src = _Src([const Size(0, 800), const Size(400, 400)]);
final rows = pairIntoRows(2); // [[0,1]]
// page0 → 0; page1 half=150 fit=150*400/400=150 → max 150.
expect(spreadRowHeights(src, 300, rows), [150.0]);
});
});
group('spreadStackMetrics composes with windowing', () {
test('rows stack vertically; visibleRange selects visible rows', () {
// 6 portrait pages 600x800 → 3 rows; at column 600 each row 400 tall.
final src = _Src(List.filled(6, const Size(600, 800)));
final m = spreadStackMetrics(src, 600, gap: 0);
expect(m.pageCount, 3); // 3 ROWS
expect(m.totalExtent, closeTo(1200, 1e-9)); // 3 * 400
// viewport [350,850): row0 [0,400), row1 [400,800), row2 [800,1200).
// first bottom>350 → row0; last top<850 → row2.
expect(m.visibleRange(350, 500).first, 0);
expect(m.visibleRange(350, 500).last, 2);
});
});
}