Files
Marcos Paulo 16a0786a2d
ci / ci (macos-latest) (push) Has been cancelled
ci / ci (ubuntu-latest) (push) Has been cancelled
ci / ci (windows-latest) (push) Has been cancelled
feat: recurring task toggle, Templater render, icons in Explorer rows and tabs (MiniMax M3.1 Flash)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-21 11:16:23 -03:00

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);
}