bible-tracker/test/services/progress_test.dart

69 lines
2.3 KiB
Dart
Raw Permalink Normal View History

2026-04-20 18:39:49 +00:00
import 'package:bible_tracker/data/bible.dart';
import 'package:bible_tracker/models/tracker.dart';
import 'package:bible_tracker/services/progress.dart';
import 'package:flutter_test/flutter_test.dart';
Tracker _tracker({Set<String> read = const <String>{}}) => Tracker(
id: 't',
name: 'Test',
colorValue: 0xFF3F51B5,
startDate: DateTime(2024, 1, 1),
readChapters: read,
);
void main() {
group('TrackerProgress', () {
test('empty tracker has 0% overall', () {
final progress = TrackerProgress(_tracker());
expect(progress.overall, 0);
expect(progress.totalRead, 0);
expect(progress.booksCompleted(), 0);
});
test('counts chapters within a book', () {
final book = Bible.books[0];
final tracker = _tracker(
read: <String>{
Bible.chapterKey(book.index, 1),
Bible.chapterKey(book.index, 2),
Bible.chapterKey(book.index, 3),
},
);
final progress = TrackerProgress(tracker);
expect(progress.chaptersReadIn(book), 3);
expect(progress.fractionOf(book), closeTo(3 / book.chapterCount, 1e-9));
expect(progress.isBookStarted(book), true);
expect(progress.isBookComplete(book), false);
});
test('book is complete when all chapters are read', () {
final book = Bible.books.firstWhere((Book b) => b.name == 'Jude');
final tracker = _tracker(
read: <String>{
for (int c = 1; c <= book.chapterCount; c++)
Bible.chapterKey(book.index, c),
},
);
final progress = TrackerProgress(tracker);
expect(progress.isBookComplete(book), true);
expect(progress.booksCompleted(), 1);
expect(progress.booksCompleted(Testament.newT), 1);
expect(progress.booksCompleted(Testament.old), 0);
});
test('overall fraction reflects all-read state', () {
final all = <String>{
for (final Book book in Bible.books)
for (int c = 1; c <= book.chapterCount; c++)
Bible.chapterKey(book.index, c),
};
final progress = TrackerProgress(_tracker(read: all));
expect(progress.totalRead, Bible.totalChapters);
expect(progress.overall, 1.0);
expect(progress.booksCompleted(), Bible.totalBooks);
expect(progress.testamentFraction(Testament.old), 1.0);
expect(progress.testamentFraction(Testament.newT), 1.0);
});
});
}