Skip to content

Commit

Permalink
Reconsiders responsibility of constructor in binary exercise (#499)
Browse files Browse the repository at this point in the history
binary: Reconsiders responsibility of constructor
  • Loading branch information
samjonester authored and Insti committed Dec 2, 2016
1 parent 5da1a86 commit f50fa49
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 36 deletions.
2 changes: 1 addition & 1 deletion exercises/binary/.version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2
3
36 changes: 17 additions & 19 deletions exercises/binary/binary_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,83 +5,82 @@
require_relative 'binary'

# Test data version:
# 01092b0
# 82eb00d
class BinaryTest < Minitest::Test
def test_binary_0_is_decimal_0
# skip
assert_equal 0, Binary.new('0').to_decimal
assert_equal 0, Binary.to_decimal('0')
end

def test_binary_1_is_decimal_1
skip
assert_equal 1, Binary.new('1').to_decimal
assert_equal 1, Binary.to_decimal('1')
end

def test_binary_10_is_decimal_2
skip
assert_equal 2, Binary.new('10').to_decimal
assert_equal 2, Binary.to_decimal('10')
end

def test_binary_11_is_decimal_3
skip
assert_equal 3, Binary.new('11').to_decimal
assert_equal 3, Binary.to_decimal('11')
end

def test_binary_100_is_decimal_4
skip
assert_equal 4, Binary.new('100').to_decimal
assert_equal 4, Binary.to_decimal('100')
end

def test_binary_1001_is_decimal_9
skip
assert_equal 9, Binary.new('1001').to_decimal
assert_equal 9, Binary.to_decimal('1001')
end

def test_binary_11010_is_decimal_26
skip
assert_equal 26, Binary.new('11010').to_decimal
assert_equal 26, Binary.to_decimal('11010')
end

def test_binary_10001101000_is_decimal_1128
skip
assert_equal 1128, Binary.new('10001101000').to_decimal
assert_equal 1128, Binary.to_decimal('10001101000')
end

def test_binary_ignores_leading_zeros
skip
assert_equal 31, Binary.new('000011111').to_decimal
assert_equal 31, Binary.to_decimal('000011111')
end

def test_2_is_not_a_valid_binary_digit
skip
assert_raises(ArgumentError) { Binary.new('2') }
assert_raises(ArgumentError) { Binary.to_decimal('2') }
end

def test_a_number_containing_a_non_binary_digit_is_invalid
skip
assert_raises(ArgumentError) { Binary.new('01201') }
assert_raises(ArgumentError) { Binary.to_decimal('01201') }
end

def test_a_number_with_trailing_non_binary_characters_is_invalid
skip
assert_raises(ArgumentError) { Binary.new('10nope') }
assert_raises(ArgumentError) { Binary.to_decimal('10nope') }
end

def test_a_number_with_leading_non_binary_characters_is_invalid
skip
assert_raises(ArgumentError) { Binary.new('nope10') }
assert_raises(ArgumentError) { Binary.to_decimal('nope10') }
end

def test_a_number_with_internal_non_binary_characters_is_invalid
skip
assert_raises(ArgumentError) { Binary.new('10nope10') }
assert_raises(ArgumentError) { Binary.to_decimal('10nope10') }
end

def test_a_number_and_a_word_whitespace_spearated_is_invalid
skip
assert_raises(ArgumentError) { Binary.new('001 nope') }
assert_raises(ArgumentError) { Binary.to_decimal('001 nope') }
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,
Expand All @@ -98,9 +97,8 @@ def test_a_number_and_a_word_whitespace_spearated_is_invalid
#
# 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 2, BookKeeping::VERSION
assert_equal 3, BookKeeping::VERSION
end
end
26 changes: 13 additions & 13 deletions exercises/binary/example.rb
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
module BookKeeping
VERSION = 2
VERSION = 3
end

class Binary
attr_reader :digits
def self.to_decimal binary
fail ArgumentError.new("invalid binary input #{binary}") if invalid?(binary)

def initialize(s)
fail ArgumentError.new("invalid binary input #{s}") unless valid?(s)

@digits = s.chars.reverse.collect(&:to_i)
digits(binary).reduce(0, &method(:convert))
end

def to_decimal
digits.each_with_index.inject(0) do |decimal, (digit, i)|
decimal + digit * 2**i
end
private

def self.invalid?(binary)
binary =~ /[^01]/
end

private
def self.digits(binary)
binary.chars.map(&:to_i)
end

def valid?(s)
s.chars.all? { |char| ['0', '1'].include?(char) }
def self.convert(decimal, digit)
decimal * 2 + digit
end
end
5 changes: 2 additions & 3 deletions lib/binary_cases.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ def name
end

def assertion
return error_assertion if raises_error?
equality_assertion
raises_error? ? error_assertion : equality_assertion
end

def skipped
Expand All @@ -23,7 +22,7 @@ def equality_assertion
end

def work_load
"Binary.new('#{binary}')#{'.to_decimal' unless raises_error?}"
"Binary.to_decimal('#{binary}')"
end

def raises_error?
Expand Down

0 comments on commit f50fa49

Please sign in to comment.