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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

.DS_Store

# User-specific files
*.rsuser
*.suo
Expand Down Expand Up @@ -360,4 +362,4 @@ MigrationBackup/
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd
20 changes: 20 additions & 0 deletions domain-model.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
> Note that this does not reflect actuall solution as changes has been made to classes.

| Class | Feature | Method/Property | Input | Output |
|-------|---------|-----------------|-------|--------|
| List | Add task to list | addTask() | Task() | |
| List | Edit status on task | setStatus() | Task(), Bool | Bool |
| List | Edit status on task by ID | setStatusOnTask() | int, Bool | Bool |
| List | Remove task from list | removeTask() | int | Bool |
| List | Get smallest/largest time delta | getTimeDelta() | Bool | TimeSpan |
| List | Get all tasks | getAllTasks() | | [Task()] |
| List | Get all tasks in ascending/descending order | getAllTasks() | Bool | [Task()] |
| List | Get all completed/incomplete tasks | getAllTasks() | Bool | [Task()] |
| List | Get task by search | getTask() | String | Task() / Error |
| List | Get task by ID | getTask() | int | Task() / Error |
| Task | Set task priority | _priority | Enum | |
| Task | Set task ID | _uid | int | |
| Task | Set task name | _name | string | |
| Task | Set task description | _text | string | |
| Task | See creation date/time | _created | DateTime | |
| Task | See completion date/time | _completed | DateTime | |
13 changes: 11 additions & 2 deletions tdd-todo-list.CSharp.Main/Program.cs
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
using tdd_todo_list.CSharp.Main;
using Task = tdd_todo_list.CSharp.Main.Task;
using TaskStatus = tdd_todo_list.CSharp.Main.TaskStatus;

TodoList list = new TodoList();
list.addTask("Task 1", "Desc 1", TaskPriority.Medium, TaskCategory.Admin);

bool changedToComplete = list.setStatus(0, TaskStatus.Complete);

List<Task> completes = list.getAllTasks(TaskStatus.Complete);
completes.ForEach(t => Console.WriteLine(t));
178 changes: 178 additions & 0 deletions tdd-todo-list.CSharp.Main/ToDoList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,183 @@ namespace tdd_todo_list.CSharp.Main
{
public class TodoList
{
private int _taskCounter = 0;
private List<Task> _tasks = new List<Task>();

public void addTask(string name, string description, TaskPriority priority, TaskCategory category)
{
_tasks.Add(new Task(_taskCounter++, name, description, TaskStatus.Incomplete, priority, category));
}

public Task? getTask(int id)
{
return _tasks.FirstOrDefault(t => t.uid.Equals(id));
}

public List<Task> getAllTasks()
{
return _tasks;
}

public List<Task> getAllTasks(bool ascending)
{
if (ascending)
{
return [.. _tasks.OrderBy(t => t.name)];
}
return [.. _tasks.OrderByDescending(t => t.name)];
}

public List<Task> getAllTasks(TaskStatus status)
{
return [.. _tasks.Where(t => t.status.Equals(status))];
}

public List<Task> getAllTasks(TaskCategory category)
{
return [.. _tasks.Where(t => t.category.Equals(category))];
}

public List<Task> getTasksLongerThan(TimeSpan timeDate)
{
return [.. _tasks.Where(t => t.timeDelta() > timeDate)];
}

public TimeSpan? getLargestTimeDelta()
{
TimeSpan? result = null;

foreach (Task t in _tasks)
{
if (t.status != TaskStatus.Complete) continue;
TimeSpan? d = t.timeDelta();
if (d == null) continue;
if (result == null || d > result) result = d;
}

return result;
}

public TimeSpan? getSmallestTimeDelta()
{
TimeSpan? result = null;

foreach (Task t in _tasks)
{
if (t.status != TaskStatus.Complete) continue;
TimeSpan? d = t.timeDelta();
if (d == null) continue;
if (result == null || d < result) result = d;
}

return result;
}

public bool setStatus(int id, TaskStatus status)
{
Task? t = _tasks.FirstOrDefault(t => t.uid.Equals(id));
if (t == null) return false;
t.setStatus(status);
return true;
}

public bool setName(int id, string name)
{
Task? t = _tasks.FirstOrDefault(t => t.uid.Equals(id));
if (t == null) return false;

t.name = name;
return true;


}

public Task findTask(string name)
{
Task? t = _tasks.FirstOrDefault(t => t.name.Equals(name));

if (t != null)
{
return t;
}

throw new KeyNotFoundException($"No task with name \"{name}\"");
}

public bool removeTask(int id)
{
Task? t = _tasks.FirstOrDefault(t => t.uid.Equals(id));
if (t == null) return false;
return _tasks.Remove(t);
}

public override string ToString()
{
StringBuilder s = new();
foreach (Task t in _tasks)
{
s.Append($"{t}");
}

return s.ToString();
}
}

public class Task(int id, string name, string description, TaskStatus status, TaskPriority priority, TaskCategory category)
{
public int uid = id;
public string name = name;
public string description = description;
public TaskStatus status = status;
public TaskPriority priority = priority;
public TaskCategory category = category;
public DateTime created = DateTime.Now;
public DateTime? completed = null;

public TimeSpan? timeDelta()
{
if (completed == null) return DateTime.Now - created;

return completed - created;
}

public void setStatus(TaskStatus newStatus)
{
this.status = newStatus;
if (newStatus == TaskStatus.Complete)
{
this.completed = DateTime.Now;
}
else // Incomplete
{
this.completed = null;
}
}

public override string ToString()
{
return $"{uid} | {category} | {status} | {(completed != null ? completed : "-")} | {created} | {priority} \n\tName: {name} \n\tDescriptions: {description}\n";
}
}

public enum TaskPriority
{
Low,
Medium,
High,
None
}

public enum TaskStatus
{
Complete,
Incomplete
}

public enum TaskCategory
{
Study,
Work,
Admin
}
}
Loading