From 7fa544df9bd72c51bcdffe04a1ec1ec3f29e4605 Mon Sep 17 00:00:00 2001 From: user1823 <92206575+user1823@users.noreply.github.com> Date: Sat, 4 Jan 2025 19:56:23 +0530 Subject: [PATCH] Add some unit tests (#3678) * Add some unit tests Covers most of the cases encountered in https://github.com/ankitects/anki/pull/3639 * Format * Update params.rs Makes the test more robust. * Update params.rs When training, the first FSRS item is removed. That's why none of the other tests includes it. Co-authored-by: Jarrett Ye * Improve naming * Fix typo --------- Co-authored-by: Jarrett Ye --- rslib/src/scheduler/fsrs/params.rs | 71 +++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/rslib/src/scheduler/fsrs/params.rs b/rslib/src/scheduler/fsrs/params.rs index 1b282b0fb0c..d7bff84416d 100644 --- a/rslib/src/scheduler/fsrs/params.rs +++ b/rslib/src/scheduler/fsrs/params.rs @@ -545,11 +545,12 @@ pub(crate) mod tests { #[test] fn card_reset_drops_all_previous_history() { + // If Reset comes in between two Learn entries, only the ones after the Reset + // are used. assert_eq!( convert( &[ revlog(RevlogReviewKind::Learning, 10), - revlog(RevlogReviewKind::Review, 9), RevlogEntry { ease_factor: 0, ..revlog(RevlogReviewKind::Manual, 7) @@ -561,6 +562,58 @@ pub(crate) mod tests { ), fsrs_items!([review(0), review(4)]) ); + // Return None if Reset is the last entry or is followed by only manual entries. + assert_eq!( + convert( + &[ + revlog(RevlogReviewKind::Learning, 10), + revlog(RevlogReviewKind::Review, 9), + RevlogEntry { + ease_factor: 0, + ..revlog(RevlogReviewKind::Manual, 7) + }, + RevlogEntry { + ease_factor: 100, + ..revlog(RevlogReviewKind::Manual, 7) + }, + ], + false, + ), + None, + ); + // If non-learning user-graded entries are found after Reset, return None during + // training but return the remaining entries during memory state calculation. + assert_eq!( + convert( + &[ + revlog(RevlogReviewKind::Learning, 10), + revlog(RevlogReviewKind::Review, 9), + RevlogEntry { + ease_factor: 0, + ..revlog(RevlogReviewKind::Manual, 7) + }, + revlog(RevlogReviewKind::Review, 1), + revlog(RevlogReviewKind::Relearning, 0), + ], + true, + ), + None, + ); + assert_eq!( + convert( + &[ + revlog(RevlogReviewKind::Review, 9), + RevlogEntry { + ease_factor: 0, + ..revlog(RevlogReviewKind::Manual, 7) + }, + revlog(RevlogReviewKind::Review, 1), + revlog(RevlogReviewKind::Relearning, 0), + ], + false, + ), + fsrs_items!([review(0)], [review(0), review(1)]) + ); } #[test] @@ -636,4 +689,20 @@ pub(crate) mod tests { convert(revlogs, false) ); } + + #[test] + fn handle_ignore_before_when_no_learning_steps() { + let revlogs = &[ + revlog(RevlogReviewKind::Review, 10), + revlog(RevlogReviewKind::Review, 8), + revlog(RevlogReviewKind::Review, 6), + ]; + // R | R R + assert_eq!( + convert_ignore_before(revlogs, false, days_ago_ms(9)) + .unwrap() + .len(), + 2 + ); + } }