2009-09-10 13:14:53 -04:00
|
|
|
require_relative 'test_base'
|
2009-09-10 08:22:59 -04:00
|
|
|
require_relative '../ruby/envutil'
|
2009-09-07 19:32:32 -04:00
|
|
|
|
|
|
|
module DL
|
|
|
|
class TestCPtr < TestBase
|
2009-11-03 12:12:46 -05:00
|
|
|
def test_equals
|
|
|
|
ptr = CPtr.new 0
|
|
|
|
ptr2 = CPtr.new 0
|
|
|
|
assert_equal ptr2, ptr
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_not_equals
|
|
|
|
ptr = CPtr.new 0
|
|
|
|
assert_not_equal 10, ptr, '10 should not equal the pointer'
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_cmp
|
|
|
|
ptr = CPtr.new 0
|
|
|
|
assert_nil(ptr <=> 10, '10 should not be comparable')
|
|
|
|
end
|
|
|
|
|
2009-10-31 21:47:08 -04:00
|
|
|
def test_ref_ptr
|
|
|
|
ary = [0,1,2,4,5]
|
|
|
|
addr = CPtr.new(dlwrap(ary))
|
|
|
|
assert_equal addr.to_i, addr.ref.ptr.to_i
|
|
|
|
|
|
|
|
assert_equal addr.to_i, (+ (- addr)).to_i
|
|
|
|
end
|
|
|
|
|
2009-10-31 21:46:56 -04:00
|
|
|
def test_to_value
|
|
|
|
ary = [0,1,2,4,5]
|
|
|
|
addr = CPtr.new(dlwrap(ary))
|
|
|
|
assert_equal ary, addr.to_value
|
|
|
|
end
|
|
|
|
|
2009-09-07 19:32:32 -04:00
|
|
|
def test_free
|
|
|
|
ptr = CPtr.malloc(4)
|
|
|
|
assert_nil ptr.free
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_free=
|
2009-09-10 08:22:59 -04:00
|
|
|
assert_normal_exit(<<-"End", '[ruby-dev:39269]')
|
|
|
|
require 'dl'
|
|
|
|
DL::LIBC_SO = #{DL::LIBC_SO.dump}
|
|
|
|
DL::LIBM_SO = #{DL::LIBM_SO.dump}
|
|
|
|
include DL
|
|
|
|
@libc = dlopen(LIBC_SO)
|
|
|
|
@libm = dlopen(LIBM_SO)
|
|
|
|
free = CFunc.new(@libc['free'], TYPE_VOID, 'free')
|
|
|
|
ptr = CPtr.malloc(4)
|
|
|
|
ptr.free = free
|
|
|
|
free.ptr
|
|
|
|
ptr.free.ptr
|
|
|
|
End
|
|
|
|
|
2009-09-07 19:32:32 -04:00
|
|
|
free = CFunc.new(@libc['free'], TYPE_VOID, 'free')
|
|
|
|
ptr = CPtr.malloc(4)
|
|
|
|
ptr.free = free
|
|
|
|
|
|
|
|
assert_equal free.ptr, ptr.free.ptr
|
|
|
|
end
|
2009-10-31 21:46:44 -04:00
|
|
|
|
|
|
|
def test_null?
|
|
|
|
ptr = CPtr.new(0)
|
|
|
|
assert ptr.null?
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_size
|
|
|
|
ptr = CPtr.malloc(4)
|
|
|
|
assert_equal 4, ptr.size
|
|
|
|
DL.free ptr.to_i
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_size=
|
|
|
|
ptr = CPtr.malloc(4)
|
|
|
|
ptr.size = 10
|
|
|
|
assert_equal 10, ptr.size
|
|
|
|
DL.free ptr.to_i
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_aref_aset
|
|
|
|
check = Proc.new{|str,ptr|
|
|
|
|
assert_equal(str.size(), ptr.size())
|
|
|
|
assert_equal(str, ptr.to_s())
|
|
|
|
assert_equal(str[0,2], ptr.to_s(2))
|
|
|
|
assert_equal(str[0,2], ptr[0,2])
|
|
|
|
assert_equal(str[1,2], ptr[1,2])
|
|
|
|
assert_equal(str[1,0], ptr[1,0])
|
|
|
|
assert_equal(str[0].ord, ptr[0])
|
|
|
|
assert_equal(str[1].ord, ptr[1])
|
|
|
|
}
|
|
|
|
str = 'abc'
|
|
|
|
ptr = CPtr[str]
|
|
|
|
check.call(str, ptr)
|
|
|
|
|
|
|
|
str[0] = "c"
|
|
|
|
assert_equal 'c'.ord, ptr[0] = "c".ord
|
|
|
|
check.call(str, ptr)
|
|
|
|
|
|
|
|
str[0,2] = "aa"
|
|
|
|
assert_equal 'aa', ptr[0,2] = "aa"
|
|
|
|
check.call(str, ptr)
|
|
|
|
|
|
|
|
ptr2 = CPtr['cdeeee']
|
|
|
|
str[0,2] = "cd"
|
|
|
|
assert_equal ptr2, ptr[0,2] = ptr2
|
|
|
|
check.call(str, ptr)
|
|
|
|
|
|
|
|
ptr3 = CPtr['vvvv']
|
|
|
|
str[0,2] = "vv"
|
|
|
|
assert_equal ptr3.to_i, ptr[0,2] = ptr3.to_i
|
|
|
|
check.call(str, ptr)
|
|
|
|
end
|
2009-09-07 19:32:32 -04:00
|
|
|
end
|
|
|
|
end
|