From 10847816d0eabd085be28e039904b691c75eac34 Mon Sep 17 00:00:00 2001 From: Shannon Oram Date: Sat, 11 Aug 2018 11:18:24 +1000 Subject: [PATCH 1/2] Add new koans for comprehensions Added to partially complete the "Koans for special forms" issue. https://github.com/elixirkoans/elixir-koans/issues/53 --- lib/koans/20_comprehensions.ex | 36 ++++++++++++++++++++++++ test/koans/comprehensions_koans_test.exs | 18 ++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 lib/koans/20_comprehensions.ex create mode 100644 test/koans/comprehensions_koans_test.exs diff --git a/lib/koans/20_comprehensions.ex b/lib/koans/20_comprehensions.ex new file mode 100644 index 0000000..5f441df --- /dev/null +++ b/lib/koans/20_comprehensions.ex @@ -0,0 +1,36 @@ +defmodule Comprehensions do + use Koans + + @intro "Comprehensions" + + # A comprehension is made of three parts: generators, filters and collectables. + + koan "Generators provide the values to be used in a comprehension" do + # In the expression below, `n <- [1, 2, 3, 4]` is the generator. + assert (for n <- [1, 2, 3, 4], do: n * n) == ___ + end + + koan "Any enumerable can be a generator" do + assert (for n <- 1..4, do: n * n) == ___ + end + + koan "A generator specifies how to extract values from a collection" do + collection = [["Hello","World"], ["Apple", "Pie"]] + assert (for [a, b] <- collection, do: "#{a} #{b}") == ___ + end + + koan "You can use multiple generators at once" do + assert (for x <- [2, 4], y <- ["dogs", "cats"], do: "#{x} #{y}") == ___ + end + + koan "Use a filter to reduce your work" do + assert (for n <- [1, 2, 3, 4, 5, 6], n > 3, do: n) == ___ + end + + koan "Add the result of a comprehension to an existing collection" do + pies = ["Apple Pie"] + pies = for x <- ["Pecan", "Pumpkin"], into: pies, do: "#{x} Pie" + assert pies == ___ + end + +end diff --git a/test/koans/comprehensions_koans_test.exs b/test/koans/comprehensions_koans_test.exs new file mode 100644 index 0000000..f162af8 --- /dev/null +++ b/test/koans/comprehensions_koans_test.exs @@ -0,0 +1,18 @@ +defmodule ComprehensionsTests do + use ExUnit.Case + import TestHarness + + test "Comprehensions" do + answers = [ + [1, 4, 9, 16], + [1, 4, 9, 16], + ["Hello World", "Apple Pie"], + ["2 dogs", "2 cats", "4 dogs", "4 cats"], + [4, 5, 6], + ["Apple Pie", "Pecan Pie", "Pumpkin Pie"], + ] + + test_all(Comprehensions, answers) + end + +end From 9ee4cbec483edf22576a43b99090bcdf85eedf08 Mon Sep 17 00:00:00 2001 From: Shannon Oram Date: Sun, 2 Sep 2018 20:36:25 +1000 Subject: [PATCH 2/2] Modify koans and descriptions --- lib/koans/20_comprehensions.ex | 15 ++++++--------- test/koans/comprehensions_koans_test.exs | 2 +- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/koans/20_comprehensions.ex b/lib/koans/20_comprehensions.ex index 5f441df..35eeccb 100644 --- a/lib/koans/20_comprehensions.ex +++ b/lib/koans/20_comprehensions.ex @@ -1,12 +1,9 @@ defmodule Comprehensions do use Koans - @intro "Comprehensions" + @intro "A comprehension is made of three parts: generators, filters, and collectibles. We will look at how these interact with eachother" - # A comprehension is made of three parts: generators, filters and collectables. - - koan "Generators provide the values to be used in a comprehension" do - # In the expression below, `n <- [1, 2, 3, 4]` is the generator. + koan "The generator, `n <- [1, 2, 3, 4]`, is providing the values for our comprehension" do assert (for n <- [1, 2, 3, 4], do: n * n) == ___ end @@ -20,7 +17,7 @@ defmodule Comprehensions do end koan "You can use multiple generators at once" do - assert (for x <- [2, 4], y <- ["dogs", "cats"], do: "#{x} #{y}") == ___ + assert (for x <- ["little", "big"], y <- ["dogs", "cats"], do: "#{x} #{y}") == ___ end koan "Use a filter to reduce your work" do @@ -28,9 +25,9 @@ defmodule Comprehensions do end koan "Add the result of a comprehension to an existing collection" do - pies = ["Apple Pie"] - pies = for x <- ["Pecan", "Pumpkin"], into: pies, do: "#{x} Pie" - assert pies == ___ + collection = ["Apple Pie"] + collection = for x <- ["Pecan", "Pumpkin"], into: collection, do: "#{x} Pie" + assert collection == ___ end end diff --git a/test/koans/comprehensions_koans_test.exs b/test/koans/comprehensions_koans_test.exs index f162af8..bcf7498 100644 --- a/test/koans/comprehensions_koans_test.exs +++ b/test/koans/comprehensions_koans_test.exs @@ -7,7 +7,7 @@ defmodule ComprehensionsTests do [1, 4, 9, 16], [1, 4, 9, 16], ["Hello World", "Apple Pie"], - ["2 dogs", "2 cats", "4 dogs", "4 cats"], + ["little dogs", "little cats", "big dogs", "big cats"], [4, 5, 6], ["Apple Pie", "Pecan Pie", "Pumpkin Pie"], ]