diff --git a/exercises/etl/.meta/.version b/exercises/etl/.meta/.version new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/exercises/etl/.meta/.version @@ -0,0 +1 @@ +1 diff --git a/exercises/etl/etl_test.rb b/exercises/etl/etl_test.rb index 2a8b81d02c..9b19cfc32e 100755 --- a/exercises/etl/etl_test.rb +++ b/exercises/etl/etl_test.rb @@ -3,56 +3,110 @@ require 'minitest/autorun' require_relative 'etl' -class TransformTest < Minitest::Test - def test_transform_one_value - old = { 1 => ['A'] } - expected = { 'a' => 1 } - +# Common test data version: ca9ed58 +class EtlTest < Minitest::Test + def test_a_single_letter + # skip + old = { + 1 => ["A"] + } + expected = { + 'a' => 1 + } assert_equal expected, ETL.transform(old) end - def test_transform_more_values + def test_single_score_with_multiple_letters skip - old = { 1 => %w(A E I O U) } - expected = { 'a' => 1, 'e' => 1, 'i' => 1, 'o' => 1, 'u' => 1 } - + old = { + 1 => ["A", "E", "I", "O", "U"] + } + expected = { + 'a' => 1, + 'e' => 1, + 'i' => 1, + 'o' => 1, + 'u' => 1 + } assert_equal expected, ETL.transform(old) end - def test_more_keys + def test_multiple_scores_with_multiple_letters skip - old = { 1 => %w(A E), 2 => %w(D G) } + old = { + 1 => ["A", "E"], + 2 => ["D", "G"] + } expected = { 'a' => 1, - 'e' => 1, 'd' => 2, + 'e' => 1, 'g' => 2 } - assert_equal expected, ETL.transform(old) end - def test_full_dataset + def test_multiple_scores_with_differing_numbers_of_letters skip old = { - 1 => %w(A E I O U L N R S T), - 2 => %w(D G), - 3 => %w(B C M P), - 4 => %w(F H V W Y), - 5 => %w(K), - 8 => %w(J X), - 10 => %w(Q Z) + 1 => ["A", "E", "I", "O", "U", "L", "N", "R", "S", "T"], + 2 => ["D", "G"], + 3 => ["B", "C", "M", "P"], + 4 => ["F", "H", "V", "W", "Y"], + 5 => ["K"], + 8 => ["J", "X"], + 10 => ["Q", "Z"] } - expected = { - 'a' => 1, 'b' => 3, 'c' => 3, 'd' => 2, 'e' => 1, - 'f' => 4, 'g' => 2, 'h' => 4, 'i' => 1, 'j' => 8, - 'k' => 5, 'l' => 1, 'm' => 3, 'n' => 1, 'o' => 1, - 'p' => 3, 'q' => 10, 'r' => 1, 's' => 1, 't' => 1, - 'u' => 1, 'v' => 4, 'w' => 4, 'x' => 8, 'y' => 4, + 'a' => 1, + 'b' => 3, + 'c' => 3, + 'd' => 2, + 'e' => 1, + 'f' => 4, + 'g' => 2, + 'h' => 4, + 'i' => 1, + 'j' => 8, + 'k' => 5, + 'l' => 1, + 'm' => 3, + 'n' => 1, + 'o' => 1, + 'p' => 3, + 'q' => 10, + 'r' => 1, + 's' => 1, + 't' => 1, + 'u' => 1, + 'v' => 4, + 'w' => 4, + 'x' => 8, + 'y' => 4, 'z' => 10 } - assert_equal expected, ETL.transform(old) end + + # Problems in exercism evolve over time, as we find better ways to ask + # questions. + # The version number refers to the version of the problem you solved, + # not your solution. + # + # Define a constant named VERSION inside of the top level BookKeeping + # module, which may be placed near the end of your file. + # + # In your file, it will look like this: + # + # module BookKeeping + # VERSION = 1 # Where the version number matches the one in the test. + # end + # + # If you are curious, read more about constants on RubyDoc: + # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html + + def test_bookkeeping + skip + assert_equal 1, BookKeeping::VERSION + end end diff --git a/exercises/etl/example.rb b/exercises/etl/example.rb index 8797e0952c..a88d7f0fbd 100644 --- a/exercises/etl/example.rb +++ b/exercises/etl/example.rb @@ -1,3 +1,7 @@ +module BookKeeping + VERSION = 1 +end + class ETL def self.transform(old) data = {} diff --git a/lib/etl_cases.rb b/lib/etl_cases.rb new file mode 100644 index 0000000000..f348281dde --- /dev/null +++ b/lib/etl_cases.rb @@ -0,0 +1,28 @@ +require 'generator/exercise_cases' + +class EtlCase < ExerciseCase + def workload + indent_lines([ + "old = {\n #{format(input)}\n }", + "expected = {\n #{format(expected)}\n }", + "assert_equal expected, ETL.transform(old)" + ], 4) + end + + private + + def format(obj) + case + when obj.respond_to?(:each_pair) + indent_lines( + obj.each_with_object([]) {|(k, v), string| string << "#{format(k)} => #{format(v)}" }, + 6, + ",\n" + ) + when obj.respond_to?(:each) then obj + when obj.to_s =~ /\d+/ then obj.to_i + else %Q('#{obj}') + end + end + +end diff --git a/lib/generator/exercise_cases.rb b/lib/generator/exercise_cases.rb index a4c6c99c0c..07c4e8a1f8 100644 --- a/lib/generator/exercise_cases.rb +++ b/lib/generator/exercise_cases.rb @@ -21,8 +21,8 @@ def skipped # "#{assert} Isogram.is_isogram?(string)" # ], 4 # ) - def indent_lines(code, depth) - code.join("\n" + ' ' * depth) + def indent_lines(code, depth, separator = "\n") + code.join(separator + ' ' * depth) end # used in workload, for example, as