Skip to content

All generators use common interface #463

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,16 @@ then additional inputs/outputs should be submitted to the x-common repository.
Changes to the test suite (style, boilerplate, etc) will probably have to be made to
`example.tt`.

### Exercise Generators

If you wish to create a new generator, or edit an existing one, the generators currently live in the lib directory and are named `$PROBLEM_cases.rb`. For example, the hamming generator is `lib/hamming_cases.rb`.

All generators currently adhere to a common public interface, and must define the following three methods:

- `test_name` - Output the name of the test
- `workload` - Output the body of the test
- `skipped` - Output skip syntax

## Pull Requests

We welcome pull requests that provide fixes to existing test suites (missing
Expand Down
6 changes: 3 additions & 3 deletions exercises/acronym/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'acronym'
# Test data version:
# <%= sha1 %>
class AcronymTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
assert_equal '<%= test_case.expected %>', <%= test_case.assertion %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
4 changes: 1 addition & 3 deletions exercises/alphametics/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ require_relative 'alphametics'
class AlphameticsTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
expect = <%= test_case.expect %>
actual = <%= test_case.work_load %>
assert_equal(expect, actual)
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
2 changes: 1 addition & 1 deletion exercises/anagram/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require_relative 'anagram'
class AnagramTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.work_load %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
4 changes: 2 additions & 2 deletions exercises/binary/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ require_relative 'binary'
# Test data version:
# <%= sha1 %>
class BinaryTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.assertion %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
4 changes: 2 additions & 2 deletions exercises/bracket-push/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'bracket_push'
# Test data version:
# <%= sha1 %>
class BracketsTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.test_body %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
4 changes: 2 additions & 2 deletions exercises/clock/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'clock'
# Test data version:
# <%= sha1 %>
class ClockTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.test_body %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
11 changes: 6 additions & 5 deletions exercises/connect/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ require 'minitest/autorun'
require_relative 'connect'

# Test data version commit id: <%= sha1 %>
class ConnectTest < Minitest::Test<% test_cases.each do |test_case| %>
<%= test_case.ignore_method_length%>def <%= test_case.name %>
<%= test_case.skipped %><% test_case.test_body.each do |line| %>
<%= line %><% end %>
class ConnectTest < Minitest::Test
<% test_cases.each do |test_case| %>
<%= test_case.ignore_method_length%>def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
def test_bookkeeping
skip
assert_equal <%= version %>, BookKeeping::VERSION
assert_equal <%= version.next %>, BookKeeping::VERSION
end
end
4 changes: 2 additions & 2 deletions exercises/custom-set/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'custom_set'
# Test data version:
# <%= sha1 %>
class CustomSetTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.test_body %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
6 changes: 3 additions & 3 deletions exercises/difference-of-squares/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'difference_of_squares'
# Test data version:
# <%= sha1 %>
class DifferenceOfSquaresTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.test_name %><% if test_case.skipped? %>
skip<% end %>
assert_equal <%= test_case.expected_formatted %>, <%= test_case.do %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
def test_consistent_difference
Expand Down
21 changes: 9 additions & 12 deletions exercises/gigasecond/example.tt
Original file line number Diff line number Diff line change
@@ -1,22 +1,19 @@
#!/usr/bin/env ruby
gem 'minitest', '>= 5.0.0'
require 'minitest/autorun'
require_relative 'gigasecond'

# Test data version: <%= sha1 %>

class GigasecondTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
result = Gigasecond.from(<%= test_case.got %>)
assert_equal <%= test_case.want %>, result
# Test data version commit id: <%= sha1 %>
class GigasecondTest < Minitest::Test
<% test_cases.each do |test_case| %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
# Test your 1Gs anniversary
def test_with_your_birthday
skip
end

<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
def test_bookkeeping
skip
assert_equal <%= version.next %>, BookKeeping::VERSION
end
end
7 changes: 3 additions & 4 deletions exercises/hamming/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ require_relative 'hamming'
# Test data version:
# <%= sha1 %>
class HammingTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
<%= test_case.skipped %><% if test_case.raises_error? %>
assert_raises(ArgumentError) { <%= test_case.work_load %> }<% else %>
assert_equal <%= test_case.expected %>, <%= test_case.work_load %><% end %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
6 changes: 3 additions & 3 deletions exercises/hello-world/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ end
# Test data version:
# <%= sha1 %>
class HelloWorldTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.test_name %><% if test_case.skipped? %>
skip<% end %>
assert_equal '<%= test_case.expected %>', <%= test_case.do %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>end

Expand Down
7 changes: 3 additions & 4 deletions exercises/largest-series-product/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ require_relative 'largest_series_product'
# rubocop:disable Metrics/LineLength
#
class Seriestest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %><% if test_case.raises_error? %>
assert_raises(ArgumentError) { <%= test_case.do %> }<% else %>
assert_equal <%= test_case.expected %>, <%= test_case.do %><% end %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
7 changes: 3 additions & 4 deletions exercises/leap/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,9 @@ class Date
end

class YearTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %><% if test_case.expected%>
assert <%= test_case.do %>, "<%= test_case.failure_message%>"<% else %>
refute <%= test_case.do %>, "<%= test_case.failure_message%>"<% end%>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
7 changes: 3 additions & 4 deletions exercises/nth-prime/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ require_relative 'nth_prime'
# rubocop:disable Style/NumericLiterals
#
class NthPrimeTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %><% if test_case.raises_error? %>
assert_raises(ArgumentError) { <%= test_case.actual %> }<% else %>
assert_equal <%= test_case.expected %>, <%= test_case.actual %><% end %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
8 changes: 3 additions & 5 deletions exercises/pangram/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ require_relative 'pangram'
# Test data version:
# <%= sha1 %>
class PangramTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
str = '<%= test_case.input %>'<% if test_case.expected %>
assert<% else %>
refute<% end %> <%= test_case.do %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
6 changes: 3 additions & 3 deletions exercises/raindrops/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'raindrops'
# Test data version:
# <%= sha1 %>
class RaindropsTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
assert_equal '<%= test_case.expected %>', <%= test_case.do %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
2 changes: 1 addition & 1 deletion exercises/rna-transcription/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require_relative 'rna_transcription'
class ComplementTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
assert_equal '<%= test_case.expected %>', <%= test_case.work_load %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
6 changes: 3 additions & 3 deletions exercises/roman-numerals/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'roman_numerals'
# Test data version:
# <%= sha1 %>
class RomanNumeralsTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
assert_equal '<%= test_case.expected %>', <%= test_case.do %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
8 changes: 3 additions & 5 deletions exercises/run-length-encoding/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ require_relative 'run_length_encoding'
# Test data version:
# <%= sha1 %>
class RunLengthEncodingTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
<%= test_case.assign_input %>
<%= test_case.assign_output %>
<%= test_case.assertion %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
5 changes: 2 additions & 3 deletions exercises/sieve/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ require_relative 'sieve'
# <%= sha1 %>

class SieveTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
expected = <%= test_case.expected_string %>
assert_equal expected, Sieve.new(<%= test_case.limit %>).primes
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
6 changes: 3 additions & 3 deletions exercises/two-bucket/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ require_relative 'two_bucket'
# Test data version:
# <%= sha1 %>
class TwoBucketTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.test_name %><% if test_case.skipped? %>
skip<% end %>
<%= test_case.test_body %>
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand Down
2 changes: 1 addition & 1 deletion exercises/word-count/.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1
4
9 changes: 3 additions & 6 deletions exercises/word-count/example.tt
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@ require_relative 'word_count'
# Test data version:
# <%= sha1 %>
class PhraseTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %><% if test_case.skipped? %>
skip<% end %>
phrase = <%= test_case.object_under_test %>
counts = <%= test_case.expected %>
assert_equal counts, phrase.word_count
def <%= test_case.test_name %>
<%= test_case.skipped %>
<%= test_case.workload %>
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
Expand All @@ -19,4 +17,3 @@ class PhraseTest < Minitest::Test<% test_cases.each do |test_case| %>
assert_equal <%= version.next %>, BookKeeping::VERSION
end
end

10 changes: 5 additions & 5 deletions lib/acronym_cases.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
class AcronymCase < OpenStruct
def name
def test_name
'test_%s' % description.tr(' ', '_')
end

def assertion
"Acronym.abbreviate('#{phrase}')"
def workload
"assert_equal '#{expected}', Acronym.abbreviate('#{phrase}')"
end

def skipped?
index > 0
def skipped
index.zero? ? '# skip' : 'skip'
end
end

Expand Down
8 changes: 6 additions & 2 deletions lib/alphametics_cases.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,12 @@ def test_name
"test_#{description.tr(' ', '_')}"
end

def work_load
"Alphametics.new.solve('#{puzzle}')"
def workload
<<-WL.chomp
expect = #{expect}
actual = Alphametics.new.solve('#{puzzle}')
assert_equal(expect, actual)
WL
end

def expect
Expand Down
2 changes: 1 addition & 1 deletion lib/anagram_cases.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ def test_name
'test_%s' % description.gsub(/[ -]/, '_')
end

def work_load
def workload
indent_lines([show_comment, detector, anagram, assert].compact)
end

Expand Down
Loading