Project

General

Profile

Backport #2349 ยป bigdec.diff

marcandre (Marc-Andre Lafortune), 11/09/2009 03:33 PM

View differences:

ext/bigdecimal/bigdecimal.c
724 724

  
725 725
	switch(op)
726 726
	{
727
	  case '*': f = rb_intern("<=>");break;
728
	  case '=': f = rb_intern("=="); break;
729
	  case '!': f = rb_intern("!="); break;
727
	  case '*': return rb_num_coerce_cmp(self,r,rb_intern("<=>"));
728
	  case '=': return RTEST(rb_num_coerce_cmp(self,r,rb_intern("=="))) ? Qtrue : Qfalse;
730 729
	  case 'G': f = rb_intern(">="); break;
731 730
	  case 'L': f = rb_intern("<="); break;
732 731
	  case '>': case '<': f = (ID)op; break;
733 732
	}
734
	return rb_num_coerce_cmp(self,r,f);
733
	return rb_num_coerce_relop(self,r,f);
735 734
    }
736 735
    SAVE(b);
737 736
    e = VpComp(a, b);
738
    if(e==999) return Qnil;
737
    if(e==999) return (op == '*') ? Qnil : Qfalse;
739 738
    switch(op)
740 739
    {
741 740
    case '*': return   INT2FIX(e); /* any op */
742 741
    case '=': if(e==0) return Qtrue ; return Qfalse;
743
    case '!': if(e!=0) return Qtrue ; return Qfalse;
744 742
    case 'G': if(e>=0) return Qtrue ; return Qfalse;
745 743
    case '>': if(e> 0) return Qtrue ; return Qfalse;
746 744
    case 'L': if(e<=0) return Qtrue ; return Qfalse;
test/bigdecimal/test_bigdecimal.rb
61 61
      x = BigDecimal.new("0.1")
62 62
      100.times do
63 63
        x *= x
64
        break if x == false
65 64
      end
66 65
    end
67 66
  end
......
71 70
      x = BigDecimal.new("10")
72 71
      100.times do
73 72
        x *= x
74
        break if x == false
75 73
      end
76 74
    end
77 75
  end
......
219 217
    assert_operator(1, :<, inf)
220 218
  end
221 219

  
222
  def test_cmp_corece
220
  def test_cmp_nan
221
    n1 = BigDecimal.new("1")
222
    BigDecimal.mode(BigDecimal::EXCEPTION_NaN, false)
223
    assert_equal(nil, BigDecimal.new("NaN") <=> n1)
224
    assert_equal(false, BigDecimal.new("NaN") > n1)
225
  end
226

  
227
  def test_cmp_failing_coercion
228
    n1 = BigDecimal.new("1")
229
    assert_equal(nil, n1 <=> nil)
230
    assert_raise(ArgumentError){n1 > nil}
231
  end
232

  
233
  def test_cmp_coerce
223 234
    n1 = BigDecimal.new("1")
224 235
    n2 = BigDecimal.new("2")
225 236
    o1 = Object.new; def o1.coerce(x); [x, BigDecimal.new("1")]; end