110 lines
4.9 KiB
Rust
110 lines
4.9 KiB
Rust
//! Toggling a recurring task: the next occurrence and the completed line.
|
|
|
|
use notescraft_tasks::{ToggleCfg, toggle};
|
|
use notescraft_templates::Date;
|
|
|
|
/// The day the tests toggle on.
|
|
fn today() -> Date {
|
|
Date::new(2026, 10, 22).expect("a valid date")
|
|
}
|
|
|
|
/// The default configuration of a toggle.
|
|
fn cfg() -> ToggleCfg {
|
|
ToggleCfg::default()
|
|
}
|
|
|
|
#[test]
|
|
fn a_recurring_task_gets_its_next_occurrence_above_the_completed_line() {
|
|
let out = toggle("- [ ] Water 🔁 every week 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week 📅 2026-10-27", "- [x] Water 🔁 every week 📅 2026-10-20 ✅ 2026-10-22",]);
|
|
assert_eq!(out.next_index, Some(0));
|
|
}
|
|
|
|
#[test]
|
|
fn the_next_occurrence_can_go_below_the_completed_line() {
|
|
let cfg = ToggleCfg { next_below: true, ..ToggleCfg::default() };
|
|
let out = toggle("- [ ] Water 🔁 every week 📅 2026-10-20", today(), &cfg).expect("a task");
|
|
assert_eq!(out.lines, ["- [x] Water 🔁 every week 📅 2026-10-20 ✅ 2026-10-22", "- [ ] Water 🔁 every week 📅 2026-10-27",]);
|
|
assert_eq!(out.next_index, Some(1));
|
|
}
|
|
|
|
#[test]
|
|
fn a_late_completion_counts_from_the_due_date() {
|
|
let out = toggle("- [ ] Water 🔁 every week 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
let next = out.lines.first().expect("the next occurrence");
|
|
assert!(next.ends_with("📅 2026-10-27"), "{next}");
|
|
}
|
|
|
|
#[test]
|
|
fn a_when_done_rule_counts_from_the_completion_date() {
|
|
let out = toggle("- [ ] Water 🔁 every week when done 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week when done 📅 2026-10-29", "- [x] Water 🔁 every week when done 📅 2026-10-20 ✅ 2026-10-22",]);
|
|
assert_eq!(out.next_index, Some(0));
|
|
}
|
|
|
|
#[test]
|
|
fn the_distance_between_the_scheduled_and_the_due_date_is_kept() {
|
|
let out = toggle("- [ ] Water 🔁 every week ⏳ 2026-10-19 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week ⏳ 2026-10-26 📅 2026-10-27", "- [x] Water 🔁 every week ⏳ 2026-10-19 📅 2026-10-20 ✅ 2026-10-22",]);
|
|
}
|
|
|
|
#[test]
|
|
fn the_scheduled_date_goes_when_the_configuration_says_so() {
|
|
let cfg = ToggleCfg { remove_scheduled_on_recurrence: true, ..ToggleCfg::default() };
|
|
let out = toggle("- [ ] Water 🔁 every week ⏳ 2026-10-19 📅 2026-10-20", today(), &cfg).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week 📅 2026-10-27", "- [x] Water 🔁 every week ⏳ 2026-10-19 📅 2026-10-20 ✅ 2026-10-22",]);
|
|
}
|
|
|
|
#[test]
|
|
fn a_task_with_only_a_start_date_repeats_from_it() {
|
|
let out = toggle("- [ ] Water 🔁 every week 🛫 2026-10-01", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week 🛫 2026-10-08", "- [x] Water 🔁 every week 🛫 2026-10-01 ✅ 2026-10-22",]);
|
|
}
|
|
|
|
#[test]
|
|
fn the_next_occurrence_has_no_id_and_no_dependency() {
|
|
let out = toggle("- [ ] Water 🆔 abc ⛔ def 🔁 every week 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week 📅 2026-10-27", "- [x] Water 🆔 abc ⛔ def 🔁 every week 📅 2026-10-20 ✅ 2026-10-22",]);
|
|
}
|
|
|
|
#[test]
|
|
fn a_task_that_is_dropped_on_completion_keeps_only_the_next_occurrence() {
|
|
let out = toggle("- [ ] Water 🔁 every week 📅 2026-10-20 🏁 delete", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week 🏁 delete 📅 2026-10-27"]);
|
|
assert_eq!(out.next_index, Some(0));
|
|
}
|
|
|
|
#[test]
|
|
fn the_indent_and_the_marker_are_kept_in_the_next_occurrence() {
|
|
let out = toggle(" * [ ] Water 🔁 every week 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, [" * [ ] Water 🔁 every week 📅 2026-10-27", " * [x] Water 🔁 every week 📅 2026-10-20 ✅ 2026-10-22",]);
|
|
}
|
|
|
|
#[test]
|
|
fn a_task_without_a_date_is_only_toggled() {
|
|
let out = toggle("- [ ] Water 🔁 every week", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [x] Water 🔁 every week ✅ 2026-10-22"]);
|
|
assert_eq!(out.next_index, None);
|
|
}
|
|
|
|
#[test]
|
|
fn a_rule_that_does_not_parse_is_only_toggled() {
|
|
let out = toggle("- [ ] Water 🔁 daily 📅 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [x] Water 🔁 daily 📅 2026-10-20 ✅ 2026-10-22"]);
|
|
assert_eq!(out.next_index, None);
|
|
}
|
|
|
|
#[test]
|
|
fn a_next_date_out_of_range_is_only_toggled() {
|
|
let out = toggle("- [ ] Water 🔁 every year 📅 9999-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [x] Water 🔁 every year 📅 9999-10-20 ✅ 2026-10-22"]);
|
|
assert_eq!(out.next_index, None);
|
|
}
|
|
|
|
#[test]
|
|
fn a_task_that_goes_back_to_todo_gets_no_next_occurrence() {
|
|
let out = toggle("- [x] Water 🔁 every week 📅 2026-10-20 ✅ 2026-10-20", today(), &cfg()).expect("a task");
|
|
assert_eq!(out.lines, ["- [ ] Water 🔁 every week 📅 2026-10-20"]);
|
|
assert_eq!(out.next_index, None);
|
|
}
|