ndtypes 0.2.0dev4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +50 -0
  3. data/Gemfile +2 -0
  4. data/History.md +0 -0
  5. data/README.md +19 -0
  6. data/Rakefile +125 -0
  7. data/ext/ruby_ndtypes/extconf.rb +55 -0
  8. data/ext/ruby_ndtypes/gc_guard.c +36 -0
  9. data/ext/ruby_ndtypes/gc_guard.h +12 -0
  10. data/ext/ruby_ndtypes/ndtypes/AUTHORS.txt +5 -0
  11. data/ext/ruby_ndtypes/ndtypes/INSTALL.txt +101 -0
  12. data/ext/ruby_ndtypes/ndtypes/LICENSE.txt +29 -0
  13. data/ext/ruby_ndtypes/ndtypes/MANIFEST.in +3 -0
  14. data/ext/ruby_ndtypes/ndtypes/Makefile.in +87 -0
  15. data/ext/ruby_ndtypes/ndtypes/README.rst +47 -0
  16. data/ext/ruby_ndtypes/ndtypes/config.guess +1530 -0
  17. data/ext/ruby_ndtypes/ndtypes/config.h.in +67 -0
  18. data/ext/ruby_ndtypes/ndtypes/config.sub +1782 -0
  19. data/ext/ruby_ndtypes/ndtypes/configure +5260 -0
  20. data/ext/ruby_ndtypes/ndtypes/configure.ac +161 -0
  21. data/ext/ruby_ndtypes/ndtypes/doc/Makefile +14 -0
  22. data/ext/ruby_ndtypes/ndtypes/doc/_static/copybutton.js +66 -0
  23. data/ext/ruby_ndtypes/ndtypes/doc/conf.py +26 -0
  24. data/ext/ruby_ndtypes/ndtypes/doc/grammar/grammar.rst +27 -0
  25. data/ext/ruby_ndtypes/ndtypes/doc/index.rst +56 -0
  26. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/context.rst +131 -0
  27. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/encodings.rst +68 -0
  28. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/fields-values.rst +175 -0
  29. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/functions.rst +72 -0
  30. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/index.rst +43 -0
  31. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/init.rst +48 -0
  32. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/io.rst +100 -0
  33. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/memory.rst +124 -0
  34. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/predicates.rst +110 -0
  35. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/typedef.rst +31 -0
  36. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/types.rst +594 -0
  37. data/ext/ruby_ndtypes/ndtypes/doc/libndtypes/util.rst +166 -0
  38. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/buffer-protocol.rst +27 -0
  39. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/index.rst +21 -0
  40. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/pattern-matching.rst +330 -0
  41. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/quickstart.rst +144 -0
  42. data/ext/ruby_ndtypes/ndtypes/doc/ndtypes/types.rst +544 -0
  43. data/ext/ruby_ndtypes/ndtypes/doc/releases/index.rst +35 -0
  44. data/ext/ruby_ndtypes/ndtypes/install-sh +527 -0
  45. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.in +271 -0
  46. data/ext/ruby_ndtypes/ndtypes/libndtypes/Makefile.vc +269 -0
  47. data/ext/ruby_ndtypes/ndtypes/libndtypes/alloc.c +230 -0
  48. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.c +268 -0
  49. data/ext/ruby_ndtypes/ndtypes/libndtypes/attr.h +109 -0
  50. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.in +73 -0
  51. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/Makefile.vc +70 -0
  52. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/README.txt +16 -0
  53. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.c +2179 -0
  54. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.h +134 -0
  55. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bpgrammar.y +428 -0
  56. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.c +2543 -0
  57. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.h +735 -0
  58. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/bplexer.l +176 -0
  59. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/export.c +543 -0
  60. data/ext/ruby_ndtypes/ndtypes/libndtypes/compat/import.c +110 -0
  61. data/ext/ruby_ndtypes/ndtypes/libndtypes/context.c +228 -0
  62. data/ext/ruby_ndtypes/ndtypes/libndtypes/copy.c +634 -0
  63. data/ext/ruby_ndtypes/ndtypes/libndtypes/encodings.c +116 -0
  64. data/ext/ruby_ndtypes/ndtypes/libndtypes/equal.c +288 -0
  65. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.c +3067 -0
  66. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.h +180 -0
  67. data/ext/ruby_ndtypes/ndtypes/libndtypes/grammar.y +417 -0
  68. data/ext/ruby_ndtypes/ndtypes/libndtypes/io.c +1658 -0
  69. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.c +2773 -0
  70. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.h +734 -0
  71. data/ext/ruby_ndtypes/ndtypes/libndtypes/lexer.l +222 -0
  72. data/ext/ruby_ndtypes/ndtypes/libndtypes/match.c +1132 -0
  73. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.c +2323 -0
  74. data/ext/ruby_ndtypes/ndtypes/libndtypes/ndtypes.h.in +893 -0
  75. data/ext/ruby_ndtypes/ndtypes/libndtypes/overflow.h +161 -0
  76. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.c +473 -0
  77. data/ext/ruby_ndtypes/ndtypes/libndtypes/parsefuncs.h +92 -0
  78. data/ext/ruby_ndtypes/ndtypes/libndtypes/parser.c +246 -0
  79. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.c +269 -0
  80. data/ext/ruby_ndtypes/ndtypes/libndtypes/seq.h +197 -0
  81. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.in +48 -0
  82. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/Makefile.vc +46 -0
  83. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/deserialize.c +1007 -0
  84. data/ext/ruby_ndtypes/ndtypes/libndtypes/serialize/serialize.c +442 -0
  85. data/ext/ruby_ndtypes/ndtypes/libndtypes/slice.h +42 -0
  86. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.c +238 -0
  87. data/ext/ruby_ndtypes/ndtypes/libndtypes/substitute.h +50 -0
  88. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.c +371 -0
  89. data/ext/ruby_ndtypes/ndtypes/libndtypes/symtable.h +100 -0
  90. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.in +55 -0
  91. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/Makefile.vc +45 -0
  92. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.c +82 -0
  93. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/alloc_fail.h +49 -0
  94. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/runtest.c +1657 -0
  95. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test.h +85 -0
  96. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_array.c +115 -0
  97. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_buffer.c +137 -0
  98. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_indent.c +201 -0
  99. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_match.c +2397 -0
  100. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_numba.c +57 -0
  101. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse.c +349 -0
  102. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_error.c +27839 -0
  103. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_parse_roundtrip.c +350 -0
  104. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_record.c +231 -0
  105. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typecheck.c +375 -0
  106. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/test_typedef.c +65 -0
  107. data/ext/ruby_ndtypes/ndtypes/libndtypes/tests/valgrind.supp +30 -0
  108. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/bench.c +79 -0
  109. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/indent.c +94 -0
  110. data/ext/ruby_ndtypes/ndtypes/libndtypes/tools/print_ast.c +96 -0
  111. data/ext/ruby_ndtypes/ndtypes/libndtypes/util.c +474 -0
  112. data/ext/ruby_ndtypes/ndtypes/libndtypes/values.c +228 -0
  113. data/ext/ruby_ndtypes/ndtypes/python/bench.py +49 -0
  114. data/ext/ruby_ndtypes/ndtypes/python/ndt_randtype.py +409 -0
  115. data/ext/ruby_ndtypes/ndtypes/python/ndt_support.py +14 -0
  116. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/__init__.py +70 -0
  117. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/_ndtypes.c +1332 -0
  118. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/docstrings.h +319 -0
  119. data/ext/ruby_ndtypes/ndtypes/python/ndtypes/pyndtypes.h +154 -0
  120. data/ext/ruby_ndtypes/ndtypes/python/test_ndtypes.py +1977 -0
  121. data/ext/ruby_ndtypes/ndtypes/setup.py +288 -0
  122. data/ext/ruby_ndtypes/ndtypes/vcbuild/INSTALL.txt +41 -0
  123. data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest32.bat +15 -0
  124. data/ext/ruby_ndtypes/ndtypes/vcbuild/runtest64.bat +13 -0
  125. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild32.bat +38 -0
  126. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcbuild64.bat +38 -0
  127. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcclean.bat +13 -0
  128. data/ext/ruby_ndtypes/ndtypes/vcbuild/vcdistclean.bat +14 -0
  129. data/ext/ruby_ndtypes/ruby_ndtypes.c +1003 -0
  130. data/ext/ruby_ndtypes/ruby_ndtypes.h +37 -0
  131. data/ext/ruby_ndtypes/ruby_ndtypes_internal.h +28 -0
  132. data/lib/ndtypes.rb +45 -0
  133. data/lib/ndtypes/errors.rb +2 -0
  134. data/lib/ndtypes/version.rb +6 -0
  135. data/ndtypes.gemspec +47 -0
  136. data/spec/gc_table_spec.rb +10 -0
  137. data/spec/ndtypes_spec.rb +289 -0
  138. data/spec/spec_helper.rb +241 -0
  139. metadata +242 -0
