Skip to content
Merged
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
1 change: 1 addition & 0 deletions exercises/sieve/.version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
4 changes: 4 additions & 0 deletions exercises/sieve/example.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
module BookKeeping
VERSION = 1
end

class Sieve
attr_reader :range
def initialize(limit)
Expand Down
21 changes: 21 additions & 0 deletions exercises/sieve/example.tt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env ruby
gem 'minitest', '>= 5.0.0'
require 'minitest/autorun'
require_relative 'sieve'

# Test data version:
# <%= sha1 %>

class SieveTest < Minitest::Test<% test_cases.each do |test_case| %>
def <%= test_case.name %>
<%= test_case.skipped %>
expected = <%= test_case.expected_string %>
assert_equal expected, Sieve.new(<%= test_case.limit %>).primes
end
<% end %>
<%= IO.read(XRUBY_LIB + '/bookkeeping.md') %>
def test_bookkeeping
skip
assert_equal <%= version.next %>, BookKeeping::VERSION
end
end
49 changes: 36 additions & 13 deletions exercises/sieve/sieve_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
require 'minitest/autorun'
require_relative 'sieve'

# Test data version:
# 43d62d1

class SieveTest < Minitest::Test
def test_no_primes_under_two
# skip
expected = []
assert_equal expected, Sieve.new(1).primes
end
Expand All @@ -27,23 +31,42 @@ def test_limit_is_prime
assert_equal expected, Sieve.new(13).primes
end

def test_primes_up_to_1000 # rubocop:disable Metrics/MethodLength
def test_find_primes_up_to_1000
skip
expected = [
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193,
197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269,
271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349,
353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431,
433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673,
677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761,
769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857,
859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947,
953, 967, 971, 977, 983, 991, 997
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139,
149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233,
239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337,
347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653,
659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883,
887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
]
assert_equal expected, Sieve.new(1000).primes
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
33 changes: 33 additions & 0 deletions lib/sieve_cases.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class SieveCase < OpenStruct
OPEN_ARRAY = "[\n\s\s\s\s\s\s".freeze
CLOSE_ARRAY = "\n\s\s\s\s]".freeze
NEW_ARRAY_ROW = ",\n\s\s\s\s\s\s".freeze
ARRAY_ELEMENTS_PER_ROW = 17.freeze
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is 17 the right number?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the previous sieve_test.rb, the test_primes_up_to_1000 expected array had 17 elements in its first row, so I took this as the base number. The ideal solution should probably count characters and match with Rubocop rules but I wasn't sure how to do it, so I came up with this solution.


def name
'test_%s' % description.tr(' ', '_')
end

def expected_string
return expected unless needs_indentation?

array_rows = expected.each_slice(ARRAY_ELEMENTS_PER_ROW).map { |elements| elements.join(', ') }
"#{OPEN_ARRAY}#{array_rows.join(NEW_ARRAY_ROW)}#{CLOSE_ARRAY}"
end

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

private

def needs_indentation?
expected.size > ARRAY_ELEMENTS_PER_ROW
end
end

SieveCases = proc do |data|
JSON.parse(data)['cases'].map.with_index do |row, i|
SieveCase.new(row.merge('index' => i))
end
end