diff --git a/mytodo/src/lib.rs b/mytodo/src/lib.rs index 9204f39..4d1f70e 100644 --- a/mytodo/src/lib.rs +++ b/mytodo/src/lib.rs @@ -29,18 +29,18 @@ pub fn run(cli: Cli) -> Result<()> { match cli.command { Commands::Add { description } => { - tasks.add(description); + println!("{}", tasks.add(description)?); updated = true; } Commands::List => { - tasks.print(); + println!("{}", tasks.print()?); } Commands::Done { id } => { - tasks.done(id)?; + println!("{}", tasks.done(id)?); updated = true; } Commands::Remove { id } => { - tasks.remove(id)?; + println!("{}", tasks.remove(id)?); updated = true; } } diff --git a/mytodo/src/task.rs b/mytodo/src/task.rs index 9ad7bbe..ef81747 100644 --- a/mytodo/src/task.rs +++ b/mytodo/src/task.rs @@ -15,6 +15,40 @@ pub struct TaskList { } impl TaskList { + pub fn add(&mut self, desc: String) -> Result { + self.tasks.push(Task { description: desc, done: false }); + Ok("Tugas baru ditambahkan.".to_string()) + } + + pub fn done(&mut self, id: usize) -> Result { + if id == 0 || id > self.tasks.len() { + bail!("Nomor tugas {} tidak ditemukan.", id); + } + self.tasks[id - 1].done = true; + Ok(format!("Tugas {} ditandai selesai.", id)) + } + + pub fn remove(&mut self, id: usize) -> Result { + if id == 0 || id > self.tasks.len() { + bail!("Nomor tugas {} tidak ditemukan.", id); + } + self.tasks.remove(id - 1); + Ok(format!("Tugas {} dihapus.", id)) + } + + pub fn print(&self) -> Result { + if self.tasks.is_empty() { + return Ok("(Belum ada tugas)".to_string()); + } + + let mut output = String::from("Daftar Tugas:"); + for (i, task) in self.tasks.iter().enumerate() { + let status = if task.done { "[x]" } else { "[ ]" }; + output.push_str(&format!("\n{}. {} {}", i + 1, status, task.description)); + } + Ok(output) + } + const FILE_PATH: &'static str = "tasks.json"; pub fn load() -> Result { @@ -33,40 +67,84 @@ impl TaskList { fs::write(Self::FILE_PATH, data)?; Ok(()) } +} - pub fn add(&mut self, desc: String) { - self.tasks.push(Task { description: desc, done: false }); - println!("Tugas baru ditambahkan."); +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_add_task() { + let mut list = TaskList::default(); + + let _ = list.add("Belajar Rust".into()); + + assert_eq!(list.tasks.iter().len(), 1); + assert_eq!(list.tasks[0].description, "Belajar Rust"); + assert_eq!(list.tasks[0].done, false); } - pub fn print(&self) { - if self.tasks.is_empty() { - println!("(Belum ada tugas)"); - return; - } + #[test] + fn test_done_task_success() { + let mut list = TaskList::default(); + let _ = list.add("Belajar Rust".into()); - println!("Daftar Tugas:"); - for (i, task) in self.tasks.iter().enumerate() { - let status = if task.done { "[x]" } else { "[ ]" }; - println!("{}. {} {}", i + 1, status, task.description); - } + let msg = list.done(1).unwrap(); + + assert_eq!(msg, "Tugas 1 ditandai selesai."); + assert_eq!(list.tasks[0].done, true); } - pub fn done(&mut self, id: usize) -> Result<()> { - if id == 0 || id > self.tasks.len() { - bail!("Nomor tugas {} tidak ditemukan", id); - } - self.tasks[id - 1].done = true; - println!("Tugas {} ditandai selesai.", id); - Ok(()) + #[test] + fn test_done_task_failed() { + let mut list = TaskList::default(); + let _ = list.add("Belajar Rust".into()); + + let err_msg = list.done(10).unwrap_err(); + + assert_eq!(err_msg.to_string(), "Nomor tugas 10 tidak ditemukan."); + assert_eq!(list.tasks[0].done, false); } - pub fn remove(&mut self, id: usize) -> Result<()> { - if id == 0 || id > self.tasks.len() { - bail!("Nomor tugas {} tidak ditemukan", id); - } - self.tasks.remove(id - 1); - println!("Tugas {} dihapus.", id); - Ok(()) + #[test] + fn test_remove_task_success() { + let mut list = TaskList::default(); + let _ = list.add("Belajar Rust".into()); + + let msg = list.remove(1).unwrap(); + + assert_eq!(msg, "Tugas 1 dihapus."); + assert_eq!(list.tasks.is_empty(), true); } -} + + #[test] + fn test_remove_task_failed() { + let mut list = TaskList::default(); + let _ = list.add("Belajar Rust".into()); + + let err_msg = list.remove(10).unwrap_err(); + + assert_eq!(err_msg.to_string(), "Nomor tugas 10 tidak ditemukan."); + assert_eq!(list.tasks.is_empty(), false); + } + + #[test] + fn test_print_empty() { + let list = TaskList::default(); + + let output = list.print().unwrap(); + + assert_eq!(output, "(Belum ada tugas)"); + } + + #[test] + fn test_print_tasks() { + let mut list = TaskList::default(); + let _ = list.add("Belajar Rust".into()); + let _ = list.add("Belajar Unit Test".into()); + + let output = list.print().unwrap(); + + assert_eq!(output, "Daftar Tugas:\n1. [ ] Belajar Rust\n2. [ ] Belajar Unit Test"); + } +} \ No newline at end of file diff --git a/mytodo/tasks.json b/mytodo/tasks.json index d03d74d..f789957 100644 --- a/mytodo/tasks.json +++ b/mytodo/tasks.json @@ -2,7 +2,7 @@ "tasks": [ { "description": "Belajar Rust", - "done": false + "done": true }, { "description": "Belajar Kotlin", @@ -10,7 +10,7 @@ }, { "description": "Belajar Bahasa", - "done": false + "done": true } ] } \ No newline at end of file