parallax 1.0
command-line based task/todo manager
Loading...
Searching...
No Matches
test.c File Reference

Contains the testing modules for unit and runtime tests. More...

#include <stdlib.h>
#include <stdio.h>
#include "argparse.h"
#include "hashmap.h"
#include "task.h"
#include "test.h"

Go to the source code of this file.

Functions

int argparse_test ()
int task_test ()
void runtime_test ()

Detailed Description

Contains the testing modules for unit and runtime tests.

Definition in file test.c.

Function Documentation

◆ argparse_test()

int argparse_test ( )

we can define a test as a function that returns 1 if passed, and 0 otherwise

unit tests:

  • argument parsing
  • tasks
  • runtime
Note
These are tests for the procedures in argparse.h

INITIAL CONDITIONS Procedure: get_flag Condition: valid command with create flag Expected output: FLAG_CREATE

Procedure: get_flag Condition: valid command with remove flag Expected output: FLAG_REMOVE

Procedure: get_flag Condition: valid command with list flag Expected output: FLAG_LIST

Procedure: get_flag Condition: valid command with modify flag Expected output: FLAG_MODIFY

Procedure: get_flag Condition: invalid valid command (incorrect flag) Expected output: FLAG_INVALID

Procedure: get_content_arg Condition: valid command with standard content Expected output: extracted content_string

Procedure: get_content_arg Condition: valid command with standard content Expected output: extracted content_string

Definition at line 25 of file test.c.

26{
30 //test setup
31 char* argv[5];
32
33 const int COMMAND_INDEX = 0;
34 const int FLAG_INDEX = 1;
35 const int CONTENT_INDEX = 2;
36 const int CLASS_INDEX = 3;
37
38 //possible values
39 const char* command_string = "./prlx";
40 const char* create_flag = "-c";
41 const char* modify_flag = "-m";
42 const char* remove_flag = "-r";
43 const char* list_flag = "-l";
44 const char* invalid_flag = "-k";
45 const char* content_string = "this is a test";
46 const char* class_string = "class";
47
48 printf("---- Flag Tests ----\n");
55 argv[COMMAND_INDEX] = command_string;
56 argv[FLAG_INDEX] = create_flag;
57 argv[CONTENT_INDEX] = content_string;
58 argv[CLASS_INDEX] = class_string;
59
60 if ( get_flag(argv[FLAG_INDEX]) != FLAG_CREATE )
61 {
62 printf("[FAILED] @ create flag\n");
63 return 0;
64 } else {
65 printf("[PASSED] @ create flag\n");
66 }
67
73 argv[FLAG_INDEX] = remove_flag;
74 if ( get_flag(argv[FLAG_INDEX]) != FLAG_REMOVE )
75 {
76 printf("[FAILED] @ remove flag\n");
77 return 0;
78 } else {
79 printf("[PASSED] @ remove flag\n");
80 }
81
87 argv[FLAG_INDEX] = list_flag;
88 if ( get_flag(argv[FLAG_INDEX]) != FLAG_LIST )
89 {
90 printf("[FAILED] @ list flag\n");
91 return 0;
92 } else {
93 printf("[PASSED] @ list flag\n");
94 }
100 argv[FLAG_INDEX] = modify_flag;
101 if ( get_flag(argv[FLAG_INDEX]) != FLAG_MODIFY )
102 {
103 printf("[FAILED] @ modify flag\n");
104 return 0;
105 } else {
106 printf("[PASSED] @ modify flag\n");
107 }
108
114 argv[FLAG_INDEX] = invalid_flag;
115 if ( get_flag(argv[FLAG_INDEX]) != FLAG_INVALID )
116 {
117 printf("[FAILED] @ invalid flag\n");
118 return 0;
119 } else {
120 printf("[PASSED] @ invalid flag\n");
121 }
122
123 printf("---- Content Extraction Tests ----\n");
129 char* test_content = get_content_arg(argv[CONTENT_INDEX]);
130 if ( strcmp(test_content, content_string) != 0 )
131 {
132 printf("[FAILED] @ content string extraction\n");
133 return 0;
134 } else {
135 printf("[PASSED] @ content string extraction\n");
136 }
137
143 char* test_class = get_content_arg(argv[CLASS_INDEX]);
144 if ( strcmp(test_class, class_string) != 0 )
145 {
146 printf("[FAILED] @ class string extraction\n");
147 return 0;
148 } else {
149 printf("[PASSED] @ class string extraction\n");
150 }
151 return 1;
152}
@ FLAG_REMOVE
Definition argparse.h:18
@ FLAG_LIST
Definition argparse.h:19
@ FLAG_CREATE
Definition argparse.h:16
@ FLAG_MODIFY
Definition argparse.h:17
@ FLAG_INVALID
Definition argparse.h:20

