Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions mytodo/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
134 changes: 106 additions & 28 deletions mytodo/src/task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,40 @@ pub struct TaskList {
}

impl TaskList {
pub fn add(&mut self, desc: String) -> Result<String> {
self.tasks.push(Task { description: desc, done: false });
Ok("Tugas baru ditambahkan.".to_string())
}

pub fn done(&mut self, id: usize) -> Result<String> {
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<String> {
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<String> {
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<Self> {
Expand All @@ -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");
}
}
4 changes: 2 additions & 2 deletions mytodo/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
"tasks": [
{
"description": "Belajar Rust",
"done": false
"done": true
},
{
"description": "Belajar Kotlin",
"done": false
},
{
"description": "Belajar Bahasa",
"done": false
"done": true
}
]
}