exercism/elixir/simple-linked-list/linked_list_test.exs

158 lines
4.2 KiB
Elixir

if !System.get_env("EXERCISM_TEST_EXAMPLES") do
Code.load_file("linked_list.exs", __DIR__)
end
ExUnit.start()
ExUnit.configure(trace: true)
defmodule LinkedListTest do
use ExUnit.Case
test "length/1 of new list" do
list = LinkedList.new()
assert LinkedList.length(list) == 0
end
@tag :pending
test "empty?/1 of new list" do
list = LinkedList.new()
assert LinkedList.empty?(list)
end
@tag :pending
test "length/1 of list of 1 datum" do
list = LinkedList.new() |> LinkedList.push(10)
assert LinkedList.length(list) == 1
end
@tag :pending
test "empty?/1 of list of 1 datum" do
list = LinkedList.new() |> LinkedList.push(20)
refute LinkedList.empty?(list)
end
@tag :pending
test "peek/1 of list of 1 datum" do
list = LinkedList.new() |> LinkedList.push(20)
assert LinkedList.peek(list) == {:ok, 20}
end
@tag :pending
test "peek/1 of list of empty list" do
list = LinkedList.new()
assert LinkedList.peek(list) == {:error, :empty_list}
end
@tag :pending
test "tail/1 of empty list" do
list = LinkedList.new()
assert {:error, :empty_list} = LinkedList.tail(list)
end
@tag :pending
test "tail/1 of list of 1 datum" do
list = LinkedList.new() |> LinkedList.push(:hello)
assert {:ok, tail} = LinkedList.tail(list)
assert LinkedList.peek(tail) == {:error, :empty_list}
end
@tag :pending
test "pushed items are stacked" do
list =
LinkedList.new()
|> LinkedList.push(:a)
|> LinkedList.push(:b)
assert LinkedList.peek(list) == {:ok, :b}
assert {:ok, list} = LinkedList.tail(list)
assert LinkedList.peek(list) == {:ok, :a}
assert {:ok, list} = LinkedList.tail(list)
assert LinkedList.peek(list) == {:error, :empty_list}
end
@tag :pending
test "push 10 times" do
list = Enum.reduce(1..10, LinkedList.new(), &LinkedList.push(&2, &1))
assert LinkedList.peek(list) == {:ok, 10}
assert LinkedList.length(list) == 10
end
@tag :pending
test "pop/1 of list of 1 datum" do
list = LinkedList.new() |> LinkedList.push(:a)
assert {:ok, :a, tail} = LinkedList.pop(list)
assert LinkedList.length(tail) == 0
end
@tag :pending
test "popping frenzy" do
list = Enum.reduce(11..20, LinkedList.new(), &LinkedList.push(&2, &1))
assert LinkedList.length(list) == 10
assert {:ok, 20, list} = LinkedList.pop(list)
assert {:ok, 19, list} = LinkedList.pop(list)
assert {:ok, 18, list} = LinkedList.pop(list)
assert {:ok, 17, list} = LinkedList.pop(list)
assert {:ok, 16, list} = LinkedList.pop(list)
assert {:ok, 15} = LinkedList.peek(list)
assert LinkedList.length(list) == 5
end
@tag :pending
test "from_list/1 of empty list" do
list = LinkedList.from_list([])
assert LinkedList.length(list) == 0
end
@tag :pending
test "from_list/1 of 2 element list" do
list = LinkedList.from_list([:a, :b])
assert LinkedList.length(list) == 2
assert {:ok, :a, list} = LinkedList.pop(list)
assert {:ok, :b, list} = LinkedList.pop(list)
assert {:error, :empty_list} = LinkedList.pop(list)
end
@tag :pending
test "to_list/1 of empty list" do
list = LinkedList.new()
assert LinkedList.to_list(list) == []
end
@tag :pending
test "to_list/1 of list of 1 datum" do
list = LinkedList.from_list([:mon])
assert LinkedList.to_list(list) == [:mon]
end
@tag :pending
test "to_list/1 of list of 2 datum" do
list = LinkedList.from_list([:mon, :tues])
assert LinkedList.to_list(list) == [:mon, :tues]
end
@tag :pending
test "reverse/1 of list of 2 datum" do
list = LinkedList.from_list([1, 2, 3]) |> LinkedList.reverse()
assert LinkedList.to_list(list) == [3, 2, 1]
end
@tag :pending
test "reverse/1 of list of 200 datum" do
list = Enum.to_list(1..200)
linked_list = LinkedList.from_list(list) |> LinkedList.reverse()
assert LinkedList.to_list(linked_list) == Enum.reverse(list)
end
@tag :pending
test "reverse/1 round trip" do
list = Enum.to_list(1..200)
linked_list =
LinkedList.from_list(list)
|> LinkedList.reverse()
|> LinkedList.reverse()
assert LinkedList.to_list(linked_list) == list
end
end