From 35e5aa2ee58a2b4e46b27ca455dbb7bf718c88b1 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 22 Nov 2023 20:47:21 -0500 Subject: [PATCH] Add hulk.test module to test kernel functionality --- src/hulk/hulk.d | 4 ++ src/hulk/test.d | 131 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 src/hulk/test.d diff --git a/src/hulk/hulk.d b/src/hulk/hulk.d index cc1095d..4322c50 100644 --- a/src/hulk/hulk.d +++ b/src/hulk/hulk.d @@ -25,6 +25,7 @@ import hulk.serial; import hulk.usb; import hulk.pit; import hulk.time; +import hulk.test; extern extern(C) __gshared ubyte _hulk_bss_size; @@ -97,6 +98,9 @@ void hulk_start() } Klog.writefln("\a5HULK Initialization Complete!"); + /* Run kernel tests. */ + Test.run(); + /* Idle loop. */ Time.msleep(1); for (;;) diff --git a/src/hulk/test.d b/src/hulk/test.d new file mode 100644 index 0000000..bee1b89 --- /dev/null +++ b/src/hulk/test.d @@ -0,0 +1,131 @@ +/** + * Kernel tests. + */ +module hulk.test; + +import hulk.klog; +import hulk.list; + +struct Test +{ + /** + * Run tests. + */ + public static void run() + { + Klog.writefln("\a3Running kernel tests"); + test_list(); + Klog.writefln("\a3Kernel tests complete"); + } + + private static void test_list() + { + Klog.writefln("Testing list..."); + List!ulong list; + assert_eq(null, list.head); + assert_eq(null, list.tail); + ulong v = 33; + list.add(42); + assert_neq(null, list.head); + assert_neq(null, list.tail); + list.add(v); + list.add(0xFFFF); + v = 55; + size_t count; + assert_eq(3, list.count); + foreach (entry; list) + { + switch (count) + { + case 0: + assert_eq(42, entry); + break; + case 1: + assert_eq(33, entry); + break; + case 2: + assert_eq(0xFFFF, entry); + break; + case 3: + assert_eq(0, 1); + break; + default: + break; + } + count++; + } + foreach (entry; list) + { + if (entry == 33) + { + list.remove(entry); + } + } + assert_eq(2, list.count); + count = 0; + foreach (entry; list) + { + switch (count) + { + case 0: + assert_eq(42, entry); + break; + case 1: + assert_eq(0xFFFF, entry); + break; + case 2: + assert_eq(0, 1); + break; + default: + break; + } + count++; + } + foreach (entry; list) + { + if (entry == 42) + { + list.remove(entry); + } + } + assert_eq(1, list.count); + count = 0; + foreach (entry; list) + { + switch (count) + { + case 0: + assert_eq(0xFFFF, entry); + break; + case 1: + assert_eq(0, 1); + break; + default: + break; + } + count++; + } + assert_neq(null, list.head); + assert_neq(null, list.tail); + list.remove(list.head); + assert_eq(0, list.count); + assert_eq(null, list.head); + assert_eq(null, list.tail); + } + + private static void assert_eq(T)(T first, T second) + { + if (first != second) + { + Klog.fatal_error("Assertion failed! %x != %x", first, second); + } + } + + private static void assert_neq(T)(T first, T second) + { + if (first == second) + { + Klog.fatal_error("Assertion failed! %x == %x", first, second); + } + } +}