1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package lunatask_test
6
7import (
8 "encoding/json"
9 "testing"
10
11 lunatask "git.secluded.site/go-lunatask"
12)
13
14func TestAllTaskStatuses(t *testing.T) {
15 t.Parallel()
16
17 statuses := lunatask.AllTaskStatuses()
18
19 // Check count
20 if got := len(statuses); got != 5 {
21 t.Fatalf("AllTaskStatuses() returned %d values, want 5", got)
22 }
23
24 // Check order
25 expected := []lunatask.TaskStatus{
26 lunatask.StatusLater,
27 lunatask.StatusNext,
28 lunatask.StatusInProgress,
29 lunatask.StatusWaiting,
30 lunatask.StatusCompleted,
31 }
32 for i, want := range expected {
33 if statuses[i] != want {
34 t.Errorf("AllTaskStatuses()[%d] = %q, want %q", i, statuses[i], want)
35 }
36 }
37
38 // Check roundtrip: each value should be parseable
39 for _, status := range statuses {
40 parsed, err := lunatask.ParseTaskStatus(status.String())
41 if err != nil {
42 t.Errorf("ParseTaskStatus(%q) failed: %v", status.String(), err)
43 }
44
45 if parsed != status {
46 t.Errorf("ParseTaskStatus(%q) = %q, want %q", status.String(), parsed, status)
47 }
48 }
49}
50
51func TestParseTaskStatus(t *testing.T) {
52 t.Parallel()
53
54 tests := []struct {
55 name string
56 input string
57 want lunatask.TaskStatus
58 wantErr bool
59 }{
60 {"later_lower", "later", lunatask.StatusLater, false},
61 {"later_upper", "LATER", lunatask.StatusLater, false},
62 {"later_mixed", "LaTeR", lunatask.StatusLater, false},
63 {"next_lower", "next", lunatask.StatusNext, false},
64 {"next_upper", "NEXT", lunatask.StatusNext, false},
65 {"in_progress_lower", "in-progress", lunatask.StatusInProgress, false},
66 {"in_progress_upper", "IN-PROGRESS", lunatask.StatusInProgress, false},
67 {"in_progress_mixed", "In-Progress", lunatask.StatusInProgress, false},
68 {"waiting_lower", "waiting", lunatask.StatusWaiting, false},
69 {"waiting_upper", "WAITING", lunatask.StatusWaiting, false},
70 {"completed_lower", "completed", lunatask.StatusCompleted, false},
71 {"completed_upper", "COMPLETED", lunatask.StatusCompleted, false},
72 {"completed_mixed", "CoMpLeTeD", lunatask.StatusCompleted, false},
73 {"invalid", "invalid", "", true},
74 {"empty", "", "", true},
75 {"numeric", "1", "", true},
76 {"typo", "completd", "", true},
77 }
78
79 for _, testCase := range tests {
80 t.Run(testCase.name, func(t *testing.T) {
81 t.Parallel()
82
83 got, err := lunatask.ParseTaskStatus(testCase.input)
84 if (err != nil) != testCase.wantErr {
85 t.Errorf("ParseTaskStatus(%q) error = %v, wantErr %v", testCase.input, err, testCase.wantErr)
86
87 return
88 }
89
90 if !testCase.wantErr && got != testCase.want {
91 t.Errorf("ParseTaskStatus(%q) = %q, want %q", testCase.input, got, testCase.want)
92 }
93 })
94 }
95}
96
97func TestTaskStatus_MarshalJSON(t *testing.T) {
98 t.Parallel()
99
100 tests := []struct {
101 name string
102 value lunatask.TaskStatus
103 want string
104 }{
105 {"later", lunatask.StatusLater, `"later"`},
106 {"next", lunatask.StatusNext, `"next"`},
107 {"in_progress_to_started", lunatask.StatusInProgress, `"started"`},
108 {"waiting", lunatask.StatusWaiting, `"waiting"`},
109 {"completed", lunatask.StatusCompleted, `"completed"`},
110 }
111
112 for _, testCase := range tests {
113 t.Run(testCase.name, func(t *testing.T) {
114 t.Parallel()
115
116 got, err := json.Marshal(testCase.value)
117 if err != nil {
118 t.Fatalf("Marshal error: %v", err)
119 }
120
121 if string(got) != testCase.want {
122 t.Errorf("json.Marshal(%q) = %s, want %s", testCase.value, got, testCase.want)
123 }
124 })
125 }
126}
127
128func TestTaskStatus_UnmarshalJSON(t *testing.T) {
129 t.Parallel()
130
131 tests := []struct {
132 name string
133 input string
134 want lunatask.TaskStatus
135 wantErr bool
136 }{
137 {"later", `"later"`, lunatask.StatusLater, false},
138 {"next", `"next"`, lunatask.StatusNext, false},
139 {"started_to_in_progress", `"started"`, lunatask.StatusInProgress, false},
140 {"in_progress", `"in-progress"`, lunatask.StatusInProgress, false},
141 {"waiting", `"waiting"`, lunatask.StatusWaiting, false},
142 {"completed", `"completed"`, lunatask.StatusCompleted, false},
143 {"invalid_type", `123`, "", true},
144 }
145
146 for _, testCase := range tests {
147 t.Run(testCase.name, func(t *testing.T) {
148 t.Parallel()
149
150 var got lunatask.TaskStatus
151
152 err := json.Unmarshal([]byte(testCase.input), &got)
153
154 if (err != nil) != testCase.wantErr {
155 t.Errorf("Unmarshal error = %v, wantErr %v", err, testCase.wantErr)
156
157 return
158 }
159
160 if !testCase.wantErr && got != testCase.want {
161 t.Errorf("Unmarshal(%s) = %q, want %q", testCase.input, got, testCase.want)
162 }
163 })
164 }
165}