◆ runtime_test()

void runtime_test ( )

Definition at line 267 of file test.c.

268{
269 const size_t RUNTIME_COLLECTION_SIZE = 50;
270 TaskCollection* runtime_task_collection = create_task_collection(RUNTIME_COLLECTION_SIZE);
271 TaskClass* runtime_task_class = NULL;
272 Task* runtime_task = NULL;
273
274 system("cat ./misc/logo.txt");
275
276 if (runtime_task_collection == NULL)
277 {
278 printf("Runtime test error: failed to create task collection\n");
279 return;
280 }
281 while (1)
282 {
283 char class_name[1024];
284 char task_content[1024];
285 char yn[16];
286
287 printf("Enter todo class/category: ");
288 fgets(class_name, sizeof(class_name), stdin);
289 if ( strlen(class_name) > 0 && (class_name[ strlen(class_name) - 1] == '\n') )
290 {
291 class_name[ strlen(class_name) - 1 ] = '\0';
292 }
293
294 if ( strcmp(class_name, "quit") == 0 ) {
295 return;
296 }
297
298 printf("Enter description: ");
299 fgets(task_content, sizeof(task_content), stdin);
300 if ( strlen(task_content) > 0 && (task_content[ strlen(task_content) - 1] == '\n') )
301 {
302 task_content[ strlen(task_content) - 1 ] = '\0';
303 }
304
305 printf("---- Summary ----\nclass: '%s'\ncontent:'%s'\n---------------\nContinue? (y/n) ", class_name, task_content);
306 fgets(yn, sizeof(yn), stdin);
307 if ( strlen(yn) > 0 && (yn[ strlen(yn) - 1] == '\n') )
308 {
309 yn[ strlen(yn) - 1 ] = '\0';
310 }
311 if ( strcmp(&yn[0], "y") != 0 )
312 {
313 continue;
314 }
315
316 system("clear");
317
318 runtime_task = create_task(class_name, task_content);
319 if (runtime_task == NULL)
320 {
321 printf("Runtime test error: failed to create task\n");
322 return;
323 }
324
325 runtime_task_class =get_task_class(runtime_task_collection, class_name);
326 if (runtime_task_class == NULL) // class does not exist; create it
327 {
328 printf("Class '%s' does not exist. Creating...\n", class_name);
329 add_task_class(runtime_task_collection, create_task_class(class_name, RUNTIME_COLLECTION_SIZE));
330 runtime_task_class = get_task_class(runtime_task_collection, class_name);
331 add_task(runtime_task_class, runtime_task);
332 printf("Appended task to '%s'\n\n", class_name);
333 } else {
334 if ( get_task(runtime_task_class, task_content) != NULL )
335 {
336 printf("Runtime error: task already exists in '%s'\n", class_name);
337 continue;
338 }
339 printf("Appending task to '%s'...\n", class_name);
340 add_task(runtime_task_class, runtime_task);
341 printf("Appended task to '%s'\n\n", class_name);
342 }
343 printf("Enter category name 'quit' to exit runtime test\n");
344 system("sleep 4");
345 system("clear");
346 }
347
348 return;
349}
A task class containing other tasks.
Definition task.h:40
A task collection containing other classes.
Definition task.h:53
A basic task.
Definition task.h:29
TaskClass * get_task_class(TaskCollection *task_collection, const char *key)
Gets a task class by its class name from a task collection.
Definition task.c:98
void add_task_class(TaskCollection *task_collection, TaskClass *task_class)
Adds a task class to a task collection.
Definition task.c:123
TaskCollection * create_task_collection(size_t collection_size)
Creates a task collection of known size.
Definition task.c:36
Task * create_task(char *class_of_task, char *task_content)
Creates a task of known class and content.
Definition task.c:16
Task * get_task(TaskClass *task_class, const char *key)
Finds a task in a task class by its content.
Definition task.c:47
TaskClass * create_task_class(char *class_name, size_t class_size)
Creates a task class of a known class and size.
Definition task.c:24
void add_task(TaskClass *task_class, Task *new_task)
Adds a task to a task class.
Definition task.c:74

