Advertisement
saasbook

date_calculator_ref_3.rb

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