@@ -0,0 +1,37 @@
1
+ /* File containing headers for Ruby ndtypes wrapper.
2
+ *
3
+ * Author: Sameer Deshmukh (@v0dro)
4
+ */
5
+
6
+ #ifndef RUBY_NDTYPES_H
7
+ #define RUBY_NDTYPES_H
8
+
9
+ #if defined(__cplusplus)
10
+ extern "C" {
11
+ } /* satisfy cc-mode */
12
+ #endif
13
+
14
+ #include "ruby.h"
15
+ #include "ndtypes.h"
16
+
17
+ /* Public interface for ndtypes. */
18
+ typedef struct NdtObject NdtObject;
19
+ extern VALUE cNDTypes;
20
+
21
+ int rb_ndtypes_check_type(VALUE obj);
22
+ NdtObject * rb_ndtypes_get_ndt_object(VALUE obj);
23
+ VALUE rb_ndtypes_make_ndt_object(NdtObject *ndt_p);
24
+ VALUE rb_ndtypes_wrap_ndt_object(void);
25
+ const ndt_t * rb_ndtypes_const_ndt(VALUE ndt);
26
+ VALUE rb_ndtypes_move_subtree(VALUE src, ndt_t *t);
27
+ VALUE rb_ndtypes_from_object(VALUE type);
28
+ VALUE rb_ndtypes_set_error(ndt_context_t *ctx);
29
+ VALUE rb_ndtypes_from_type(ndt_t *type);
30
+
31
+ #define INT2BOOL(t) (t ? Qtrue : Qfalse)
32
+
33
+ #if defined(__cplusplus)
34
+ } /* extern "C" { */
35
+ #endif
36
+
37
+ #endif /* RUBY_NDTYPES_H */
@@ -0,0 +1,28 @@
1
+ /* Various internal macros and function definitions. Not exposed to other Ruby C extensions. */
2
+ /* Author: Sameer Deshmukh (@v0dro) */
3
+
4
+ #ifndef RUBY_NDTYPES_INTERNAL_H
5
+ #define RUBY_NDTYPES_INTERNAL_H
6
+
7
+ #include "ruby.h"
8
+ #include "ndtypes.h"
9
+ #include "ruby_ndtypes.h"
10
+
11
+ extern VALUE mNDTypes_GCGuard;
12
+
13
+ /* typedefs */
14
+ typedef struct NdtObject NdtObject;
15
+ typedef struct ResourceBufferObject ResourceBufferObject;
16
+
17
+ /* macros */
18
+ #if SIZEOF_LONG == SIZEOF_VOIDP
19
+ # define PTR2NUM(x) (LONG2NUM((long)(x)))
20
+ # define NUM2PTR(x) ((void*)(NUM2ULONG(x)))
21
+ #elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
22
+ # define PTR2NUM(x) (LL2NUM((LONG_LONG)(x)))
23
+ # define NUM2PTR(x) ((void*)(NUM2ULL(x)))
24
+ #else
25
+ # error ---->> ruby requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
26
+ #endif
27
+
28
+ #endif /* RUBY_NDTYPES_INTERNAL_H */
data/lib/ndtypes.rb ADDED
@@ -0,0 +1,45 @@
1
+ require 'ndtypes/errors'
2
+
3
+ begin
4
+ require "ruby_ndtypes.so"
5
+ rescue LoadError
6
+ require 'ruby_ndtypes/ruby_ndtypes.so'
7
+ end
8
+
9
+ class NDTypes
10
+ # It so happens that over riding the .new method in a super class also
11
+ # tampers with the default .new method for class that inherit from the
12
+ # super class (Index in this case). Thus we first alias the original
13
+ # new method (from Object) to __new__ when the Index class is evaluated,
14
+ # and then we use an inherited hook such that the old new method (from
15
+ # Object) is once again the default .new for the subclass.
16
+ # Refer http://blog.sidu.in/2007/12/rubys-new-as-factory.html
17
+ class << self
18
+ alias :__new__ :new
19
+
20
+ def inherited subclass
21
+ class << subclass
22
+ alias :new :__new__
23
+ end
24
+ end
25
+ end
26
+
27
+ def dup
28
+ str = self.serialize
29
+ NDT.deserialize str
30
+ end
31
+
32
+ # We over-ride the .new method so that even sending an NDTypes object can
33
+ # will allow the .new method to act as copy constructor and simply return
34
+ # copy of the argument.
35
+ def self.new *args, &block
36
+ type = args.first
37
+
38
+ return type.dup if type.is_a?(NDTypes)
39
+
40
+ allocate.tap { |i| i.send :initialize, *args, &block }
41
+ end
42
+ end
43
+
44
+ NDT = NDTypes
45
+
@@ -0,0 +1,2 @@
1
+ # Error thrown for passing wrong value.
2
+ class ValueError < RuntimeError; end
@@ -0,0 +1,6 @@
1
+ class NDTypes
2
+ # VERSION number should be the version of libxnd this is built against.
3
+ VERSION = "0.2.0dev4"
4
+ # git commit of the version.
5
+ COMMIT = "7c4cda117f7081d66c8a23bb604b78c01aea1b77"
6
+ end
data/ndtypes.gemspec ADDED
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+ $:.unshift File.expand_path("../lib", __FILE__)
3
+
4
+ require 'ndtypes/version.rb'
5
+
6
+ def get_files
7
+ files = []
8
+ ['ext', 'lib', 'spec'].each do |folder|
9
+ files.concat Dir.glob "#{folder}/**/*"
10
+ end
11
+
12
+ files.concat(
13
+ ["CONTRIBUTING.md", "Gemfile", "History.md", "ndtypes.gemspec",
14
+ "README.md", "Rakefile"
15
+ ])
16
+
17
+ files
18
+ end
19
+ files = get_files
20
+
21
+ NDTypes::DESCRIPTION = <<MSG
22
+ NDtypes is library for defining memory shapes using a easy and friendly interface.
23
+
24
+ It is a wrapper over the libndtypes C library.
25
+ MSG
26
+
27
+ Gem::Specification.new do |spec|
28
+ spec.name = 'ndtypes'
29
+ spec.version = NDTypes::VERSION
30
+ spec.authors = ['Sameer Deshmukh']
31
+ spec.email = ['sameer.deshmukh93@gmail.com']
32
+ spec.summary = %q{Ruby wrapper over libndtypes. A library for typing memory blocks.}
33
+ spec.description = NDTypes::DESCRIPTION
34
+ spec.homepage = "https://github.com/plures/ndtypes"
35
+ spec.license = 'BSD-3-Clause'
36
+
37
+ spec.files = files
38
+ spec.extensions = "ext/ruby_ndtypes/extconf.rb"
39
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
40
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
41
+ spec.require_paths = ["lib"]
42
+
43
+ spec.add_development_dependency 'rspec', '~> 3.8'
44
+ spec.add_development_dependency 'rake-compiler'
45
+ spec.add_development_dependency 'pry'
46
+ spec.add_development_dependency 'pry-byebug'
47
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe "global GC guard table" do
4
+ it "stores NDT objects as key and corresponding rbuf object as value" do
5
+ ndt = NDTypes.new("3 * int64")
6
+
7
+ gc_table = NDTypes::GCGuard.instance_variable_get(:@__gc_guard_table)
8
+ expect(gc_table.keys.size).to eq(1)
9
+ end
10
+ end
@@ -0,0 +1,289 @@
1
+ require 'spec_helper'
2
+
3
+ describe NDTypes do
4
+ context "::MAX_DIM" do
5
+ it "returns the maximum dimension possible" do
6
+ expect(NDTypes::MAX_DIM > 0).to eq(true)
7
+ end
8
+ end
9
+
10
+ context ".typedef" do
11
+ it "creates a typedef for an official type" do
12
+ NDTypes.typedef "node", "int32"
13
+
14
+ t = NDTypes.new "4 * node"
15
+ u = NDTypes.deserialize t.serialize
16
+
17
+ expect(t).to eq(u)
18
+ end
19
+ end
20
+
21
+ context ".instantiate" do
22
+ context "Typedef" do
23
+ it "instantiates NDTypes object from typedef and type" do
24
+ NDT.typedef "node", "int32"
25
+ NDT.typedef "cost", "int32"
26
+ NDT.typedef "graph", "var * var * (node, cost)"
27
+
28
+ t = NDT.new "var(offsets=[0,2]) * var(offsets=[0,3,10]) * (node, cost)"
29
+ u = NDT.instantiate "graph", t
30
+ expect(u.concrete?).to eq(true)
31
+
32
+ t = NDT.new "var(offsets=[0,2]) * var(offsets=[0,2,3]) * var(offsets=[0,1,2,3]) * (node, cost)"
33
+ expect {
34
+ NDT.instantiate("graph", t)
35
+ }.to raise_error(ValueError)
36
+ end
37
+ end
38
+ end
39
+
40
+ context ".new" do
41
+ it "creates a basic shaped memory block" do
42
+ o = NDTypes.new("3 * uint64")
43
+
44
+ expect_serialize o
45
+ end
46
+
47
+ context "tests roundtrip" do
48
+ [
49
+ "2 * 3 * float64",
50
+ "2 * 3 * {a : uint8, b : complex64}",
51
+ ].each do |s|
52
+ it "type: #{s}" do
53
+ t = NDT.new s
54
+
55
+ expect(t.to_s).to eq(s)
56
+ end
57
+ end
58
+ end
59
+
60
+ context "from NDT" do
61
+ [
62
+ "2 * 3 * {a : 10 * bytes, b : 20 * string}",
63
+ "var(offsets=[0,2]) * var(offsets=[0,3,10]) * complex128"
64
+ ].each do |s|
65
+ it "type: #{s}" do
66
+ t = NDT.new s
67
+ u = NDT.new t
68
+
69
+ expect(u).to eq(t)
70
+ end
71
+ end
72
+
73
+ it "test with offset" do
74
+ t = NDT.new "{x: complex128, y: float64}", [[0, 2], [0, 3, 5]]
75
+ u = NDT.new t
76
+
77
+ expect(u).to eq(t)
78
+ end
79
+ end
80
+
81
+ context "raises errors" do
82
+ [
83
+ "", "xyz", "var() * int64"
84
+ ].each do |t|
85
+ it "type #{t} raises ValueError" do
86
+ expect { NDT.new(t) }.to raise_error(ValueError)
87
+ end
88
+ end
89
+
90
+ it "raises TypeError" do
91
+ expect { NDT.new(nil) }.to raise_error(TypeError)
92
+ end
93
+ end
94
+
95
+ context "FixedString" do
96
+ it "checks predicates" do
97
+ t = NDT.new "fixed_string(380, 'utf16')"
98
+
99
+ expect_serialize t
100
+
101
+ expect(t.abstract?).to eq(false)
102
+ expect(t.complex?).to eq(false)
103
+ expect(t.concrete?).to eq(true)
104
+ expect(t.float?).to eq(false)
105
+ expect(t.optional?).to eq(false)
106
+ expect(t.scalar?).to eq(true)
107
+ expect(t.signed?).to eq(false)
108
+ expect(t.unsigned?).to eq(false)
109
+
110
+ expect(t.c_contiguous?).to eq(true)
111
+ expect(t.f_contiguous?).to eq(true)
112
+ end
113
+
114
+ it "checks fixed string common fields" do
115
+ [
116
+ ['ascii', 1],
117
+ ['utf8', 1],
118
+ ['utf16', 2],
119
+ ['utf32', 4]
120
+ ].each do |encoding, codepoint_size|
121
+ t = NDT.new "fixed_string(20, '#{encoding}')"
122
+
123
+ expect_serialize t
124
+ expect(t.ndim).to eq(0)
125
+
126
+ if RUBY_PLATFORM != "i686-linux"
127
+ expect(t.itemsize).to eq(20 * codepoint_size)
128
+ expect(t.align).to eq(codepoint_size)
129
+ end
130
+
131
+ # raises tests.
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ context "#match" do
138
+ it "needs to contiguity requirements" do
139
+ p = NDT.new("... * 2 * 3 * float32")
140
+ c = NDT.new("2 * 3 * float32")
141
+
142
+ expect(p.match(c)).to eq(true)
143
+ end
144
+
145
+ context "C-contiguity required for inner dimensions" do
146
+ before do
147
+ @p = NDT.new "... * C[2 * 3 * float32]"
148
+ end
149
+
150
+ it "with C input" do
151
+ c = NDT.new "2 * 3 * float32"
152
+ expect(@p.match(c)).to eq(true)
153
+ end
154
+
155
+ it "with inner dimensionss C-contiguous" do
156
+ c = NDT.new "4 * 2 * 3 * float32"
157
+ expect(@p.match(c)).to eq(true)
158
+ end
159
+
160
+ it "with inner dimensions C-contiguous" do
161
+ c = NDT.new "fixed(shape=4, step=-6) * 2 * 3 * float32"
162
+ expect(@p.match(c)).to eq(true)
163
+ end
164
+
165
+ it "with F input" do
166
+ c = NDT.new "!2 * 3 * float32"
167
+ expect(@p.match(c)).to eq(false)
168
+ end
169
+ end
170
+
171
+ context "F-contiguity required for inner dimensions" do
172
+ before do
173
+ @p = NDT.new "... * F[2 * 3 * float32]"
174
+ end
175
+
176
+ it "with F input" do
177
+ c = NDT.new "fixed(shape=10, step=6) * fixed(shape=2, step=1) * fixed(shape=3, step=2) * float32"
178
+ expect(@p.match(c)).to eq(true)
179
+ end
180
+
181
+ it "with C input" do
182
+ c = NDT.new "2 * 3 * float32"
183
+ expect(@p.match(c))
184
+ end
185
+ end
186
+
187
+ context "C-contiguity required for all dimensions after broadcast" do
188
+ before do
189
+ @p = NDT.new "C[... * 2 * 3 * float32]"
190
+ end
191
+
192
+ it "with C input" do
193
+ c = NDT.new "2 * 3 * float32"
194
+ expect(@p.match(c)).to eq(true)
195
+ end
196
+
197
+ it "with all dimensions C-contiguous" do
198
+ c = NDT.new "4 * 2 * 3 * float32"
199
+ expect(@p.match(c)).to eq(true)
200
+ end
201
+
202
+ it "with inner dimensions C-contiguous" do
203
+ c = NDT.new "fixed(shape=4, step=-6) * 2 * 3 * float32"
204
+ expect(@p.match(c)).to eq(false)
205
+ end
206
+
207
+ it "with F input" do
208
+ c = NDT.new "!2 * 3 * float32"
209
+ expect(@p.match(c)).to eq(false)
210
+ end
211
+ end
212
+
213
+ context "F-contiguity required for all dimensions after broadcast." do
214
+ before do
215
+ @p = NDT.new "F[... * 2 * 3 * float32]"
216
+ end
217
+
218
+ it "with C input" do
219
+ c = NDT.new "2 * 3 * float32"
220
+ expect(@p.match(c)).to eq(false)
221
+
222
+ c = NDT.new "4 * 2 * 3 * float32"
223
+ expect(@p.match(c)).to eq(false)
224
+ end
225
+
226
+ it "with F input" do
227
+ c = NDT.new "!2 * 3 * float32"
228
+ expect(@p.match(c)).to eq(true)
229
+ end
230
+
231
+ it "with all dimensions F-contiguous" do
232
+ c = NDT.new "!4 * 2 * 3 * float32"
233
+ expect(@p.match(c)).to eq(true)
234
+ end
235
+
236
+ it "with inner dimensions C-contiguous" do
237
+ c = NDT.new "fixed(shape=10, step=6) * fixed(shape=2, step=1) * fixed(shape=3, step=2) * float32"
238
+ expect(@p.match(c)).to eq(false)
239
+ end
240
+ end
241
+ end
242
+
243
+ context "#serialize" do
244
+ it "serializes the given shape" do
245
+ s = NDTypes.new "3 * char"
246
+ s.serialize
247
+ end
248
+ end
249
+
250
+ context "#to_s" do
251
+ it "converts to string using ndt_as_string" do
252
+ t = NDTypes.new "5 * int64"
253
+
254
+ expect(t.to_s).to eq("5 * int64")
255
+ end
256
+ end
257
+
258
+ context "#hidden_dtype" do
259
+ it "has hidden type" do
260
+
261
+ end
262
+ end
263
+
264
+ context ".deserialize" do
265
+ it "deserializes the NDT object" do
266
+ s = NDTypes.new "3 * char"
267
+ t = s.serialize
268
+ u = NDTypes.deserialize t
269
+
270
+ expect(s).to eq(u)
271
+ end
272
+ end
273
+
274
+ context "#dup" do
275
+ DTYPE_TEST_CASES.each do |dtype, mem|
276
+ it "dtype: #{dtype}" do
277
+ t = NDT.new dtype
278
+ u = t.dup
279
+
280
+ expect(t).to eq(u)
281
+ expect(t.ast).to eq(u.ast)
282
+ end
283
+ end
284
+
285
+ skip "tests GC -- figure how to do this." do
286
+
287
+ end
288
+ end
289
+ end