Advertisement
saasbook

Test extracted methods

Oct 21st, 2013
661
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.77 KB | None | 0 0
  1. class DateCalculator
  2.   attr_accessor :days, :year
  3.   def initialize(days)
  4.     @days = days
  5.     @year = 1980
  6.   end
  7.  
  8.   def convert
  9.     while (days > 365) do
  10.       if leap_year?
  11.         add_leap_year
  12.       else
  13.         add_regular_year
  14.       end
  15.     end
  16.     return year
  17.   end
  18.  
  19.   # extracted methods
  20.   def leap_year?
  21.     (@year % 400 == 0 ||
  22.       (@year % 4 == 0 && @year % 100 != 0))
  23.   end
  24.  
  25.   def add_leap_year
  26.     if (@days > 366)
  27.       @days -= 366
  28.       @year += 1
  29.     end
  30.   end
  31.  
  32.   def add_regular_year
  33.     @days -= 365
  34.     @year += 1
  35.   end
  36. end
  37.  
  38. describe DateCalculator do
  39.   describe 'leap years' do
  40.     before(:each) do
  41.       @calc = DateCalculator.new(0)
  42.     end
  43.     def test_leap_year(year)
  44.       @calc.year = year
  45.       @calc.leap_year?
  46.     end
  47.     it 'should occur every 4 years' do
  48.       test_leap_year(2004).should be_true
  49.     end
  50.     it 'but not every 100th year' do
  51.       test_leap_year(1900).should_not be_true
  52.     end
  53.     it 'but YES every 400th year' do
  54.       test_leap_year(2000).should be_true
  55.     end
  56.   end
  57.  
  58.   describe 'adding a leap year' do
  59.     it 'should not peel off leap year if not enough days left' do
  60.       @calc = DateCalculator.new(225)
  61.       @calc.year = 2008
  62.       expect { @calc.add_leap_year }.not_to change { @calc.year }
  63.     end
  64.     it 'should peel off leap year if >1 year of days left' do
  65.       @calc = DateCalculator.new(400)
  66.       @calc.year = 2008
  67.       expect { @calc.add_leap_year }.to change { @calc.year }.by(1)
  68.     end
  69.     it 'should peel off leap year if exactly 1 year of days left' do
  70.       @calc = DateCalculator.new(366)
  71.       @calc.year = 2008
  72.       # will fail given original code!
  73.       expect { @calc.add_leap_year }.to change { @calc.year }.by(1)
  74.     end      
  75.   end
  76.      
  77. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement