From 5c3274f8ff9eace993922dd3fafcbf46908548a7 Mon Sep 17 00:00:00 2001 From: gabrieldemarmiesse Date: Tue, 5 Dec 2023 15:12:49 +0000 Subject: [PATCH] Finished all tests --- stdlib_extensions/builtins/_generic_list.mojo | 43 +++++++------ .../stdlib_tests/builtins/test_list.mojo | 63 +++++++++++++++++++ 2 files changed, 87 insertions(+), 19 deletions(-) diff --git a/stdlib_extensions/builtins/_generic_list.mojo b/stdlib_extensions/builtins/_generic_list.mojo index 9c0e1a6..457c5ad 100644 --- a/stdlib_extensions/builtins/_generic_list.mojo +++ b/stdlib_extensions/builtins/_generic_list.mojo @@ -11,6 +11,13 @@ struct list[T: CollectionElement](Sized): fn __init__(inout self, owned value: DynamicVector[T]): self._internal_vector = value + @always_inline + fn _normalize_index(self, index: Int) -> Int: + if index < 0: + return len(self) + index + else: + return index + fn append(inout self, value: T): self._internal_vector.push_back(value) @@ -27,11 +34,7 @@ struct list[T: CollectionElement](Sized): fn pop(inout self, index: Int = -1) raises -> T: if index >= len(self._internal_vector): raise Error("list index out of range") - let new_index: Int - if index < 0: - new_index = len(self) + index - else: - new_index = index + let new_index = self._normalize_index(index) let element = self.unchecked_get(new_index) for i in range(new_index, len(self) - 1): self[i] = self[i + 1] @@ -46,24 +49,20 @@ struct list[T: CollectionElement](Sized): self[mirror_i] = tmp fn insert(inout self, key: Int, value: T) raises: - if key >= len(self): + let index = self._normalize_index(key) + if index >= len(self): self.append(value) return # we increase the size of the array before insertion self.append(self[-1]) - for i in range(len(self) - 2, key + 1, -1): + for i in range(len(self) - 2, index, -1): self[i] = self[i - 1] self[key] = value fn __getitem__(self, index: Int) raises -> T: if index >= len(self._internal_vector): raise Error("list index out of range") - let new_index: Int - if index < 0: - new_index = len(self) + index - else: - new_index = index - return self.unchecked_get(new_index) + return self.unchecked_get(self._normalize_index(index)) fn __getitem__(self: Self, limits: slice) raises -> Self: var new_list: Self = Self() @@ -78,12 +77,7 @@ struct list[T: CollectionElement](Sized): fn __setitem__(inout self, key: Int, value: T) raises: if key >= len(self._internal_vector): raise Error("list index out of range") - let new_index: Int - if key < 0: - new_index = len(self) + key - else: - new_index = key - self.unchecked_set(new_index, value) + self.unchecked_set(self._normalize_index(key), value) @always_inline fn unchecked_set(inout self, key: Int, value: T): @@ -110,3 +104,14 @@ fn list_to_str(input_list: list[String]) raises -> String: else: result += repr return result + "]" + + +fn list_to_str(input_list: list[Int]) raises -> String: + var result: String = "[" + for i in range(len(input_list)): + let repr = str(input_list.__getitem__(index=i)) + if i != len(input_list) - 1: + result += repr + ", " + else: + result += repr + return result + "]" diff --git a/stdlib_extensions/stdlib_tests/builtins/test_list.mojo b/stdlib_extensions/stdlib_tests/builtins/test_list.mojo index 222eab2..d96db68 100644 --- a/stdlib_extensions/stdlib_tests/builtins/test_list.mojo +++ b/stdlib_extensions/stdlib_tests/builtins/test_list.mojo @@ -77,8 +77,71 @@ def test_pop_negative_values(): assert_equal(some_list.__getitem__(index=1), 2) +def test_pop_positive_values(): + some_list = list[Int]() + some_list.append(0) + some_list.append(1) + some_list.append(2) + some_list.append(3) + + assert_equal(some_list.pop(index=3), 3) + assert_equal(list_to_str(some_list), "[0, 1, 2]") + + assert_equal(some_list.pop(index=1), 1) + assert_equal(list_to_str(some_list), "[0, 2]") + + +def test_reverse_4_elements(): + some_list = list[Int]() + some_list.append(0) + some_list.append(1) + some_list.append(2) + some_list.append(3) + + some_list.reverse() + assert_equal(list_to_str(some_list), "[3, 2, 1, 0]") + + some_list.reverse() + assert_equal(list_to_str(some_list), "[0, 1, 2, 3]") + + +def test_reverse_5_elements(): + some_list = list[Int]() + some_list.append(0) + some_list.append(1) + some_list.append(2) + some_list.append(3) + some_list.append(4) + + some_list.reverse() + assert_equal(list_to_str(some_list), "[4, 3, 2, 1, 0]") + + some_list.reverse() + assert_equal(list_to_str(some_list), "[0, 1, 2, 3, 4]") + + +def test_insert(): + some_list = list[Int]() + some_list.append(0) + some_list.append(1) + some_list.append(2) + + some_list.insert(10, 14) + assert_equal(list_to_str(some_list), "[0, 1, 2, 14]") + + some_list.insert(-1, 22) + assert_equal(list_to_str(some_list), "[0, 1, 2, 14, 22]") + + some_list.insert(1, 100) + assert_equal(list_to_str(some_list), "[0, 100, 1, 2, 14, 22]") + + def run_tests(): test_list_of_strings() test_extend() test_pop_default() test_pop_negative_values() + test_pop_positive_values() + test_reverse_4_elements() + test_reverse_5_elements() + test_insert()