ndtypes 0.2.0dev4

Sign up to get free protection for your applications and to get access to all the features.
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