[Bug:trunk] rubyspec: Date#valid_civil? should be able to handle negative months and days FAILED

e$B$U$J$P$5$se(B
e$B1sF#$G$9!#e(B

e$B$^$:3NG’$G$9$,!"e(Bvalid_civil? e$B$,e(B jd or nil
e$B$rJV$9$H$$$&;EMM$+$ie(B
true or false e$B$rJV$9$h$&$K$J$C$?$N$Oe(B 1.9 e$B$+$ie(B
(e$B$H$$$&$+e(B Date2
e$B$+$i!)e(B) e$B$N;EMMJQ99$G$9$h$M!#e(B

e$B$=$NE@$r=$@5$7$?>e$G!"e(Brubyspec
e$B$,0J2<$N5sF0$NJQ2=$r8!=P$7$^$7$?!#e(B

$ ruby18 -v -rdate -e ‘p Date.valid_civil?(1582, -3, -18)’
ruby 1.8.8dev (2010-01-26 revision 26430) [i686-linux]
nil

$ ./ruby -v -rdate -e ‘p Date.valid_civil?(1582, -3, -18)’
ruby 1.9.2dev (2010-01-28 trunk 26458) [i686-linux]
true

$ ruby-1.9.1-p378 -v -rdate -e ‘p Date.valid_civil?(1582, -3, -18)’
ruby 1.9.1p378 (2010-01-10 revision 26273) [i686-linux]
true

e$B!Ve(BDate e$B$N7nF|$KIi$NCM$rF~$l$F$bF0$/!W$H$$$&e(B spec
e$B$,$"$C$F!"e(B
e$B$=$l$,$&$^$/F0$+$J$/$J$C$F$$$k$h$&$G$9!#e(B

http://github.com/rubyspec/rubyspec/blob/master/library/date/civil_spec.rb

date.rb e$B$Ne(B _valid_civil? e$B$N%3%a%s%H$K$h$k$H!“Ii$NCM$G$bF0$/e(B
e$B$h$&$J$3$H$,=q$+$l$F$$$^$9$N$G!”$3$l$O%P%0$G$7$g$&$+!#e(B

# +m+ and +d+ can be negative, in which case they count
# backwards from the end of the year and the end of the
# month respectively.

e$B$^$:3NG’$G$9$,!"e(Bvalid_civil? e$B$,e(B jd or nil e$B$rJV$9$H$$$&;EMM$+$ie(B
true or false e$B$rJV$9$h$&$K$J$C$?$N$Oe(B 1.9 e$B$+$ie(B (e$B$H$$$&$+e(B Date2
e$B$+$i!)e(B) e$B$N;EMMJQ99$G$9$h$M!#e(B

e$B$O$$!#e(B

e$B$=$NE@$r=$@5$7$?>e$G!"e(Brubyspec e$B$,0J2<$N5sF0$NJQ2=$r8!=P$7$^$7$?!#e(B

e$B3"F|$+$i$N?t$($+$?$NJQ99$G$9!#e(B1.8
e$B$G$O0J2<$N$h$&$K$J$C$F$$$F!"Ht$s$@$He(B
e$B$3$m$K$bF|$r3d$jEv$F$i$l$F$$$k$+$N$h$&$K?t$($F$$$^$7$?!#e(B

October 1582

S M Tu W Th F S

-31 -30 -29 -28 -17 -16

-15 -14 -13 -12 -11 -10 -9

-8 -7 -6 -5 -4 -3 -2

-1

1.9 e$B$G$O!"e(B

October 1582

S M Tu W Th F S

-21 -20 -19 -18 -17 -16

-15 -14 -13 -12 -11 -10 -9

-8 -7 -6 -5 -4 -3 -2

-1

e$B$N$h$&$KK\Ev$KB8:_$9$k$b$N$@$1?t$($k$h$&$K$7$F$$$^$9!#$I$C$A$,@5$7$$$He(B
e$B$$$&$o$1$G$O$J$$$N$G$9$,!"$3$N$h$&$JNc30E*$J$H$3$m$G$N5sF0$rA*Br$7$J$le(B
e$B$P$J$j$^$;$s!#G/$NF|$N$[$&$N$"$D$+$$$HB7$($k$H$H$b$K!"$3$N$[$&$,ET9g$,e(B
e$B$h$$$N$G$=$&$7$^$7$?!#e(B

e$B$7$?$,$C$F!"e(B1582e$BG/e(B-3e$B7ne(B-18e$BF|$O!"e(B1.8
e$B$G$OB8:$9$k$,!"e(B1.9 e$B$G$OB8:$7$J$$$He(B
e$B$$$&$3$H$K$J$j$^$9!#e(B

e$B%A%1%C%He(B #2675 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B%9%F!<%?%9e(B Opene$B$+$ie(BRejectede$B$KJQ99e(B
ruby -v ruby 1.9.2dev (2010-01-28 trunk 26458)
[i686-linux]e$B$K%;%C%He(B

e$B$7$?$,$C$F!"e(B1582e$BG/e(B-3e$B7ne(B-18e$BF|$O!"e(B1.8 e$B$G$OB8:$9$k$,!"e(B1.9 e$B$G$OB8:$7$J$$$He(B
e$B$$$&$3$H$K$J$j$^$9!#e(B

e$B@bL@$"$j$,$H$&$4$6$$$^$9!*$o$+$j$^$7$?!#e(B
e$BJ9$+$J$$$HE~Dl$o$+$j$=$&$K$J$+$C$?$G$9!#e(B

e$B$3$N%A%1%C%H$Oe(B reject e$B$7$D$D!"0J2<$N$h$&$J%Q%C%A$re(B rubyspec
e$B$Ke(B
e$BAw$m$&$H;W$$$^$9!#e(B

diff --git a/library/date/civil_spec.rb b/library/date/civil_spec.rb
index e26968c…d169cc2 100644
— a/library/date/civil_spec.rb
+++ b/library/date/civil_spec.rb
@@ -10,19 +10,56 @@ end

describe “Date#valid_civil?” do

  • it “should be able to determine if a date is valid” do
  • Date.valid_civil?(1582, 10, 14).should == nil
  • Date.valid_civil?(1582, 10, 15).should == Date.civil(1582, 10,
    15).jd
  • Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should_not == nil
  • Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should ==
    Date.civil(1582, 10, 14, Date::ENGLAND).jd
  • ruby_version_is “” … “1.9” do
  • it “should be able to determine if a date is valid” do
  •  Date.valid_civil?(1582, 10, 14).should == nil
    
  •  Date.valid_civil?(1582, 10, 15).should == Date.civil(1582, 10, 
    

15).jd

  •  Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should_not == nil
    
  •  Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should == 
    

Date.civil(1582, 10, 14, Date::ENGLAND).jd

  • end
  • it “should be able to handle negative months and days” do
  •  # October 1582
    
  •  #     S   M  Tu   W  Th   F   S
    
  •  #       -31 -30 -29 -28 -17 -16
    
  •  #   -15 -14 -13 -12 -11 -10  -9
    
  •  #    -8  -7  -6  -5  -4  -3  -2
    
  •  #    -1
    
  •  Date.valid_civil?(1582, -3, -31).should == Date.civil(1582, 10, 
    

1).jd

  •  Date.valid_civil?(1582, -3, -28).should == Date.civil(1582, 10, 
    

4).jd

  •  Date.valid_civil?(1582, -3, -27).should == nil
    
  •  Date.valid_civil?(1582, -3, -22).should == nil
    
  •  Date.valid_civil?(1582, -3, -21).should == nil
    
  •  Date.valid_civil?(1582, -3, -18).should == nil
    
  •  Date.valid_civil?(1582, -3, -17).should == Date.civil(1582, 10, 
    

15).jd
+

  •  Date.valid_civil?(2007, -11, -10).should == Date.civil(2007, 2, 
    

19).jd

  •  Date.valid_civil?(2008, -11, -10).should == Date.civil(2008, 2, 
    

20).jd

  • end
    end
  • it “should be able to handle negative months and days” do
  • Date.valid_civil?(1582, -3, -18).should == nil
  • Date.valid_civil?(1582, -3, -17).should == Date.civil(1582, 10,
    15).jd
  • ruby_version_is “1.9” do
  • it “should be able to determine if a date is valid” do
  •  Date.valid_civil?(1582, 10, 14).should == false
    
  •  Date.valid_civil?(1582, 10, 15).should == true
    
  •  Date.valid_civil?(1582, 10, 14, Date::ENGLAND).should == true
    
  • end
  • it “should be able to handle negative months and days” do
  •  # October 1582
    
  •  #     S   M  Tu   W  Th   F   S
    
  •  #       -21 -20 -19 -18 -17 -16
    
  •  #   -15 -14 -13 -12 -11 -10  -9
    
  •  #    -8  -7  -6  -5  -4  -3  -2
    
  •  #    -1
    
  •  Date.valid_civil?(1582, -3, -22).should == false
    
  •  Date.valid_civil?(1582, -3, -21).should == true
    
  •  Date.valid_civil?(1582, -3, -18).should == true
    
  •  Date.valid_civil?(1582, -3, -17).should == true
    
  • Date.valid_civil?(2007, -11, -10).should == Date.civil(2007, 2,
    19).jd
  • Date.valid_civil?(2008, -11, -10).should == Date.civil(2008, 2,
    20).jd
  •  Date.valid_civil?(2007, -11, -10).should == true
    
  •  Date.valid_civil?(2008, -11, -10).should == true
    
  • end
    end

end


Yusuke E. [email protected]

http://redmine.ruby-lang.org/issues/show/2675