Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
6 changes: 5 additions & 1 deletion bin/generate
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ def exercises
.select { |file| File.directory? File.join('./exercises/practice', file) }
end

def underscore(str)
str.gsub(/[^\w\s-]/, '').gsub(/[-\s]/, '_').downcase
end

class VerificationError < StandardError
MESSAGE = 'The result generated for %<exercise>s, does not match the current file'

Expand Down Expand Up @@ -39,7 +43,7 @@ end
parser.on('--verify', 'Verify all exercises') do
exercises.each do |exercise|
if File.exist?("./exercises/practice/#{exercise}/.meta/test_template.erb")
current_code = File.read("./exercises/practice/#{exercise}/#{exercise}_test.rb")
current_code = File.read("./exercises/practice/#{exercise}/#{underscore(exercise)}_test.rb")
f = File.new("./exercises/practice/#{exercise}/temp_test.rb", 'w+')
Generator.new(exercise).generate(f.path)
generated_code = f.read
Expand Down
30 changes: 30 additions & 0 deletions exercises/practice/circular-buffer/.meta/test_template.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
require 'minitest/autorun'
require_relative 'circular_buffer'

class CircularBufferTest < Minitest::Test
<% json["cases"].each do |cases| %>
def test_<%= underscore(cases["description"]) %>
<%= skip? %>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Suggested change
<%= skip? %>
<%= skip? %>

buffer = CircularBuffer.new(<%= cases["input"]["capacity"] %>)
<%- cases["input"]["operations"].each do |operation| -%>
<%- if operation["operation"] == "read"-%>
<%- if operation["should_succeed"] -%>
assert_equal '<%= operation["expected"] %>', buffer.read
<%- else -%>
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
<%- end -%>
<%- elsif operation["operation"] == "write" -%>
<%- if operation["should_succeed"] -%>
buffer.write('<%= operation["item"] %>')
<%- else -%>
assert_raises(CircularBuffer::BufferFullException) { buffer.write('<%= operation["item"] %>') }
<%- end -%>
<%- elsif operation["operation"] == "overwrite" -%>
buffer.write!('<%= operation["item"] %>')
<% elsif operation["operation"] == "clear" -%>
buffer.clear
<%- end -%>
<%- end -%>
end
<% end %>
end
138 changes: 81 additions & 57 deletions exercises/practice/circular-buffer/circular_buffer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,107 +2,131 @@
require_relative 'circular_buffer'

class CircularBufferTest < Minitest::Test
def test_read_empty_buffer_throws_buffer_empty_exception
def test_reading_empty_buffer_should_fail
# skip
buffer = CircularBuffer.new(1)
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end

def test_write_and_read_back_one_item
def test_can_read_an_item_just_written
skip
buffer = CircularBuffer.new(1)
buffer.write '1'
buffer.write('1')
assert_equal '1', buffer.read
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end

def test_write_and_read_back_multiple_items
def test_each_item_may_only_be_read_once
skip
buffer = CircularBuffer.new(2)
buffer.write '1'
buffer.write '2'
buffer = CircularBuffer.new(1)
buffer.write('1')
assert_equal '1', buffer.read
assert_equal '2', buffer.read
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end

def test_clearing_buffer
def test_items_are_read_in_the_order_they_are_written
skip
buffer = CircularBuffer.new(3)
('1'..'3').each { |i| buffer.write i }
buffer.clear
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
buffer.write '1'
buffer.write '2'
buffer = CircularBuffer.new(2)
buffer.write('1')
buffer.write('2')
assert_equal '1', buffer.read
buffer.write '3'
assert_equal '2', buffer.read
end

def test_alternate_write_and_read
def test_full_buffer_cant_be_written_to
skip
buffer = CircularBuffer.new(2)
buffer.write '1'
buffer = CircularBuffer.new(1)
buffer.write('1')
assert_raises(CircularBuffer::BufferFullException) { buffer.write('2') }
end

def test_a_read_frees_up_capacity_for_another_write
skip
buffer = CircularBuffer.new(1)
buffer.write('1')
assert_equal '1', buffer.read
buffer.write '2'
buffer.write('2')
assert_equal '2', buffer.read
end

def test_reads_back_oldest_item
def test_read_position_is_maintained_even_across_multiple_writes
skip
buffer = CircularBuffer.new(3)
buffer.write '1'
buffer.write '2'
buffer.read
buffer.write '3'
buffer.write('1')
buffer.write('2')
assert_equal '1', buffer.read
buffer.write('3')
assert_equal '2', buffer.read
assert_equal '3', buffer.read
end

