From bc5a61ea07ec0f52994e1fb6b4dc24e1580571d6 Mon Sep 17 00:00:00 2001 From: Shannon Oram Date: Sat, 11 Aug 2018 11:18:24 +1000 Subject: [PATCH] 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