mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
10e26cfa76
fix https://github.com/ruby/fiddle/pull/79 Users can release memory views explicitly before process exit. Reported by xtkoba. Thanks!!! https://github.com/ruby/fiddle/commit/1de64b7e76
143 lines
4.4 KiB
Ruby
143 lines
4.4 KiB
Ruby
# frozen_string_literal: true
|
|
begin
|
|
require_relative 'helper'
|
|
rescue LoadError
|
|
return
|
|
end
|
|
|
|
begin
|
|
require '-test-/memory_view'
|
|
rescue LoadError
|
|
return
|
|
end
|
|
|
|
module Fiddle
|
|
class TestMemoryView < TestCase
|
|
def setup
|
|
skip "MemoryView is unavailable" unless defined? Fiddle::MemoryView
|
|
end
|
|
|
|
def test_null_ptr
|
|
assert_raise(ArgumentError) do
|
|
MemoryView.new(Fiddle::NULL)
|
|
end
|
|
end
|
|
|
|
def test_memory_view_from_unsupported_obj
|
|
obj = Object.new
|
|
assert_raise(ArgumentError) do
|
|
MemoryView.new(obj)
|
|
end
|
|
end
|
|
|
|
def test_memory_view_from_pointer
|
|
str = Marshal.load(Marshal.dump("hello world"))
|
|
ptr = Pointer[str]
|
|
mview = MemoryView.new(ptr)
|
|
assert_same(ptr, mview.obj)
|
|
assert_equal(str.bytesize, mview.byte_size)
|
|
assert_equal(true, mview.readonly?)
|
|
assert_equal(nil, mview.format)
|
|
assert_equal(1, mview.item_size)
|
|
assert_equal(1, mview.ndim)
|
|
assert_equal(nil, mview.shape)
|
|
assert_equal(nil, mview.strides)
|
|
assert_equal(nil, mview.sub_offsets)
|
|
|
|
codes = str.codepoints
|
|
assert_equal(codes, (0...str.bytesize).map {|i| mview[i] })
|
|
end
|
|
|
|
def test_memory_view_multi_dimensional
|
|
skip "MemoryViewTestUtils is unavailable" unless defined? MemoryViewTestUtils
|
|
|
|
buf = [ 1, 2, 3, 4,
|
|
5, 6, 7, 8,
|
|
9, 10, 11, 12 ].pack("l!*")
|
|
shape = [3, 4]
|
|
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, nil)
|
|
mview = Fiddle::MemoryView.new(md)
|
|
assert_equal(buf.bytesize, mview.byte_size)
|
|
assert_equal("l!", mview.format)
|
|
assert_equal(Fiddle::SIZEOF_LONG, mview.item_size)
|
|
assert_equal(2, mview.ndim)
|
|
assert_equal(shape, mview.shape)
|
|
assert_equal([Fiddle::SIZEOF_LONG*4, Fiddle::SIZEOF_LONG], mview.strides)
|
|
assert_equal(nil, mview.sub_offsets)
|
|
assert_equal(1, mview[0, 0])
|
|
assert_equal(4, mview[0, 3])
|
|
assert_equal(6, mview[1, 1])
|
|
assert_equal(10, mview[2, 1])
|
|
end
|
|
|
|
def test_memory_view_multi_dimensional_with_strides
|
|
skip "MemoryViewTestUtils is unavailable" unless defined? MemoryViewTestUtils
|
|
|
|
buf = [ 1, 2, 3, 4, 5, 6, 7, 8,
|
|
9, 10, 11, 12, 13, 14, 15, 16 ].pack("l!*")
|
|
shape = [2, 8]
|
|
strides = [4*Fiddle::SIZEOF_LONG*2, Fiddle::SIZEOF_LONG*2]
|
|
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, strides)
|
|
mview = Fiddle::MemoryView.new(md)
|
|
assert_equal("l!", mview.format)
|
|
assert_equal(Fiddle::SIZEOF_LONG, mview.item_size)
|
|
assert_equal(buf.bytesize, mview.byte_size)
|
|
assert_equal(2, mview.ndim)
|
|
assert_equal(shape, mview.shape)
|
|
assert_equal(strides, mview.strides)
|
|
assert_equal(nil, mview.sub_offsets)
|
|
assert_equal(1, mview[0, 0])
|
|
assert_equal(5, mview[0, 2])
|
|
assert_equal(9, mview[1, 0])
|
|
assert_equal(15, mview[1, 3])
|
|
end
|
|
|
|
def test_memory_view_multi_dimensional_with_multiple_members
|
|
skip "MemoryViewTestUtils is unavailable" unless defined? MemoryViewTestUtils
|
|
|
|
buf = [ 1, 2, 3, 4, 5, 6, 7, 8,
|
|
-1, -2, -3, -4, -5, -6, -7, -8].pack("s*")
|
|
shape = [2, 4]
|
|
strides = [4*Fiddle::SIZEOF_SHORT*2, Fiddle::SIZEOF_SHORT*2]
|
|
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "ss", shape, strides)
|
|
mview = Fiddle::MemoryView.new(md)
|
|
assert_equal("ss", mview.format)
|
|
assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size)
|
|
assert_equal(buf.bytesize, mview.byte_size)
|
|
assert_equal(2, mview.ndim)
|
|
assert_equal(shape, mview.shape)
|
|
assert_equal(strides, mview.strides)
|
|
assert_equal(nil, mview.sub_offsets)
|
|
assert_equal([1, 2], mview[0, 0])
|
|
assert_equal([5, 6], mview[0, 2])
|
|
assert_equal([-1, -2], mview[1, 0])
|
|
assert_equal([-7, -8], mview[1, 3])
|
|
end
|
|
|
|
def test_export
|
|
str = "hello world"
|
|
mview_str = MemoryView.export(Pointer[str]) do |mview|
|
|
mview.to_s
|
|
end
|
|
assert_equal(str, mview_str)
|
|
end
|
|
|
|
def test_release
|
|
ptr = Pointer["hello world"]
|
|
mview = MemoryView.new(ptr)
|
|
assert_same(ptr, mview.obj)
|
|
mview.release
|
|
assert_nil(mview.obj)
|
|
end
|
|
|
|
def test_to_s
|
|
# U+3042 HIRAGANA LETTER A
|
|
data = "\u{3042}"
|
|
ptr = Pointer[data]
|
|
mview = MemoryView.new(ptr)
|
|
string = mview.to_s
|
|
assert_equal([data.b, true],
|
|
[string, string.frozen?])
|
|
end
|
|
end
|
|
end
|