Skip to content
This repository has been archived by the owner on May 29, 2024. It is now read-only.

Commit

Permalink
Finished all tests
Browse files Browse the repository at this point in the history
  • Loading branch information
gabrieldemarmiesse committed Dec 5, 2023
1 parent 61ba38d commit 5c3274f
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 19 deletions.
43 changes: 24 additions & 19 deletions stdlib_extensions/builtins/_generic_list.mojo
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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]
Expand All @@ -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()
Expand All @@ -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):
Expand All @@ -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 + "]"
63 changes: 63 additions & 0 deletions stdlib_extensions/stdlib_tests/builtins/test_list.mojo
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit 5c3274f

Please sign in to comment.