1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
# 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
omit "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
omit "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
omit "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
omit "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
|