summaryrefslogtreecommitdiff
path: root/test/fiddle/test_memory_view.rb
blob: c673d2633a6b555c35fd8e0320f14e89ddd7ec6a (plain)
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
# frozen_string_literal: true
begin
  require_relative 'helper'
rescue LoadError
end

begin
  require '-test-/memory_view'
rescue LoadError
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
  end
end