◆ task_test()

int task_test ( )

Definition at line 154 of file test.c.

155{
156 // initial conditions
157 Task* test_task = NULL;
158 TaskClass* test_task_class = NULL;
159 TaskCollection* test_task_collection = NULL;
160 const char* CLASS = "class";
161 const char* CONTENT = "test content";
162 const size_t TABLE_SIZE = 100;
163
164 printf("---- Task Structures Test ----\n");
165 //Test 1: Task Creation
166 test_task = create_task(CLASS, CONTENT);
167 if (test_task == NULL)
168 {
169 printf("[FAILED] @ task creation\n");
170 return 0;
171 } else if ( test_task->task_class != CLASS )
172 {
173 printf("[FAILED] @ task class initialization\n");
174 return 0;
175 } else if ( test_task->task_content != CONTENT )
176 {
177 printf("[FAILED] @ task content initialization\n");
178 return 0;
179 } else {
180 printf("[PASSED] @ task initialization\n");
181 }
182
183 test_task_class = create_task_class(CLASS, TABLE_SIZE);
184 if (test_task_class == NULL)
185 {
186 printf("[FAILED] @ task class creation\n");
187 return 0;
188 } else if (test_task_class->task_class_name == NULL)
189 {
190 printf("[FAILED] @ task class name initialization\n");
191 return 0;
192 } else if (test_task_class->table_size != TABLE_SIZE)
193 {
194 printf("[FAILED] @ task class table size initialization\n");
195 return 0;
196 } else if (test_task_class->task_class_table == NULL)
197 {
198 printf("[FAILED] @ task class table initialization\n");
199 return 0;
200 } else {
201 printf("[PASSED] @ task class initialization\n");
202 }
203
204 test_task_collection = create_task_collection(TABLE_SIZE);
205 if (test_task_collection == NULL)
206 {
207 printf("[FAILED] @ task collection creation\n");
208 return 0;
209 } else if (test_task_collection->collection_size != TABLE_SIZE)
210 {
211 printf("[FAILED] @ task collection table size initialization\n");
212 return 0;
213 } else if (test_task_collection->task_collection == NULL)
214 {
215 printf("[FAILED] @ task collection table initialization\n");
216 return 0;
217 } else {
218 printf("[PASSED] @ task collection initialization\n");
219 }
220 //end of task initialization procedures
221
222 //start of hashmap operations
223 add_task(test_task_class, test_task);
224 add_task_class(test_task_collection, test_task_class);
225
226 Task* find_task = get_task(test_task_class, CONTENT);
227 if (find_task == NULL)
228 {
229 printf("[FAILED] @ task lookup\n");
230 return 0;
231 } else {
232 printf("[PASSED] @ task lookup\n");
233 }
234
235 Task* find_task_class = get_task_class(test_task_collection, CLASS);
236 if (find_task_class == NULL)
237 {
238 printf("[FAILED] @ task class lookup\n");
239 return 0;
240 } else {
241 printf("[PASSED] @ task class lookup\n");
242 }
243
244 remove_task(test_task_class, CONTENT);
245 find_task = get_task(test_task_class, CONTENT);
246 if (find_task != NULL)
247 {
248 printf("[FAILED] @ task deletion\n");
249 return 0;
250 } else {
251 printf("[PASSED] @ task deletion\n");
252 }
253
254 remove_task_class(test_task_collection, CLASS);
255 find_task_class = get_task_class(test_task_collection, CLASS);
256 if (find_task_class != NULL)
257 {
258 printf("[FAILED] @ task class deletion\n");
259 return 0;
260 } else {
261 printf("[PASSED] @ task class deletion\n");
262 }
263 //end of hashmap operations
264 return 1;
265}
char * task_class_name
Definition task.h:41
size_t table_size
Definition task.h:42
HashMap * task_class_table
Definition task.h:43
HashMap * task_collection
Definition task.h:54
size_t collection_size
Definition task.h:55
char * task_content
Definition task.h:31
char * task_class
Definition task.h:30
void remove_task(TaskClass *task_class, char *task_content)
Removes a task from a task class by its content.
Definition task.c:140
void remove_task_class(TaskCollection *task_collection, char *class_name)
Removes a task class from a task collection.
Definition task.c:156