diff --git a/lib/koans/06_keyword_lists.ex b/lib/koans/06_keyword_lists.ex new file mode 100644 index 0000000..38d0039 --- /dev/null +++ b/lib/koans/06_keyword_lists.ex @@ -0,0 +1,40 @@ +defmodule KeywordLists do + use Koans + + koan "Like maps, keyword lists are key-value pairs" do + kw_list = [foo: "bar"] + + assert kw_list[:foo] == ___ + end + + koan "Keys may be repeated, but only the first is accessed" do + kw_list = [foo: "bar", foo: "baz"] + + assert kw_list[:foo] == ___ + end + + koan "You could access a second key by removing the first" do + kw_list = [foo: "bar", foo: "baz"] + [_|kw_list] = kw_list + + assert kw_list[:foo] == ___ + end + + koan "Keyword lists just special syntax for lists of two-element tuples" do + assert [foo: "bar"] == [{___, ___}] + end + + koan "But unlike maps, the keys in keyword lists must be atoms" do + not_kw_list = [{"foo", "bar"}] + + assert_raise ArgumentError, fn -> not_kw_list[___] end + end + + koan "Conveniently keyword lists can be used for function options" do + transform = fn str, opts -> + if opts[:upcase], do: String.upcase(str) + end + + assert transform.("good", upcase: true) == ___ + end +end diff --git a/lib/koans/06_maps.ex b/lib/koans/07_maps.ex similarity index 100% rename from lib/koans/06_maps.ex rename to lib/koans/07_maps.ex diff --git a/lib/koans/07_structs.ex b/lib/koans/08_structs.ex similarity index 100% rename from lib/koans/07_structs.ex rename to lib/koans/08_structs.ex diff --git a/lib/koans/08_pattern_matching.ex b/lib/koans/09_pattern_matching.ex similarity index 100% rename from lib/koans/08_pattern_matching.ex rename to lib/koans/09_pattern_matching.ex diff --git a/lib/koans/09_functions.ex b/lib/koans/10_functions.ex similarity index 100% rename from lib/koans/09_functions.ex rename to lib/koans/10_functions.ex diff --git a/lib/koans/10_enums.ex b/lib/koans/11_enums.ex similarity index 100% rename from lib/koans/10_enums.ex rename to lib/koans/11_enums.ex diff --git a/lib/koans/11_processes.ex b/lib/koans/12_processes.ex similarity index 100% rename from lib/koans/11_processes.ex rename to lib/koans/12_processes.ex diff --git a/lib/koans/12_tasks.ex b/lib/koans/13_tasks.ex similarity index 100% rename from lib/koans/12_tasks.ex rename to lib/koans/13_tasks.ex diff --git a/lib/koans/13_agents.ex b/lib/koans/14_agents.ex similarity index 100% rename from lib/koans/13_agents.ex rename to lib/koans/14_agents.ex diff --git a/lib/runner.ex b/lib/runner.ex index a780289..aff090a 100644 --- a/lib/runner.ex +++ b/lib/runner.ex @@ -5,6 +5,7 @@ defmodule Runner do Atoms, Tuples, Lists, + KeywordLists, Maps, Structs, PatternMatching, diff --git a/test/koans/keyword_lists_koans_test.exs b/test/koans/keyword_lists_koans_test.exs new file mode 100644 index 0000000..617ba5a --- /dev/null +++ b/test/koans/keyword_lists_koans_test.exs @@ -0,0 +1,17 @@ +defmodule KeywordListsTests do + use ExUnit.Case + import TestHarness + + test "KeywordLists" do + answers = [ + "bar", + "bar", + "baz", + {:multiple, [:foo, "bar"]}, + "foo", + "GOOD", + ] + + test_all(KeywordLists, answers) + end +end