def test_writing_to_a_full_buffer_throws_an_exception
def test_items_cleared_out_of_buffer_cant_be_read
skip
buffer = CircularBuffer.new(2)
buffer.write '1'
buffer.write '2'
assert_raises(CircularBuffer::BufferFullException) { buffer.write 'A' }
buffer = CircularBuffer.new(1)
buffer.write('1')
buffer.clear
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end

def test_overwriting_oldest_item_in_a_full_buffer
def test_clear_frees_up_capacity_for_another_write
skip
buffer = CircularBuffer.new(2)
buffer.write '1'
buffer.write '2'
buffer.write! 'A'
buffer = CircularBuffer.new(1)
buffer.write('1')
buffer.clear
buffer.write('2')
assert_equal '2', buffer.read
assert_equal 'A', buffer.read
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end

def test_forced_writes_to_non_full_buffer_should_behave_like_writes
def test_clear_does_nothing_on_empty_buffer
skip
buffer = CircularBuffer.new(1)
buffer.clear
buffer.write('1')
assert_equal '1', buffer.read
end

def test_overwrite_acts_like_write_on_non_full_buffer
skip
buffer = CircularBuffer.new(2)
buffer.write '1'
buffer.write! '2'
buffer.write('1')
buffer.write!('2')
assert_equal '1', buffer.read
assert_equal '2', buffer.read
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end

def test_alternate_read_and_write_into_buffer_overflow
def test_overwrite_replaces_the_oldest_item_on_full_buffer
skip
buffer = CircularBuffer.new(2)
buffer.write('1')
buffer.write('2')
buffer.write!('3')
assert_equal '2', buffer.read
assert_equal '3', buffer.read
end

def test_overwrite_replaces_the_oldest_item_remaining_in_buffer_following_a_read
skip
buffer = CircularBuffer.new(5)
('1'..'3').each { |i| buffer.write i }
buffer.read
buffer.read
buffer.write '4'
buffer.read
('5'..'8').each { |i| buffer.write i }
buffer.write! 'A'
buffer.write! 'B'
('6'..'8').each do |i|
assert_equal i, buffer.read
end
assert_equal 'A', buffer.read
assert_equal 'B', buffer.read
buffer = CircularBuffer.new(3)
buffer.write('1')
buffer.write('2')
buffer.write('3')
assert_equal '1', buffer.read
buffer.write('4')
buffer.write!('5')
assert_equal '3', buffer.read
assert_equal '4', buffer.read
assert_equal '5', buffer.read
end

def test_initial_clear_does_not_affect_wrapping_around
skip
buffer = CircularBuffer.new(2)
buffer.clear
buffer.write('1')
buffer.write('2')
buffer.write!('3')
buffer.write!('4')
assert_equal '3', buffer.read
assert_equal '4', buffer.read
assert_raises(CircularBuffer::BufferEmptyException) { buffer.read }
end
end
12 changes: 12 additions & 0 deletions exercises/practice/crypto-square/.meta/test_template.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
require 'minitest/autorun'
require_relative 'crypto_square'

class CryptoSquareTest < Minitest::Test
<% json["cases"].each do |cases| %>
def test_<%= underscore(cases["description"]) %>
<%= skip? %>
plaintext = '<%= cases["input"]["plaintext"] %>'
assert_equal '<%= cases["expected"] %>', Crypto.new(plaintext).ciphertext
end
<% end %>
end
5 changes: 5 additions & 0 deletions exercises/practice/crypto-square/.meta/tests.toml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,8 @@ description = "8 character plaintext results in 3 chunks, the last one with a tr

[fbcb0c6d-4c39-4a31-83f6-c473baa6af80]
description = "54 character plaintext results in 7 chunks, the last two with trailing spaces"
include = false

[33fd914e-fa44-445b-8f38-ff8fbc9fe6e6]
description = "54 character plaintext results in 8 chunks, the last two with trailing spaces"
reimplements = "fbcb0c6d-4c39-4a31-83f6-c473baa6af80"
34 changes: 17 additions & 17 deletions exercises/practice/crypto-square/crypto_square_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,49 @@
class CryptoSquareTest < Minitest::Test
def test_empty_plaintext_results_in_an_empty_ciphertext
# skip
plaintext = ""
assert_equal "", Crypto.new(plaintext).ciphertext
plaintext = ''
assert_equal '', Crypto.new(plaintext).ciphertext
end

