From 7be4010f2a51659f293345a45617de7d0b688ba8 Mon Sep 17 00:00:00 2001 From: Felipe Sere Date: Sun, 13 Mar 2016 11:21:59 +0000 Subject: [PATCH] Extract values from maps --- lib/koans/03_maps.ex | 30 +++++++++++++++--------------- test/koans_harness_test.exs | 21 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/lib/koans/03_maps.ex b/lib/koans/03_maps.ex index 990e700..594253a 100644 --- a/lib/koans/03_maps.ex +++ b/lib/koans/03_maps.ex @@ -4,62 +4,62 @@ defmodule Maps do koan "Maps represent structured data, like a person" do assert %{ :name => "Jon", :last_name => "Snow", - :age => 27 } == %{ :name => "Jon", + :age => 27 } == %{ :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 }) == [:age, :last_name, :name] + assert Map.keys(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) == :__ end koan "Or you can also get all the values from it" do - assert Map.values(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) == [27, "Snow", "Jon"] + assert Map.values(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) == :__ end koan "Fetching a value returns a touple with ok when it exists..." do - assert Map.fetch(%{ :name => "Jon", :last_name => "Snow", :age => 27 }, :age) == {:ok, 27} + assert Map.fetch(%{ :name => "Jon", :last_name => "Snow", :age => 27 }, :age) == :__ end koan "...or the atom :error when it doesnt." do - assert Map.fetch(%{ :name => "Jon", :last_name => "Snow", :age => 27 }, :family) == :error + assert Map.fetch(%{ :name => "Jon", :last_name => "Snow", :age => 27 }, :family) == :__ end koan "Extending a map is a simple as put'ing in a new pair" do - assert Map.put(%{ :name => "Jon", :last_name => "Snow"}, :age, 27) == %{ :name => "Jon", :last_name => "Snow", :age => 27 } + assert Map.put(%{ :name => "Jon", :last_name => "Snow"}, :age, 27) == :__ end koan "Put can also overwrite existing values" do - assert Map.put(%{ :name => "Jon", :last_name => "Snow", :age => 15}, :age, 27) == %{ :name => "Jon", :last_name => "Snow", :age => 27 } + assert Map.put(%{ :name => "Jon", :last_name => "Snow", :age => 15}, :age, 27) == :__ end koan "Or you can use some syntactic sugar for exiting elements." do - initial = %{ :name => "Jon", :last_name => "Snow", :age => 15} - assert %{ initial | :age => 27 } == %{ :name => "Jon", :last_name => "Snow", :age => 27 } + initial = %{ :name => "Jon", :last_name => "Snow", :age => 16} + assert %{ initial | :age => 27 } == :__ end koan "Can remove pairs by key" do - assert Map.delete(%{ :name => "Jon", :last_name => "Snow", :age => 15}, :age) == %{ :name => "Jon", :last_name => "Snow"} + 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}] ) == %{ :name => "Jon", :last_name => "Snow", :age => 27 } + 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 }) == [age: 27, last_name: "Snow", name: "Jon" ] + assert Map.to_list(%{ :name => "Jon", :last_name => "Snow", :age => 27 }) == :__ end koan "Can merge maps" do - assert Map.merge(%{:name => "Jon"}, %{ :last_name => "Snow"}) == %{: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"}) == %{:name => "Robert", :last_name => "Baratheon"} + assert Map.merge(%{:name => "Robert", :last_name => "Snow"}, %{ :last_name => "Baratheon"}) == :__ end koan "You can also select sub-maps out of a larger map" do initial = %{ :name => "Jon", :last_name => "Snow", :age => 15} - assert Map.take(initial, [:name, :last_name]) == %{ :name => "Jon", :last_name => "Snow"} + assert Map.take(initial, [:name, :last_name]) == :__ end end diff --git a/test/koans_harness_test.exs b/test/koans_harness_test.exs index 192cb17..9062aa7 100644 --- a/test/koans_harness_test.exs +++ b/test/koans_harness_test.exs @@ -34,6 +34,27 @@ defmodule KoansHarnessTest do test_all(Lists, answers) end + test "Maps" do + answers = [ + "Jon", + [:age, :last_name, :name], + [27, "Snow", "Jon"], + {: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" ], + %{:name => "Jon", :last_name => "Snow"}, + %{:name => "Robert", :last_name => "Baratheon"}, + %{ :name => "Jon", :last_name => "Snow"} + ] + + test_all(Maps, answers) + end + def test_all(module, answers) do module.all_koans |> Enum.zip(answers)