From 1ba137049be5065bbd598fb72dffc68dac10cd05 Mon Sep 17 00:00:00 2001 From: Hilary Holz Date: Fri, 21 Apr 2017 14:02:19 -0700 Subject: [PATCH 1/3] generate pig-latin tests using canonical data --- exercises/pig-latin/.meta/.version | 1 + exercises/pig-latin/example.rb | 4 ++ exercises/pig-latin/example.tt | 18 +++++ exercises/pig-latin/pig_latin_test.rb | 99 ++++++++++++++++++++------- lib/pig_latin_cases.rb | 22 ++++++ 5 files changed, 118 insertions(+), 26 deletions(-) create mode 100644 exercises/pig-latin/.meta/.version create mode 100644 exercises/pig-latin/example.tt create mode 100644 lib/pig_latin_cases.rb diff --git a/exercises/pig-latin/.meta/.version b/exercises/pig-latin/.meta/.version new file mode 100644 index 0000000000..56a6051ca2 --- /dev/null +++ b/exercises/pig-latin/.meta/.version @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/exercises/pig-latin/example.rb b/exercises/pig-latin/example.rb index 52a227ee79..df5ad03003 100644 --- a/exercises/pig-latin/example.rb +++ b/exercises/pig-latin/example.rb @@ -27,3 +27,7 @@ def parse_initial_consonant_sound_and_remainder word.scan(/\A([^aeiou]?qu|[^aeiou]+)(.*)/).first end end + +module BookKeeping + VERSION = 1 +end diff --git a/exercises/pig-latin/example.tt b/exercises/pig-latin/example.tt new file mode 100644 index 0000000000..c56bacb785 --- /dev/null +++ b/exercises/pig-latin/example.tt @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +gem 'minitest', '>= 5.0.0' +require 'minitest/autorun' +require_relative 'pig_latin' + +# Common test data version: <%= abbreviated_commit_hash %> +class PigLatinTest < Minitest::Test<% test_cases.each do |test_case| %> + def <%= test_case.name %> + <%= test_case.skipped %> + <%= test_case.workload %> + end +<% end %> +<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %> + def test_bookkeeping + skip + assert_equal <%= version %>, BookKeeping::VERSION + end +end diff --git a/exercises/pig-latin/pig_latin_test.rb b/exercises/pig-latin/pig_latin_test.rb index f62a7dee8f..28c296be91 100755 --- a/exercises/pig-latin/pig_latin_test.rb +++ b/exercises/pig-latin/pig_latin_test.rb @@ -3,78 +3,125 @@ require 'minitest/autorun' require_relative 'pig_latin' +# Common test data version: d4e9a22 class PigLatinTest < Minitest::Test def test_word_beginning_with_a - assert_equal 'appleay', PigLatin.translate('apple') + # skip + assert_equal "appleay", PigLatin.translate("apple") end - def test_other_word_beginning_e + def test_word_beginning_with_e skip - assert_equal 'earay', PigLatin.translate('ear') + assert_equal "earay", PigLatin.translate("ear") + end + + def test_word_beginning_with_i + skip + assert_equal "iglooay", PigLatin.translate("igloo") + end + + def test_word_beginning_with_o + skip + assert_equal "objectay", PigLatin.translate("object") + end + + def test_word_beginning_with_u + skip + assert_equal "underay", PigLatin.translate("under") + end + + def test_word_beginning_with_a_vowel_and_followed_by_a_qu + skip + assert_equal "equalay", PigLatin.translate("equal") end def test_word_beginning_with_p skip - assert_equal 'igpay', PigLatin.translate('pig') + assert_equal "igpay", PigLatin.translate("pig") end def test_word_beginning_with_k skip - assert_equal 'oalakay', PigLatin.translate('koala') + assert_equal "oalakay", PigLatin.translate("koala") end - def test_word_beginning_with_ch + def test_word_beginning_with_y skip - assert_equal 'airchay', PigLatin.translate('chair') + assert_equal "ellowyay", PigLatin.translate("yellow") end - def test_word_beginning_with_qu + def test_word_beginning_with_x skip - assert_equal 'eenquay', PigLatin.translate('queen') + assert_equal "enonxay", PigLatin.translate("xenon") end - def test_word_with_consonant_preceding_qu + def test_word_beginning_with_q_without_a_following_u skip - assert_equal 'aresquay', PigLatin.translate('square') + assert_equal "atqay", PigLatin.translate("qat") end - def test_word_beginning_with_th + def test_word_beginning_with_ch skip - assert_equal 'erapythay', PigLatin.translate('therapy') + assert_equal "airchay", PigLatin.translate("chair") end - def test_word_beginning_with_thr + def test_word_beginning_with_qu skip - assert_equal 'ushthray', PigLatin.translate('thrush') + assert_equal "eenquay", PigLatin.translate("queen") end - def test_word_beginning_with_sch + def test_word_beginning_with_qu_and_a_preceding_consonant skip - assert_equal 'oolschay', PigLatin.translate('school') + assert_equal "aresquay", PigLatin.translate("square") end - def test_translates_phrase + def test_word_beginning_with_th skip - assert_equal 'ickquay astfay unray', PigLatin.translate('quick fast run') + assert_equal "erapythay", PigLatin.translate("therapy") end - def test_word_beginning_with_ye + def test_word_beginning_with_thr skip - assert_equal 'ellowyay', PigLatin.translate('yellow') + assert_equal "ushthray", PigLatin.translate("thrush") end - def test_word_beginning_with_yt + def test_word_beginning_with_sch skip - assert_equal 'yttriaay', PigLatin.translate('yttria') + assert_equal "oolschay", PigLatin.translate("school") end - def test_word_beginning_with_xe + def test_word_beginning_with_yt skip - assert_equal 'enonxay', PigLatin.translate('xenon') + assert_equal "yttriaay", PigLatin.translate("yttria") end def test_word_beginning_with_xr skip - assert_equal 'xrayay', PigLatin.translate('xray') + assert_equal "xrayay", PigLatin.translate("xray") + end + + def test_a_whole_phrase + skip + assert_equal "ickquay astfay unray", PigLatin.translate("quick fast run") + 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/lib/pig_latin_cases.rb b/lib/pig_latin_cases.rb new file mode 100644 index 0000000000..c025caa7f5 --- /dev/null +++ b/lib/pig_latin_cases.rb @@ -0,0 +1,22 @@ +require 'exercise_cases' + +class PigLatinCase < OpenStruct + def name + 'test_%s' % description.tr('- ', '__') + end + + def workload + %Q(assert_equal #{expected.inspect}, PigLatin.translate(#{input.inspect})) + end + + def skipped + index.zero? ? '# skip' : 'skip' + end +end + +PigLatinCases = proc do |data| + JSON.parse(data)['cases']. + flat_map {|section| section['cases'] }. + each_with_index. + reduce([]) {|cases, (test, i)| cases << PigLatinCase.new(test.merge('index' => i)) } +end From efc3c0dea9c70720ecdc2a923ef642353829a8e1 Mon Sep 17 00:00:00 2001 From: Hilary Holz Date: Fri, 21 Apr 2017 14:32:58 -0700 Subject: [PATCH 2/3] simplify case extraction logic --- exercises/pig-latin/example.tt | 2 ++ exercises/pig-latin/pig_latin_test.rb | 2 ++ lib/pig_latin_cases.rb | 5 ++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/exercises/pig-latin/example.tt b/exercises/pig-latin/example.tt index c56bacb785..4127ed6ecf 100644 --- a/exercises/pig-latin/example.tt +++ b/exercises/pig-latin/example.tt @@ -10,7 +10,9 @@ class PigLatinTest < Minitest::Test<% test_cases.each do |test_case| %> <%= test_case.workload %> end <% end %> + <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %> + def test_bookkeeping skip assert_equal <%= version %>, BookKeeping::VERSION diff --git a/exercises/pig-latin/pig_latin_test.rb b/exercises/pig-latin/pig_latin_test.rb index 28c296be91..83a2e534f1 100755 --- a/exercises/pig-latin/pig_latin_test.rb +++ b/exercises/pig-latin/pig_latin_test.rb @@ -104,6 +104,7 @@ def test_a_whole_phrase skip assert_equal "ickquay astfay unray", PigLatin.translate("quick fast run") 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, @@ -120,6 +121,7 @@ def test_a_whole_phrase # # 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 diff --git a/lib/pig_latin_cases.rb b/lib/pig_latin_cases.rb index c025caa7f5..c9af8ec086 100644 --- a/lib/pig_latin_cases.rb +++ b/lib/pig_latin_cases.rb @@ -15,8 +15,7 @@ def skipped end PigLatinCases = proc do |data| - JSON.parse(data)['cases']. - flat_map {|section| section['cases'] }. + JSON.parse(data)['cases'].flat_map {|section| section['cases'] }. # extract all the cases into a single array each_with_index. - reduce([]) {|cases, (test, i)| cases << PigLatinCase.new(test.merge('index' => i)) } + map { |test, index| PigLatinCase.new(test.merge('index' => index)) } end From a15b65188d6c2a4d93552521712994f7450b4ae2 Mon Sep 17 00:00:00 2001 From: Hilary Holz Date: Fri, 21 Apr 2017 14:59:23 -0700 Subject: [PATCH 3/3] incorporate @insti's suggestions --- exercises/pig-latin/example.tt | 5 +++-- lib/pig_latin_cases.rb | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/exercises/pig-latin/example.tt b/exercises/pig-latin/example.tt index 4127ed6ecf..f27a0f9d56 100644 --- a/exercises/pig-latin/example.tt +++ b/exercises/pig-latin/example.tt @@ -4,13 +4,14 @@ require 'minitest/autorun' require_relative 'pig_latin' # Common test data version: <%= abbreviated_commit_hash %> -class PigLatinTest < Minitest::Test<% test_cases.each do |test_case| %> +class PigLatinTest < Minitest::Test +<% test_cases.each do |test_case| %> def <%= test_case.name %> <%= test_case.skipped %> <%= test_case.workload %> end -<% end %> +<% end %> <%= IO.read(XRUBY_LIB + '/bookkeeping.md') %> def test_bookkeeping diff --git a/lib/pig_latin_cases.rb b/lib/pig_latin_cases.rb index c9af8ec086..e256dfdefe 100644 --- a/lib/pig_latin_cases.rb +++ b/lib/pig_latin_cases.rb @@ -16,6 +16,5 @@ def skipped PigLatinCases = proc do |data| JSON.parse(data)['cases'].flat_map {|section| section['cases'] }. # extract all the cases into a single array - each_with_index. - map { |test, index| PigLatinCase.new(test.merge('index' => index)) } + map.with_index { |test, index| PigLatinCase.new(test.merge('index' => index)) } end