def test_normalization_results_in_empty_plaintext
skip
plaintext = "... --- ..."
assert_equal "", Crypto.new(plaintext).ciphertext
plaintext = '... --- ...'
assert_equal '', Crypto.new(plaintext).ciphertext
end

def test_lowercase
skip
plaintext = "A"
assert_equal "a", Crypto.new(plaintext).ciphertext
plaintext = 'A'
assert_equal 'a', Crypto.new(plaintext).ciphertext
end

def test_remove_spaces
skip
plaintext = " b "
assert_equal "b", Crypto.new(plaintext).ciphertext
plaintext = ' b '
assert_equal 'b', Crypto.new(plaintext).ciphertext
end

def test_remove_punctuation
skip
plaintext = "@1,%!"
assert_equal "1", Crypto.new(plaintext).ciphertext
plaintext = '@1,%!'
assert_equal '1', Crypto.new(plaintext).ciphertext
end

def test_9_character_plaintext_results_in_3_chunks_of_3_characters
skip
plaintext = "This is fun!"
assert_equal "tsf hiu isn", Crypto.new(plaintext).ciphertext
plaintext = 'This is fun!'
assert_equal 'tsf hiu isn', Crypto.new(plaintext).ciphertext
end

def test_8_character_plaintext_results_in_3_chunks_the_last_one_with_a_trailing_space
skip
plaintext = "Chill out."
assert_equal "clu hlt io ", Crypto.new(plaintext).ciphertext
plaintext = 'Chill out.'
assert_equal 'clu hlt io ', Crypto.new(plaintext).ciphertext
end

def test_54_character_plaintext_results_in_7_chunks_the_last_two_with_trailing_spaces
def test_54_character_plaintext_results_in_8_chunks_the_last_two_with_trailing_spaces
skip
plaintext = "If man was meant to stay on the ground, god would have given us roots."
assert_equal "imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau ", Crypto.new(plaintext).ciphertext
plaintext = 'If man was meant to stay on the ground, god would have given us roots.'
assert_equal 'imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau ', Crypto.new(plaintext).ciphertext
end
end
43 changes: 43 additions & 0 deletions exercises/practice/custom-set/.meta/test_template.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
require 'minitest/autorun'
require_relative 'custom_set'

class CustomSetTest < Minitest::Test
<% json["cases"].each do |cases| %>
<% cases["cases"].each do |sub_case| %>
def test_<%= underscore(sub_case["description"]) %>
<%= skip? %>
<%- if sub_case["input"].key?("set") -%>
set = CustomSet.new <%= sub_case["input"]["set"] %>
<%- if sub_case["property"] == "empty" -%>
<%= sub_case["expected"] ? "assert" : "refute" %>_empty set
<%- elsif sub_case["property"] == "contains" -%>
element = <%= sub_case["input"]["element"] %>
<%= sub_case["expected"] ? "assert" : "refute" %> set.member? element
<%- elsif sub_case["property"] == "add" -%>
expected = CustomSet.new <%= sub_case["expected"] %>
assert_equal expected, set.add(<%= sub_case["input"]["element"] %>)
<%- end -%>
<%- else -%>
set1 = CustomSet.new <%= sub_case["input"]["set1"] %>
set2 = CustomSet.new <%= sub_case["input"]["set2"] %>
<%- if sub_case["property"] == "subset" -%>
<%= sub_case["expected"] ? "assert" : "refute" %> set1.subset? set2
<%- elsif sub_case["property"] == "disjoint" -%>
<%= sub_case["expected"] ? "assert" : "refute" %> set1.disjoint? set2
<%- elsif sub_case["property"] == "equal" -%>
<%= sub_case["expected"] ? "assert" : "refute" %>_equal set1, set2
<%- elsif sub_case["property"] == "intersection" -%>
expected = CustomSet.new <%= sub_case["expected"] %>
assert_equal expected, set1.intersection(set2)
<%- elsif sub_case["property"] == "difference" -%>
expected = CustomSet.new <%= sub_case["expected"] %>
assert_equal expected, set1.difference(set2)
<%- elsif sub_case["property"] == "union" -%>
expected = CustomSet.new <%= sub_case["expected"] %>
assert_equal expected, set1.union(set2)
<%- end -%>
<% end %>
end
<% end %>
<% end %>
end
Loading