syzygy 0.0.3

Next-gen todo library.
Documentation
mod model;
pub mod rules;

pub use model::Task;
pub use model::Workspace;
pub use model::Recur;
pub use model::RecurState;
pub use rules::*;

#[cfg(test)]
mod tests {
    use super::*;
    use chrono::Local;
    use chrono::Duration;    

    #[test]
    fn task_sanity() {
	let mut w = Workspace::new();
	let id = w.add_task(
	    "Test",
	    Blank::new(),
	    Vec::new()
	);
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Active);
	w.task_complete(id).unwrap();
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.title, "Test");	
	assert_eq!(task.date.active(), RecurState::Dead);
    }    
    
    #[test]
    fn deadline_recur() {
	let now = Local::now();
	let mut w = Workspace::new();
	let id = w.add_task(
	    "Test",
	    Deadline::new(now + Duration::days(4)),
	    Vec::new()
	);
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Active);
	assert_eq!(task.date.current().unwrap(), now + Duration::days(4));	
	w.task_complete(id).unwrap();
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Dead);
    }

    #[test]
    fn constant_recur() {
	let now = Local::now();
	let mut w = Workspace::new();
	let id = w.add_task(
	    "Test",
	    Constant::new(
		now + Duration::days(2),
		Some(now + Duration::days(4)),
		Duration::days(1),
	    ),
	    Vec::new()
	);
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Active);
	w.task_complete(id).unwrap();
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Active);
	assert_eq!(task.date.current().unwrap(), now + Duration::days(3));
	w.task_complete(id).unwrap();
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Active);
	assert_eq!(task.date.current().unwrap(), now + Duration::days(4));
	w.task_complete(id).unwrap();
	let task = w.tasks.get(&id).unwrap();
	assert_eq!(task.date.active(), RecurState::Dead);
    }

    #[test]
    fn date_dep() {	
	let now = Local::now();
	let mut w = Workspace::new();
        let id1 = w.add_task(
	    "TestTask",
	    Blank::new(),
	    vec![Date::new(now + Duration::days(4))],
	);
	assert_eq!(w.task_available(id1).unwrap(), false);
	let id2 = w.add_task(
	    "TestTask2",
	    Blank::new(),
	    vec![Date::new(now - Duration::days(4))],
	);
	assert_eq!(w.task_available(id2).unwrap(), true);
    }

    #[test]
    fn reldate_dep() {	
	let now = Local::now();
	let mut w = Workspace::new();
        let id1 = w.add_task(
	    "TestTask",
	    Deadline::new(now + Duration::days(4)),
	    vec![RelativeDate::new(Duration::days(2))]
	);
	assert_eq!(w.task_available(id1).unwrap(), false);
	let id2 = w.add_task(
	    "TestTask2",
	    Deadline::new(now + Duration::days(4)),
	    vec![RelativeDate::new(Duration::days(5))]
	);
	assert_eq!(w.task_available(id2).unwrap(), true);
    }
    
    #[test]
    fn direct_dep() {	
	let now = Local::now();
	let mut w = Workspace::new();
        let id1 = w.add_task(
	    "TestTask",
	    Blank::new(),
	    Vec::new()
	);
	let id2 = w.add_task(
	    "TestTask2",
	    Deadline::new(now + Duration::days(4)),
	    vec![Direct::new(id1)]
	);
	assert_eq!(w.task_available(id2).unwrap(), false);
	w.task_complete(id1).unwrap();
	assert_eq!(w.task_available(id2).unwrap(), true);
    }

    #[test]
    fn multiple_deps() {
	let now = Local::now();
	let mut w = Workspace::new();
        let id1 = w.add_task("TestTask", Blank::new(), Vec::new());
	let id2 = w.add_task(
	    "TestTask2",
	    Deadline::new(now + Duration::days(4)),
	    vec![Direct::new(id1), Date::new(now + Duration::days(1))]
	);
	assert_eq!(w.task_available(id2).unwrap(), false);
	w.task_complete(id1).unwrap();
	assert_eq!(w.task_available(id2).unwrap(), false);
	let id3 = w.add_task("TestTask", Blank::new(), Vec::new());
	let id4 = w.add_task(
	    "TestTask2",
	    Deadline::new(now + Duration::days(4)),
	    vec![Direct::new(id3), Date::new(now - Duration::days(1))]
	);
	assert_eq!(w.task_available(id4).unwrap(), false);
	w.task_complete(id3).unwrap();
	assert_eq!(w.task_available(id4).unwrap(), true);
    }
}