From 9e16bfdac8a4202c2a9f5b0f42861db058748cfc Mon Sep 17 00:00:00 2001 From: Uku Taht Date: Sat, 9 Apr 2016 23:42:01 +0100 Subject: [PATCH] Attempt at making maps easier to go through --- lib/koans/06_maps.ex | 50 ++++++++++++++++++------------------- test/koans_harness_test.exs | 12 ++++----- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/lib/koans/06_maps.ex b/lib/koans/06_maps.ex index 99b4e9c..8123bab 100644 --- a/lib/koans/06_maps.ex +++ b/lib/koans/06_maps.ex @@ -1,65 +1,65 @@ defmodule Maps do use Koans + @person %{ + name: "Jon", + last_name: "Snow", + age: 27 + } + koan "Maps represent structured data, like a person" do - assert %{ :name => "Jon", - :last_name => "Snow", - :age => 27 } == %{ :name => :__, - :last_name => "Snow", - :age => 27 } + assert @person == %{name: :__, + last_name: "Snow", + age: 27 } end koan "You can get all the keys from the map" do - assert Map.keys(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) |> Enum.sort == :__ + assert Map.keys(@person) |> Enum.sort == :__ end koan "Or you can also get all the values from it" do - assert Map.values(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) |> Enum.sort == :__ + assert Map.values(@person) |> Enum.sort == :__ end koan "Fetching a value returns a tuple with ok when it exists" do - assert Map.fetch(%{ :name => "Jon", :last_name => "Snow", :age => 27 }, :age) == :__ + assert Map.fetch(@person, :age) == :__ end koan "Or the atom :error when it doesnt" do - assert Map.fetch(%{ :name => "Jon", :last_name => "Snow", :age => 27 }, :family) == :__ + assert Map.fetch(@person, :family) == :__ end koan "Extending a map is a simple as putting in a new pair" do - assert Map.put(%{ :name => "Jon", :last_name => "Snow"}, :age, 27) == :__ + person_with_hobby = Map.put(@person, :hobby, "Kayaking") + assert Map.fetch(person_with_hobby, :hobby) == :__ end koan "Put can also overwrite existing values" do - assert Map.put(%{ :name => "Jon", :last_name => "Snow", :age => 15}, :age, 27) == :__ + older_person = Map.put(@person, :age, 37) + assert Map.fetch(older_person, :age) == :__ end koan "Or you can use some syntactic sugar for existing elements" do - initial = %{ :name => "Jon", :last_name => "Snow", :age => 16} - assert %{ initial | :age => 27 } == :__ + younger_person = %{ @person | age: 16 } + assert Map.fetch(younger_person, :age) == :__ end koan "Can remove pairs by key" do - assert Map.delete(%{ :name => "Jon", :last_name => "Snow", :age => 15}, :age) == :__ - end - - koan "If you have a list of pairs, you can turn them into a map" do - assert Map.new( [{:name, "Jon"}, {:last_name, "Snow"}, {:age, 27}] ) == :__ - end - - koan "Going back to a list of pairs is just as easy" do - assert Map.to_list(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) == :__ + without_age = Map.delete(@person, :age) + assert Map.keys(without_age) |> Enum.sort == :__ end koan "Can merge maps" do - assert Map.merge(%{:name => "Jon"}, %{ :last_name => "Snow"}) == :__ + assert Map.merge(%{name: "Jon"}, %{last_name: "Snow"}) == :__ end koan "When merging, the last map wins" do - assert Map.merge(%{:name => "Robert", :last_name => "Snow"}, %{ :last_name => "Baratheon"}) == :__ + merged = Map.merge(@person, %{ last_name: "Baratheon"}) + assert Map.fetch(merged, :last_name) == :__ end koan "You can also select sub-maps out of a larger map" do - initial = %{ :name => "Jon", :last_name => "Snow", :age => 15} + initial = %{ name: "Jon", last_name: "Snow", age: 15} assert Map.take(initial, [:name, :last_name]) == :__ end end diff --git a/test/koans_harness_test.exs b/test/koans_harness_test.exs index b5265e0..17be4ad 100644 --- a/test/koans_harness_test.exs +++ b/test/koans_harness_test.exs @@ -90,14 +90,12 @@ defmodule KoansHarnessTest do [27, "Jon", "Snow"], {:ok, 27}, :error, - %{ :name => "Jon", :last_name => "Snow", :age => 27 }, - %{ :name => "Jon", :last_name => "Snow", :age => 27 }, - %{ :name => "Jon", :last_name => "Snow", :age => 27 }, - %{ :name => "Jon", :last_name => "Snow"}, - %{ :name => "Jon", :last_name => "Snow", :age => 27 }, - [age: 27, last_name: "Snow", name: "Jon" ], + {:ok, "Kayaking"}, + {:ok, 37}, + {:ok, 16}, + [:last_name, :name], %{:name => "Jon", :last_name => "Snow"}, - %{:name => "Robert", :last_name => "Baratheon"}, + {:ok, "Baratheon"}, %{ :name => "Jon", :last_name => "Snow"} ]