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 read = const {}}) => 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: { 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: { 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 = { 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); }); }); }