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
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? %>
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