Created
July 16, 2010 21:17
-
-
Save anonymous/478927 to your computer and use it in GitHub Desktop.
Revisions
-
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,116 @@ require 'rubygems' require 'spec' class Account attr_reader :balance def self.find(pin) Accounts[pin] end def initialize(ref,balance=0) @symbol = ref @balance = balance end attr_reader :symbol def ==(that) @symbol == that.symbol end def withdraw_cash(amount) @balance -= amount amount end end class ATM def initialize @num_attempts = 0 end def read_pin(pin) account = Account.find(pin) if account.nil? invalid_pin else return account end end def invalid_pin @num_attempts += 1 if @num_attempts >= 3 raise 'O NOES' end end end describe 'an atm' do let (:atm) {ATM.new} before(:each) do Account::Accounts = {7643 => Account.new(:alices_account,2000), 5954 => Account.new(:bobes_account,22400), 1562 => Account.new(:clydes_account)} end describe 'entering a pin' do context 'when a user enters a pin' do it 'returns the account for alice\'s pin' do atm.read_pin(7643).should == Account.new(:alices_account) end it 'returns the account for bobes pin' do atm.read_pin(5954).should == Account.new(:bobes_account) end it 'returns the account for clyde\'s pin' do atm.read_pin(1562).should == Account.new(:clydes_account) end it 'does not return the account for an invalid pin' do atm.read_pin(:invalid_apin).should be_nil end it 'returns the same account twice' do atm.read_pin(1562).should be_eql(atm.read_pin(1562)) end it 'bobes account is not alices account' do atm.read_pin(1562).should_not be_eql(atm.read_pin(5954)) end end context 'making three attempts to enter the pin' do it 'fails after entering the wrong pin 3 times' do 2.times { atm.read_pin(:invalid_pin) } lambda { atm.read_pin(:ohmygoshinvalidpin) }.should raise_error end end end describe 'withdrawing money' do context 'from alices account' do it 'gives us money' do atm.read_pin(7643).withdraw_cash(80).should == 80 end it 'debits the account' do account = atm.read_pin(7643) account.withdraw_cash(80) account.balance.should == 2000 - 80 end end context 'from bobes account' do it 'debits the account' do account = atm.read_pin(5954) account.withdraw_cash(250) account.balance.should == 22400-250 end end end end