#include "unittest.hpp" #include "rice/to_from_ruby.hpp" #include "rice/String.hpp" #include #include using namespace Rice; TESTSUITE(To_From_Ruby); SETUP(To_From_Ruby) { ruby_init(); } TESTCASE(object_to_ruby) { Object o(rb_str_new2("foo")); ASSERT_EQUAL(o.value(), to_ruby(o).value()); } TESTCASE(object_from_ruby) { Object o(rb_str_new2("foo")); ASSERT_EQUAL(o.value(), from_ruby(o).value()); } TESTCASE(int_to_ruby) { ASSERT_EQUAL(INT2NUM(0), to_ruby((int)0).value()); ASSERT_EQUAL(INT2NUM(-1), to_ruby((int)-1).value()); ASSERT_EQUAL(INT2NUM(1), to_ruby((int)1).value()); ASSERT_EQUAL( Object(INT2NUM(std::numeric_limits::min())), to_ruby(std::numeric_limits::min())); ASSERT_EQUAL( Object(INT2NUM(std::numeric_limits::max())), to_ruby(std::numeric_limits::max())); } TESTCASE(int_from_ruby) { ASSERT_EQUAL(0, from_ruby(INT2NUM(0))); ASSERT_EQUAL(-1, from_ruby(INT2NUM(-1))); ASSERT_EQUAL(1, from_ruby(INT2NUM(1))); ASSERT_EQUAL( std::numeric_limits::min(), from_ruby(INT2NUM(std::numeric_limits::min()))); ASSERT_EQUAL( std::numeric_limits::max(), from_ruby(INT2NUM(std::numeric_limits::max()))); } TESTCASE(long_to_ruby) { ASSERT_EQUAL(LONG2NUM(0), to_ruby((long)0).value()); ASSERT_EQUAL(LONG2NUM(-1), to_ruby((long)-1).value()); ASSERT_EQUAL(LONG2NUM(1), to_ruby((long)1).value()); ASSERT_EQUAL( LONG2NUM(FIXNUM_MAX), to_ruby(FIXNUM_MAX).value()); ASSERT_EQUAL( LONG2NUM(FIXNUM_MIN), to_ruby(FIXNUM_MIN).value()); ASSERT_EQUAL( Object(LONG2NUM(std::numeric_limits::min())), to_ruby(std::numeric_limits::min())); ASSERT_EQUAL( Object(LONG2NUM(std::numeric_limits::max())), to_ruby(std::numeric_limits::max())); } TESTCASE(long_from_ruby) { ASSERT_EQUAL(0, from_ruby(LONG2NUM(0))); ASSERT_EQUAL(-1, from_ruby(LONG2NUM(-1))); ASSERT_EQUAL(1, from_ruby(LONG2NUM(1))); ASSERT_EQUAL( FIXNUM_MIN, from_ruby(LONG2NUM(FIXNUM_MIN))); ASSERT_EQUAL( FIXNUM_MAX, from_ruby(LONG2NUM(FIXNUM_MAX))); ASSERT_EQUAL( std::numeric_limits::min(), from_ruby(LONG2NUM(std::numeric_limits::min()))); ASSERT_EQUAL( std::numeric_limits::max(), from_ruby(LONG2NUM(std::numeric_limits::max()))); } TESTCASE(unsigned_int_to_ruby) { ASSERT_EQUAL(UINT2NUM(0), to_ruby((unsigned int)0).value()); ASSERT_EQUAL(UINT2NUM(1), to_ruby((unsigned int)1).value()); ASSERT_EQUAL( Object(UINT2NUM(std::numeric_limits::min())), to_ruby(std::numeric_limits::min())); ASSERT_EQUAL( Object(UINT2NUM(std::numeric_limits::max())), to_ruby(std::numeric_limits::max())); } TESTCASE(unsigned_int_from_ruby) { ASSERT_EQUAL(0u, from_ruby(UINT2NUM(0))); ASSERT_EQUAL(1u, from_ruby(UINT2NUM(1))); ASSERT_EQUAL( std::numeric_limits::min(), from_ruby(UINT2NUM(std::numeric_limits::min()))); ASSERT_EQUAL( std::numeric_limits::max(), from_ruby(UINT2NUM(std::numeric_limits::max()))); } TESTCASE(unsigned_long_to_ruby) { ASSERT_EQUAL(ULONG2NUM(0), to_ruby((unsigned long)0).value()); ASSERT_EQUAL(ULONG2NUM(1), to_ruby((unsigned long)1).value()); ASSERT_EQUAL( ULONG2NUM(FIXNUM_MAX), to_ruby(FIXNUM_MAX).value()); ASSERT_EQUAL( Object(ULONG2NUM(std::numeric_limits::min())), to_ruby(std::numeric_limits::min())); ASSERT_EQUAL( Object(ULONG2NUM(std::numeric_limits::max())), to_ruby(std::numeric_limits::max())); } TESTCASE(unsigned_long_from_ruby) { ASSERT_EQUAL(0u, from_ruby(ULONG2NUM(0))); ASSERT_EQUAL(1u, from_ruby(ULONG2NUM(1))); ASSERT_EQUAL( static_cast(FIXNUM_MIN), from_ruby(ULONG2NUM(FIXNUM_MIN))); ASSERT_EQUAL( std::numeric_limits::min(), from_ruby(ULONG2NUM(std::numeric_limits::min()))); ASSERT_EQUAL( std::numeric_limits::max(), from_ruby(ULONG2NUM(std::numeric_limits::max()))); } TESTCASE(bool_to_ruby) { ASSERT_EQUAL(Qfalse, to_ruby(false).value()); ASSERT_EQUAL(Qtrue, to_ruby(true).value()); } TESTCASE(bool_from_ruby) { ASSERT_EQUAL(false, from_ruby(Object(Qfalse))); ASSERT_EQUAL(true, from_ruby(Object(Qtrue))); } TESTCASE(float_to_ruby) { ASSERT_EQUAL(Object(rb_float_new(0.0f)), to_ruby(0.0f)); ASSERT_EQUAL(Object(rb_float_new(-1.0f)), to_ruby(-1.0f)); ASSERT_EQUAL(Object(rb_float_new(1.0f)), to_ruby(1.0f)); ASSERT_EQUAL(Object(rb_float_new(0.5f)), to_ruby(0.5f)); ASSERT_EQUAL( Object(rb_float_new(std::numeric_limits::min())), to_ruby(std::numeric_limits::min())); ASSERT_EQUAL( Object(rb_float_new(std::numeric_limits::max())), to_ruby(std::numeric_limits::max())); ASSERT( to_ruby(std::numeric_limits::quiet_NaN()).call("nan?")); ASSERT( to_ruby(std::numeric_limits::signaling_NaN()).call("nan?")); ASSERT_EQUAL( Object(rb_float_new(std::numeric_limits::epsilon())), to_ruby(std::numeric_limits::epsilon())); } TESTCASE(float_from_ruby) { ASSERT_EQUAL(0.0f, from_ruby(rb_float_new(0.0f))); ASSERT_EQUAL(-1.0f, from_ruby(rb_float_new(-1.0f))); ASSERT_EQUAL(1.0f, from_ruby(rb_float_new(1.0f))); ASSERT_EQUAL( std::numeric_limits::min(), from_ruby(rb_float_new(std::numeric_limits::min()))); ASSERT_EQUAL( std::numeric_limits::max(), from_ruby(rb_float_new(std::numeric_limits::max()))); ASSERT( std::isnan(from_ruby(rb_float_new(std::numeric_limits::quiet_NaN())))); ASSERT( std::isnan(from_ruby(rb_float_new(std::numeric_limits::signaling_NaN())))); ASSERT_EQUAL( std::numeric_limits::epsilon(), from_ruby(rb_float_new(std::numeric_limits::epsilon()))); } TESTCASE(double_to_ruby) { ASSERT_EQUAL(Object(rb_float_new(0.0f)), to_ruby(0.0f)); ASSERT_EQUAL(Object(rb_float_new(-1.0f)), to_ruby(-1.0f)); ASSERT_EQUAL(Object(rb_float_new(1.0f)), to_ruby(1.0f)); ASSERT_EQUAL(Object(rb_float_new(0.5f)), to_ruby(0.5f)); ASSERT_EQUAL( Object(rb_float_new(std::numeric_limits::min())), to_ruby(std::numeric_limits::min())); ASSERT_EQUAL( Object(rb_float_new(std::numeric_limits::max())), to_ruby(std::numeric_limits::max())); ASSERT( to_ruby(std::numeric_limits::quiet_NaN()).call("nan?")); ASSERT( to_ruby(std::numeric_limits::signaling_NaN()).call("nan?")); ASSERT_EQUAL( Object(rb_float_new(std::numeric_limits::epsilon())), to_ruby(std::numeric_limits::epsilon())); } TESTCASE(double_from_ruby) { ASSERT_EQUAL(0.0f, from_ruby(rb_float_new(0.0f))); ASSERT_EQUAL(-1.0f, from_ruby(rb_float_new(-1.0f))); ASSERT_EQUAL(1.0f, from_ruby(rb_float_new(1.0f))); ASSERT_EQUAL( std::numeric_limits::min(), from_ruby(rb_float_new(std::numeric_limits::min()))); ASSERT_EQUAL( std::numeric_limits::max(), from_ruby(rb_float_new(std::numeric_limits::max()))); ASSERT( std::isnan(from_ruby(rb_float_new(std::numeric_limits::quiet_NaN())))); ASSERT( std::isnan(from_ruby(rb_float_new(std::numeric_limits::signaling_NaN())))); ASSERT_EQUAL( std::numeric_limits::epsilon(), from_ruby(rb_float_new(std::numeric_limits::epsilon()))); } TESTCASE(char_const_ptr_to_ruby) { ASSERT_EQUAL(String(""), to_ruby((char const *)"")); ASSERT_EQUAL(String("foo"), to_ruby((char const *)"foo")); } TESTCASE(char_const_ptr_from_ruby) { ASSERT_EQUAL("", from_ruby(rb_str_new2(""))); ASSERT_EQUAL("foo", from_ruby(rb_str_new2("foo"))); } TESTCASE(std_string_to_ruby) { ASSERT_EQUAL(String(""), to_ruby(std::string(""))); ASSERT_EQUAL(String("foo"), to_ruby(std::string("foo"))); } TESTCASE(std_string_from_ruby) { ASSERT_EQUAL(std::string(""), from_ruby(rb_str_new2(""))); ASSERT_EQUAL(std::string("foo"), from_ruby(rb_str_new2("foo"))); }