Skip to content

Instantly share code, notes, and snippets.

@ericroberts
Last active August 29, 2015 14:18
Show Gist options
  • Save ericroberts/dd57cd80bec75ded3f02 to your computer and use it in GitHub Desktop.
Save ericroberts/dd57cd80bec75ded3f02 to your computer and use it in GitHub Desktop.
Intro to TDD
class Calculator
attr_reader :string_to_calculate
def initialize(string_to_calculate, options = {})
@string_to_calculate = string_to_calculate
@delimiter = options[:delimiter]
end
def add
raise ArgumentError, error_message unless negatives.empty?
numbers.reject { |x| x > 1000 }.reduce(0, :+)
end
def self.add(string, options = {})
new(string, options).add
end
private
def delimiter
@regex_delimiter ||= Regexp.new("[,\\n#{Regexp.escape(@delimiter.to_s)}]")
end
def numbers
@numbers ||= string_to_calculate.split(delimiter).map(&:to_i)
end
def negatives
@negatives ||= numbers.select { |n| n < 0 }
end
def error_message
"negatives are not allowed: #{negatives.join(", ")}"
end
end
gem 'minitest'
require "minitest/autorun"
require_relative "calculator"
class TestCalculator < Minitest::Test
def test_given_a_string_returns_a_number
number = rand(100)
assert_equal number, Calculator.add(number.to_s)
end
def test_empty_string_returns_zero
assert_equal 0, Calculator.add("")
end
def test_csv_should_sum_values
n1 = rand(100)
n2 = rand(100)
assert_equal n1 + n2, Calculator.add("#{n1},#{n2}")
end
def random_nuber_array(min, max)
numbers = Array.new((min..max).to_a.sample) { |x| rand(100) }
end
def test_greater_than_two_numbers_sum_values
assert_equal 10, Calculator.add("1,3,5,1")
numbers = random_nuber_array(2, 50)
sum = 0
numbers.each { |x| sum += x }
assert_equal sum , Calculator.add(numbers.join(","))
end
def test_newline_as_delimeter_when_summing_values
["1\n2,3", "1\n2\n3"].each do |number_string|
assert_equal 6, Calculator.add(number_string)
end
end
def test_negative_number_throws_error
[
{ input: "-1", error: "-1" },
{ input: "1,2,-5", error: "-5" },
{ input: "-1,-2,-3", error: "-1, -2, -3" },
{ input: "-1,22,-3", error: "-1, -3" },
].each do |test|
err = assert_raises ArgumentError do
Calculator.add(test[:input])
end
assert_equal "negatives are not allowed: " + test[:error], err.message
end
end
def test_ignore_numbers_greater_than_1000
[
{ input: "1001", sum: 0 },
{ input: "1001,2", sum: 2 },
{ input: "1000,2", sum: 1002 },
{ input: "1002,10", sum: 10 },
{ input: "5,1020,7", sum: 12 }
].each do |test|
assert_equal test[:sum], Calculator.add(test[:input])
end
end
def test_user_specified_delimiter
["+", "|", ".", "]"].each do |delimiter|
assert_equal 6, Calculator.add([1, 2, 3].join(delimiter), delimiter: delimiter)
end
end
def test_custom_delimiter_with_default_delimiters
assert_equal 10, Calculator.add("1,2+3\n4", delimiter: "+")
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment