first commit
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
MRuby::Gem::Specification.new('mruby-rational') do |spec|
|
||||
spec.license = 'MIT'
|
||||
spec.author = 'mruby developers'
|
||||
spec.summary = 'Rational class'
|
||||
end
|
||||
@@ -0,0 +1,115 @@
|
||||
class Rational < Numeric
|
||||
def inspect
|
||||
"(#{to_s})"
|
||||
end
|
||||
|
||||
def to_s
|
||||
"#{numerator}/#{denominator}"
|
||||
end
|
||||
|
||||
def *(rhs)
|
||||
if rhs.is_a? Rational
|
||||
Rational(numerator * rhs.numerator, denominator * rhs.denominator)
|
||||
elsif rhs.is_a? Integer
|
||||
Rational(numerator * rhs, denominator)
|
||||
elsif rhs.is_a? Numeric
|
||||
numerator * rhs / denominator
|
||||
end
|
||||
end
|
||||
|
||||
def +(rhs)
|
||||
if rhs.is_a? Rational
|
||||
Rational(numerator * rhs.denominator + rhs.numerator * denominator, denominator * rhs.denominator)
|
||||
elsif rhs.is_a? Integer
|
||||
Rational(numerator + rhs * denominator, denominator)
|
||||
elsif rhs.is_a? Numeric
|
||||
(numerator + rhs * denominator) / denominator
|
||||
end
|
||||
end
|
||||
|
||||
def -(rhs)
|
||||
if rhs.is_a? Rational
|
||||
Rational(numerator * rhs.denominator - rhs.numerator * denominator, denominator * rhs.denominator)
|
||||
elsif rhs.is_a? Integer
|
||||
Rational(numerator - rhs * denominator, denominator)
|
||||
elsif rhs.is_a? Numeric
|
||||
(numerator - rhs * denominator) / denominator
|
||||
end
|
||||
end
|
||||
|
||||
def /(rhs)
|
||||
if rhs.is_a? Rational
|
||||
Rational(numerator * rhs.denominator, denominator * rhs.numerator)
|
||||
elsif rhs.is_a? Integer
|
||||
Rational(numerator, denominator * rhs)
|
||||
elsif rhs.is_a? Numeric
|
||||
numerator / rhs / denominator
|
||||
end
|
||||
end
|
||||
|
||||
def <=>(rhs)
|
||||
if rhs.is_a?(Integral)
|
||||
return numerator <=> rhs if denominator == 1
|
||||
rhs = Rational(rhs)
|
||||
end
|
||||
|
||||
case rhs
|
||||
when Rational
|
||||
(numerator * rhs.denominator - denominator * rhs.numerator) <=> 0
|
||||
when Numeric
|
||||
(rhs <=> self)&.-@
|
||||
else
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
def ==(rhs)
|
||||
return true if self.equal?(rhs)
|
||||
if rhs.is_a?(Integral) && denominator == 1
|
||||
return numerator == rhs
|
||||
end
|
||||
if rhs.is_a?(Rational)
|
||||
numerator * rhs.denominator == denominator * rhs.numerator
|
||||
else
|
||||
rhs == self
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Numeric
|
||||
def to_r
|
||||
Rational(self, 1)
|
||||
end
|
||||
end
|
||||
|
||||
module Kernel
|
||||
def Rational(numerator, denominator = 1)
|
||||
a = numerator
|
||||
b = denominator
|
||||
a, b = b, a % b until b == 0
|
||||
Rational._new(numerator.div(a), denominator.div(a))
|
||||
end
|
||||
|
||||
[:+, :-, :*, :/, :<=>, :==, :<, :<=, :>, :>=].each do |op|
|
||||
original_operator_name = :"__original_operator_#{op}_rational"
|
||||
Fixnum.instance_eval do
|
||||
alias_method original_operator_name, op
|
||||
define_method op do |rhs|
|
||||
if rhs.is_a? Rational
|
||||
Rational(self).__send__(op, rhs)
|
||||
else
|
||||
__send__(original_operator_name, rhs)
|
||||
end
|
||||
end
|
||||
end
|
||||
Float.instance_eval do
|
||||
alias_method original_operator_name, op
|
||||
define_method op do |rhs|
|
||||
if rhs.is_a? Rational
|
||||
rhs = rhs.to_f
|
||||
end
|
||||
__send__(original_operator_name, rhs)
|
||||
end
|
||||
end if Object.const_defined?(:Float)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,209 @@
|
||||
#include <mruby.h>
|
||||
#include <mruby/class.h>
|
||||
#include <mruby/string.h>
|
||||
#include <mruby/numeric.h>
|
||||
|
||||
struct mrb_rational {
|
||||
mrb_int numerator;
|
||||
mrb_int denominator;
|
||||
};
|
||||
|
||||
#if MRB_INT_MAX <= INTPTR_MAX
|
||||
|
||||
#define RATIONAL_USE_ISTRUCT
|
||||
/* use TT_ISTRUCT */
|
||||
#include <mruby/istruct.h>
|
||||
|
||||
#define rational_ptr(mrb, v) (struct mrb_rational*)mrb_istruct_ptr(v)
|
||||
|
||||
static struct RBasic*
|
||||
rational_alloc(mrb_state *mrb, struct RClass *c, struct mrb_rational **p)
|
||||
{
|
||||
struct RIStruct *s;
|
||||
|
||||
s = (struct RIStruct*)mrb_obj_alloc(mrb, MRB_TT_ISTRUCT, c);
|
||||
*p = (struct mrb_rational*)s->inline_data;
|
||||
|
||||
return (struct RBasic*)s;
|
||||
}
|
||||
|
||||
#else
|
||||
/* use TT_DATA */
|
||||
#include <mruby/data.h>
|
||||
|
||||
static const struct mrb_data_type mrb_rational_type = {"Rational", mrb_free};
|
||||
|
||||
static struct RBasic*
|
||||
rational_alloc(mrb_state *mrb, struct RClass *c, struct mrb_rational **p)
|
||||
{
|
||||
struct RData *d;
|
||||
|
||||
Data_Make_Struct(mrb, c, struct mrb_rational, &mrb_rational_type, *p, d);
|
||||
|
||||
return (struct RBasic*)d;
|
||||
}
|
||||
|
||||
static struct mrb_rational*
|
||||
rational_ptr(mrb_state *mrb, mrb_value v)
|
||||
{
|
||||
struct mrb_rational *p;
|
||||
|
||||
p = DATA_GET_PTR(mrb, v, &mrb_rational_type, struct mrb_rational);
|
||||
if (!p) {
|
||||
mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized rational");
|
||||
}
|
||||
return p;
|
||||
}
|
||||
#endif
|
||||
|
||||
static mrb_value
|
||||
rational_numerator(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct mrb_rational *p = rational_ptr(mrb, self);
|
||||
return mrb_fixnum_value(p->numerator);
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
rational_denominator(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct mrb_rational *p = rational_ptr(mrb, self);
|
||||
return mrb_fixnum_value(p->denominator);
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
rational_new(mrb_state *mrb, mrb_int numerator, mrb_int denominator)
|
||||
{
|
||||
struct RClass *c = mrb_class_get(mrb, "Rational");
|
||||
struct mrb_rational *p;
|
||||
struct RBasic *rat = rational_alloc(mrb, c, &p);
|
||||
p->numerator = numerator;
|
||||
p->denominator = denominator;
|
||||
MRB_SET_FROZEN_FLAG(rat);
|
||||
return mrb_obj_value(rat);
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
rational_s_new(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
mrb_int numerator, denominator;
|
||||
|
||||
#ifdef MRB_WITHOUT_FLOAT
|
||||
mrb_get_args(mrb, "ii", &numerator, &denominator);
|
||||
#else
|
||||
|
||||
#define DROP_PRECISION(f, num, denom) \
|
||||
do { \
|
||||
while (f < (mrb_float)MRB_INT_MIN || f > (mrb_float)MRB_INT_MAX) { \
|
||||
num /= 2; \
|
||||
denom /= 2; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
mrb_value numv, denomv;
|
||||
|
||||
mrb_get_args(mrb, "oo", &numv, &denomv);
|
||||
if (mrb_fixnum_p(numv)) {
|
||||
numerator = mrb_fixnum(numv);
|
||||
|
||||
if (mrb_fixnum_p(denomv)) {
|
||||
denominator = mrb_fixnum(denomv);
|
||||
}
|
||||
else {
|
||||
mrb_float denomf = mrb_to_flo(mrb, denomv);
|
||||
|
||||
DROP_PRECISION(denomf, numerator, denomf);
|
||||
denominator = (mrb_int)denomf;
|
||||
}
|
||||
}
|
||||
else {
|
||||
mrb_float numf = mrb_to_flo(mrb, numv);
|
||||
|
||||
if (mrb_fixnum_p(denomv)) {
|
||||
denominator = mrb_fixnum(denomv);
|
||||
}
|
||||
else {
|
||||
mrb_float denomf = mrb_to_flo(mrb, denomv);
|
||||
|
||||
DROP_PRECISION(denomf, numf, denomf);
|
||||
denominator = (mrb_int)denomf;
|
||||
}
|
||||
|
||||
DROP_PRECISION(numf, numf, denominator);
|
||||
numerator = (mrb_int)numf;
|
||||
}
|
||||
#endif
|
||||
|
||||
return rational_new(mrb, numerator, denominator);
|
||||
}
|
||||
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
static mrb_value
|
||||
rational_to_f(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct mrb_rational *p = rational_ptr(mrb, self);
|
||||
mrb_float f = (mrb_float)p->numerator / (mrb_float)p->denominator;
|
||||
|
||||
return mrb_float_value(mrb, f);
|
||||
}
|
||||
#endif
|
||||
|
||||
static mrb_value
|
||||
rational_to_i(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct mrb_rational *p = rational_ptr(mrb, self);
|
||||
if (p->denominator == 0) {
|
||||
mrb_raise(mrb, mrb->eStandardError_class, "divided by 0");
|
||||
}
|
||||
return mrb_fixnum_value(p->numerator / p->denominator);
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
rational_to_r(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
return self;
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
rational_negative_p(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct mrb_rational *p = rational_ptr(mrb, self);
|
||||
if (p->numerator < 0) {
|
||||
return mrb_true_value();
|
||||
}
|
||||
return mrb_false_value();
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
fix_to_r(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
return rational_new(mrb, mrb_fixnum(self), 1);
|
||||
}
|
||||
|
||||
void mrb_mruby_rational_gem_init(mrb_state *mrb)
|
||||
{
|
||||
struct RClass *rat;
|
||||
|
||||
rat = mrb_define_class(mrb, "Rational", mrb_class_get(mrb, "Numeric"));
|
||||
#ifdef RATIONAL_USE_ISTRUCT
|
||||
MRB_SET_INSTANCE_TT(rat, MRB_TT_ISTRUCT);
|
||||
mrb_assert(sizeof(struct mrb_rational) < ISTRUCT_DATA_SIZE);
|
||||
#else
|
||||
MRB_SET_INSTANCE_TT(rat, MRB_TT_DATA);
|
||||
#endif
|
||||
mrb_undef_class_method(mrb, rat, "new");
|
||||
mrb_define_class_method(mrb, rat, "_new", rational_s_new, MRB_ARGS_REQ(2));
|
||||
mrb_define_method(mrb, rat, "numerator", rational_numerator, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, rat, "denominator", rational_denominator, MRB_ARGS_NONE());
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
mrb_define_method(mrb, rat, "to_f", rational_to_f, MRB_ARGS_NONE());
|
||||
#endif
|
||||
mrb_define_method(mrb, rat, "to_i", rational_to_i, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, rat, "to_r", rational_to_r, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, rat, "negative?", rational_negative_p, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, mrb->fixnum_class, "to_r", fix_to_r, MRB_ARGS_NONE());
|
||||
}
|
||||
|
||||
void
|
||||
mrb_mruby_rational_gem_final(mrb_state* mrb)
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,308 @@
|
||||
class UserDefinedNumeric < Numeric
|
||||
def initialize(n)
|
||||
@n = n
|
||||
end
|
||||
|
||||
def <=>(rhs)
|
||||
return nil unless rhs.respond_to?(:to_i)
|
||||
rhs = rhs.to_i
|
||||
rhs < 0 ? nil : @n <=> rhs
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#{self.class}(#{@n})"
|
||||
end
|
||||
end
|
||||
|
||||
class ComplexLikeNumeric < UserDefinedNumeric
|
||||
def ==(rhs)
|
||||
@n == 0 && rhs == 0
|
||||
end
|
||||
|
||||
undef <=>
|
||||
end
|
||||
|
||||
def assert_rational(exp, real)
|
||||
assert "assert_rational" do
|
||||
assert_float exp.numerator, real.numerator
|
||||
assert_float exp.denominator, real.denominator
|
||||
end
|
||||
end
|
||||
|
||||
def assert_equal_rational(exp, o1, o2)
|
||||
assert "assert_equal_rational" do
|
||||
if exp
|
||||
assert_operator(o1, :==, o2)
|
||||
assert_not_operator(o1, :!=, o2)
|
||||
else
|
||||
assert_not_operator(o1, :==, o2)
|
||||
assert_operator(o1, :!=, o2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def assert_cmp(exp, o1, o2)
|
||||
if exp == (o1 <=> o2)
|
||||
pass
|
||||
else
|
||||
flunk "", " Expected #{o1.inspect} <=> #{o2.inspect} to be #{exp}."
|
||||
end
|
||||
end
|
||||
|
||||
assert 'Rational' do
|
||||
r = 5r
|
||||
assert_equal(Rational, r.class)
|
||||
assert_equal([5, 1], [r.numerator, r.denominator])
|
||||
end
|
||||
|
||||
assert 'Kernel#Rational' do
|
||||
r = Rational(4,10)
|
||||
assert_equal(2, r.numerator)
|
||||
assert_equal(5, r.denominator)
|
||||
|
||||
r = Rational(3)
|
||||
assert_equal(3, r.numerator)
|
||||
assert_equal(1, r.denominator)
|
||||
|
||||
assert_raise(ArgumentError) { Rational() }
|
||||
assert_raise(ArgumentError) { Rational(1,2,3) }
|
||||
end
|
||||
|
||||
assert 'Rational#to_f' do
|
||||
assert_float(2.0, Rational(2).to_f)
|
||||
assert_float(2.25, Rational(9, 4).to_f)
|
||||
assert_float(-0.75, Rational(-3, 4).to_f)
|
||||
assert_float(6.666666666666667, Rational(20, 3).to_f)
|
||||
end
|
||||
|
||||
assert 'Rational#to_i' do
|
||||
assert_equal(0, Rational(2, 3).to_i)
|
||||
assert_equal(3, Rational(3).to_i)
|
||||
assert_equal(300, Rational(300.6).to_i)
|
||||
assert_equal(1, Rational(98, 71).to_i)
|
||||
assert_equal(-15, Rational(-30, 2).to_i)
|
||||
end
|
||||
|
||||
assert 'Rational#*' do
|
||||
assert_rational(Rational(4, 9), Rational(2, 3) * Rational(2, 3))
|
||||
assert_rational(Rational(900, 1), Rational(900) * Rational(1))
|
||||
assert_rational(Rational(1, 1), Rational(-2, 9) * Rational(-9, 2))
|
||||
assert_rational(Rational(9, 2), Rational(9, 8) * 4)
|
||||
assert_float( 21.77777777777778, Rational(20, 9) * 9.8)
|
||||
end
|
||||
|
||||
assert 'Rational#+' do
|
||||
assert_rational(Rational(4, 3), Rational(2, 3) + Rational(2, 3))
|
||||
assert_rational(Rational(901, 1), Rational(900) + Rational(1))
|
||||
assert_rational(Rational(-85, 18), Rational(-2, 9) + Rational(-9, 2))
|
||||
assert_rational(Rational(41, 8), Rational(9, 8) + 4)
|
||||
assert_float( 12.022222222222222, Rational(20, 9) + 9.8)
|
||||
end
|
||||
|
||||
assert 'Rational#-' do
|
||||
assert_rational(Rational(0, 1), Rational(2, 3) - Rational(2, 3))
|
||||
assert_rational(Rational(899, 1), Rational(900) - Rational(1))
|
||||
assert_rational(Rational(77, 18), Rational(-2, 9) - Rational(-9, 2))
|
||||
assert_rational(Rational(-23, 8), Rational(9, 8) - 4)
|
||||
assert_float( -7.577777777777778, Rational(20, 9) - 9.8)
|
||||
end
|
||||
|
||||
assert 'Rational#/' do
|
||||
assert_rational(Rational(1, 1), Rational(2, 3) / Rational(2, 3))
|
||||
assert_rational(Rational(900, 1), Rational(900) / Rational(1))
|
||||
assert_rational(Rational(4, 81), Rational(-2, 9) / Rational(-9, 2))
|
||||
assert_rational(Rational(9, 32), Rational(9, 8) / 4)
|
||||
assert_float( 0.22675736961451246, Rational(20, 9) / 9.8)
|
||||
end
|
||||
|
||||
assert 'Rational#==, Rational#!=' do
|
||||
assert_equal_rational(true, Rational(1,1), Rational(1))
|
||||
assert_equal_rational(true, Rational(-1,1), -1r)
|
||||
assert_equal_rational(true, Rational(13,4), 3.25)
|
||||
assert_equal_rational(true, Rational(13,3.25), Rational(4,1))
|
||||
assert_equal_rational(true, Rational(-3,-4), Rational(3,4))
|
||||
assert_equal_rational(true, Rational(-4,5), Rational(4,-5))
|
||||
assert_equal_rational(true, Rational(4,2), 2)
|
||||
assert_equal_rational(true, Rational(-4,2), -2)
|
||||
assert_equal_rational(true, Rational(4,-2), -2)
|
||||
assert_equal_rational(true, Rational(4,2), 2.0)
|
||||
assert_equal_rational(true, Rational(-4,2), -2.0)
|
||||
assert_equal_rational(true, Rational(4,-2), -2.0)
|
||||
assert_equal_rational(true, Rational(8,6), Rational(4,3))
|
||||
assert_equal_rational(false, Rational(13,4), 3)
|
||||
assert_equal_rational(false, Rational(13,4), 3.3)
|
||||
assert_equal_rational(false, Rational(2,1), 1r)
|
||||
assert_equal_rational(false, Rational(1), nil)
|
||||
assert_equal_rational(false, Rational(1), '')
|
||||
assert_equal_rational(true, 0r, UserDefinedNumeric.new(0))
|
||||
assert_equal_rational(true, 1r, UserDefinedNumeric.new(1))
|
||||
assert_equal_rational(false, 1r, UserDefinedNumeric.new(2))
|
||||
assert_equal_rational(false, -1r, UserDefinedNumeric.new(-1))
|
||||
assert_equal_rational(true, 0r, ComplexLikeNumeric.new(0))
|
||||
assert_equal_rational(false, 1r, ComplexLikeNumeric.new(1))
|
||||
assert_equal_rational(false, 1r, ComplexLikeNumeric.new(2))
|
||||
end
|
||||
|
||||
assert 'Fixnum#==(Rational), Fixnum#!=(Rational)' do
|
||||
assert_equal_rational(true, 2, Rational(4,2))
|
||||
assert_equal_rational(true, -2, Rational(-4,2))
|
||||
assert_equal_rational(true, -2, Rational(4,-2))
|
||||
assert_equal_rational(false, 3, Rational(13,4))
|
||||
end
|
||||
|
||||
assert 'Float#==(Rational), Float#!=(Rational)' do
|
||||
assert_equal_rational(true, 2.0, Rational(4,2))
|
||||
assert_equal_rational(true, -2.0, Rational(-4,2))
|
||||
assert_equal_rational(true, -2.0, Rational(4,-2))
|
||||
assert_equal_rational(false, 3.3, Rational(13,4))
|
||||
end
|
||||
|
||||
assert 'Rational#<=>' do
|
||||
assert_cmp(-1, Rational(-1), Rational(0))
|
||||
assert_cmp(0, Rational(0), Rational(0))
|
||||
assert_cmp(1, Rational(1), Rational(0))
|
||||
assert_cmp(-1, Rational(-1), 0)
|
||||
assert_cmp(0, Rational(0), 0)
|
||||
assert_cmp(1, Rational(1), 0)
|
||||
assert_cmp(-1, Rational(-1), 0.0)
|
||||
assert_cmp(0, Rational(0), 0.0)
|
||||
assert_cmp(1, Rational(1), 0.0)
|
||||
assert_cmp(-1, Rational(1,2), Rational(2,3))
|
||||
assert_cmp(0, Rational(2,3), Rational(2,3))
|
||||
assert_cmp(1, Rational(2,3), Rational(1,2))
|
||||
assert_cmp(1, Rational(2,3), Rational(1,2))
|
||||
assert_cmp(1, Rational(0), Rational(-1))
|
||||
assert_cmp(-1, Rational(0), Rational(1))
|
||||
assert_cmp(1, Rational(2,3), Rational(1,2))
|
||||
assert_cmp(0, Rational(2,3), Rational(2,3))
|
||||
assert_cmp(-1, Rational(1,2), Rational(2,3))
|
||||
assert_cmp(-1, Rational(1,2), Rational(2,3))
|
||||
assert_cmp(nil, 3r, "3")
|
||||
assert_cmp(1, 3r, UserDefinedNumeric.new(2))
|
||||
assert_cmp(0, 3r, UserDefinedNumeric.new(3))
|
||||
assert_cmp(-1, 3r, UserDefinedNumeric.new(4))
|
||||
assert_cmp(nil, Rational(-3), UserDefinedNumeric.new(5))
|
||||
assert_raise(NoMethodError) { 0r <=> ComplexLikeNumeric.new(0) }
|
||||
assert_raise(NoMethodError) { 1r <=> ComplexLikeNumeric.new(2) }
|
||||
end
|
||||
|
||||
assert 'Fixnum#<=>(Rational)' do
|
||||
assert_cmp(-1, -2, Rational(-9,5))
|
||||
assert_cmp(0, 5, 5r)
|
||||
assert_cmp(1, 3, Rational(8,3))
|
||||
end
|
||||
|
||||
assert 'Float#<=>(Rational)' do
|
||||
assert_cmp(-1, -2.1, Rational(-9,5))
|
||||
assert_cmp(0, 5.0, 5r)
|
||||
assert_cmp(1, 2.7, Rational(8,3))
|
||||
end
|
||||
|
||||
assert 'Rational#<' do
|
||||
assert_operator(Rational(1,2), :<, Rational(2,3))
|
||||
assert_not_operator(Rational(2,3), :<, Rational(2,3))
|
||||
assert_operator(Rational(2,3), :<, 1)
|
||||
assert_not_operator(2r, :<, 2)
|
||||
assert_not_operator(Rational(2,3), :<, -3)
|
||||
assert_operator(Rational(-4,3), :<, -0.3)
|
||||
assert_not_operator(Rational(13,4), :<, 3.25)
|
||||
assert_not_operator(Rational(2,3), :<, 0.6)
|
||||
assert_raise(ArgumentError) { 1r < "2" }
|
||||
end
|
||||
|
||||
assert 'Fixnum#<(Rational)' do
|
||||
assert_not_operator(1, :<, Rational(2,3))
|
||||
assert_not_operator(2, :<, 2r)
|
||||
assert_operator(-3, :<, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Float#<(Rational)' do
|
||||
assert_not_operator(-0.3, :<, Rational(-4,3))
|
||||
assert_not_operator(3.25, :<, Rational(13,4))
|
||||
assert_operator(0.6, :<, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Rational#<=' do
|
||||
assert_operator(Rational(1,2), :<=, Rational(2,3))
|
||||
assert_operator(Rational(2,3), :<=, Rational(2,3))
|
||||
assert_operator(Rational(2,3), :<=, 1)
|
||||
assert_operator(2r, :<=, 2)
|
||||
assert_not_operator(Rational(2,3), :<=, -3)
|
||||
assert_operator(Rational(-4,3), :<=, -0.3)
|
||||
assert_operator(Rational(13,4), :<=, 3.25)
|
||||
assert_not_operator(Rational(2,3), :<=, 0.6)
|
||||
assert_raise(ArgumentError) { 1r <= "2" }
|
||||
end
|
||||
|
||||
assert 'Fixnum#<=(Rational)' do
|
||||
assert_not_operator(1, :<=, Rational(2,3))
|
||||
assert_operator(2, :<=, 2r)
|
||||
assert_operator(-3, :<=, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Float#<=(Rational)' do
|
||||
assert_not_operator(-0.3, :<=, Rational(-4,3))
|
||||
assert_operator(3.25, :<=, Rational(13,4))
|
||||
assert_operator(0.6, :<=, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Rational#>' do
|
||||
assert_not_operator(Rational(1,2), :>, Rational(2,3))
|
||||
assert_not_operator(Rational(2,3), :>, Rational(2,3))
|
||||
assert_not_operator(Rational(2,3), :>, 1)
|
||||
assert_not_operator(2r, :>, 2)
|
||||
assert_operator(Rational(2,3), :>, -3)
|
||||
assert_not_operator(Rational(-4,3), :>, -0.3)
|
||||
assert_not_operator(Rational(13,4), :>, 3.25)
|
||||
assert_operator(Rational(2,3), :>, 0.6)
|
||||
assert_raise(ArgumentError) { 1r > "2" }
|
||||
end
|
||||
|
||||
assert 'Fixnum#>(Rational)' do
|
||||
assert_operator(1, :>, Rational(2,3))
|
||||
assert_not_operator(2, :>, 2r)
|
||||
assert_not_operator(-3, :>, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Float#>(Rational)' do
|
||||
assert_operator(-0.3, :>, Rational(-4,3))
|
||||
assert_not_operator(3.25, :>, Rational(13,4))
|
||||
assert_not_operator(0.6, :>, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Rational#>=' do
|
||||
assert_not_operator(Rational(1,2), :>=, Rational(2,3))
|
||||
assert_operator(Rational(2,3), :>=, Rational(2,3))
|
||||
assert_not_operator(Rational(2,3), :>=, 1)
|
||||
assert_operator(2r, :>=, 2)
|
||||
assert_operator(Rational(2,3), :>=, -3)
|
||||
assert_not_operator(Rational(-4,3), :>=, -0.3)
|
||||
assert_operator(Rational(13,4), :>=, 3.25)
|
||||
assert_operator(Rational(2,3), :>=, 0.6)
|
||||
assert_raise(ArgumentError) { 1r >= "2" }
|
||||
end
|
||||
|
||||
assert 'Fixnum#>=(Rational)' do
|
||||
assert_operator(1, :>=, Rational(2,3))
|
||||
assert_operator(2, :>=, 2r)
|
||||
assert_not_operator(-3, :>=, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Float#>=(Rational)' do
|
||||
assert_operator(-0.3, :>=, Rational(-4,3))
|
||||
assert_operator(3.25, :>=, Rational(13,4))
|
||||
assert_not_operator(0.6, :>=, Rational(2,3))
|
||||
end
|
||||
|
||||
assert 'Rational#negative?' do
|
||||
assert_predicate(Rational(-2,3), :negative?)
|
||||
assert_predicate(Rational(2,-3), :negative?)
|
||||
assert_not_predicate(Rational(2,3), :negative?)
|
||||
assert_not_predicate(Rational(0), :negative?)
|
||||
end
|
||||
|
||||
assert 'Rational#frozen?' do
|
||||
assert_predicate(1r, :frozen?)
|
||||
assert_predicate(Rational(2,3), :frozen?)
|
||||
assert_predicate(4/5r, :frozen?)
|
||||
end
|
||||
Reference in New Issue
Block a user