Skip to content

Instantly share code, notes, and snippets.

@indiesquidge
Last active August 29, 2015 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save indiesquidge/323aaaa9edae81fea12d to your computer and use it in GitHub Desktop.
Save indiesquidge/323aaaa9edae81fea12d to your computer and use it in GitHub Desktop.

Credit Card Validator!

now with automated tests

Austin Wood

To Run

  1. run ruby credit_check_test.rb

To Debug via Pry

  1. Make sure you have installed Pry (gem install pry)
  2. Insert binding.pry on the line you want to break on in credit_check.rb
  3. Uncomment bottom two lines of credit_check.rb to create test card number
  4. run ruby credit_check.rb and pry should pause where you put the break marker
require 'pry'
class CreditCheck
attr_accessor :card_number
def validate(card_number)
if card_number == ''
false
else
card_arr = card_number.each_char.map.with_index do |n,i|
num = n.to_i
if card_number.length % 2 == 0
i % 2 == 0 ? num *= 2 : num
else # i.e. American Express
i % 2 == 1 ? num *= 2 : num
end
end.map { |n| n >= 10 ? (n % 10) + 1 : n }.reduce :+
if card_arr % 10 == 0
# puts "The number is valid!"
card_number = true
else
# puts "The number is invalid!"
card_number = false
end
end
end
end
# Debugging purposes
# tester = CreditCheck.new
# tester.validate('6011797668867828') # should return true
require 'minitest/autorun'
require 'minitest/pride'
require './credit_check'
class CreditCheckTest < MiniTest::Test
def test_empty_string_is_invalid
checker = CreditCheck.new
result = checker.validate('')
assert_equal false, result
end
def test_single_zero_char_is_valid
checker = CreditCheck.new
result = checker.validate('0')
assert_equal true, result
end
def test_single_nonzero_char_is_invalid
checker = CreditCheck.new
result = checker.validate('1')
assert_equal false, result
end
def test_small_strings
checker = CreditCheck.new
result = checker.validate('42')
assert_equal true, result
result = checker.validate('50')
assert_equal false, result
end
def test_medium_strings
checker = CreditCheck.new
result = checker.validate('42424242')
assert_equal true, result
result = checker.validate('50505050')
assert_equal false, result
end
def test_actual_card_numbers
checker = CreditCheck.new
result = checker.validate('5541808923795240')
assert_equal true, result
result = checker.validate('4024007136512380')
assert_equal true, result
result = checker.validate('5541801923795240')
assert_equal false, result
result = checker.validate('4024007106512380')
assert_equal false, result
end
def test_american_express
checker = CreditCheck.new
result = checker.validate('342804633855673')
assert_equal true, result
result = checker.validate('342801633855673')
assert_equal false, result
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment