diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-22 02:59:58 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-22 03:00:08 +0000 |
| commit | bb44db8e61a40d4fcd31a87140f3c61aed551a2c (patch) | |
| tree | 7a79a68508e78e7c8f10913fa98a47075b962db5 /tests/generics/test_generic_empty_struct.zc | |
| parent | f912e071eaaa362b369626d7312589d4c9ac311b (diff) | |
This one is big, it solves several bugs that were not detected.
Diffstat (limited to 'tests/generics/test_generic_empty_struct.zc')
| -rw-r--r-- | tests/generics/test_generic_empty_struct.zc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tests/generics/test_generic_empty_struct.zc b/tests/generics/test_generic_empty_struct.zc new file mode 100644 index 0000000..f3e3c39 --- /dev/null +++ b/tests/generics/test_generic_empty_struct.zc @@ -0,0 +1,85 @@ +struct Optional<T> { + value: T; + valid: bool; +} + +impl Optional<T> { + fn get(self) -> T { + assert(self.valid, "Optional does not contain value"); + return self.value; + } + + fn has_value(self) -> bool { + return self.valid; + } + + fn emplace(self, value: T) { + self.value = value; + self.valid = true; + } + + fn reset(self) { + self.valid = false; + } +} + +struct Stack<T> { + data: T*; + len: u64; + cap: u64; +} + +impl Stack<T> { + fn new() -> Stack<T> { + return Stack<T> { + data: NULL, + len: 0, + cap: 0 + }; + } + + fn free(self) { + if (self.data) { + free(self.data); + } + self.len = 0; + } + + fn clear(self) { + self.len = 0; + } + + fn push(self, value: T) { + if (!self.data) { + self.cap = 8; + self.data = malloc(sizeof(T) * self.cap); + } + if self.len == self.cap { + self.cap = self.cap * 2; + self.data = realloc(self.data, sizeof(T) * self.cap); + } + + self.data[self.len] = value; + self.len = self.len + 1; + } + + fn pop(self) -> Optional<T> { + if (self.len > 0) { + var result = Optional<T>{}; + result.emplace(self.data[self.len - 1]); + self.len = self.len - 1; + return result; + } + return Optional<T>{}; + } +} + +test "Generic Empty Struct Init" { + var s = Stack<i32>{}; + defer s.free(); + s.push(123); + var result = s.pop(); + + assert(result.has_value(), "Result should have value"); + assert(result.get() == 123, "Result value should be 123"); +} |
