]> gitweb.factorcode.org Git - factor.git/blob - basis/specialized-arrays/specialized-arrays-tests.factor
c25f8ae3b15f0bb0a755653445456b4330587f6f
[factor.git] / basis / specialized-arrays / specialized-arrays-tests.factor
1 IN: specialized-arrays.tests
2 USING: tools.test alien.syntax specialized-arrays
3 specialized-arrays.private sequences alien.c-types accessors
4 kernel arrays combinators compiler compiler.units classes.struct
5 combinators.smart compiler.tree.debugger math libc destructors
6 sequences.private multiline eval words vocabs namespaces
7 assocs prettyprint alien.data math.vectors definitions
8 compiler.test ;
9 FROM: alien.c-types => float ;
10
11 SPECIALIZED-ARRAY: int
12 SPECIALIZED-ARRAYS: bool ushort char uint float ulonglong ;
13
14 [ t ] [ { 1 2 3 } >int-array int-array? ] unit-test
15
16 [ t ] [ int-array{ 1 2 3 } int-array? ] unit-test
17
18 [ 2 ] [ int-array{ 1 2 3 } second ] unit-test
19
20 [ t ] [
21     { t f t } >bool-array underlying>>
22     { 1 0 1 } bool heap-size {
23         { 1 [ >char-array ] }
24         { 4 [ >uint-array ] }
25     } case underlying>> =
26 ] unit-test
27
28 [ ushort-array{ 1234 } ] [
29     little-endian? B{ 210 4 } B{ 4 210 } ? byte-array>ushort-array
30 ] unit-test
31
32 [ B{ 210 4 1 } byte-array>ushort-array ] must-fail
33
34 [ { 3 1 3 3 7 } ] [
35     int-array{ 3 1 3 3 7 } malloc-byte-array 5 <direct-int-array> >array
36 ] unit-test
37
38 [ float-array{ HEX: 1.222,222   HEX: 1.111,112   } ]
39 [ float-array{ HEX: 1.222,222,2 HEX: 1.111,111,1 } ] unit-test
40
41 [ f ] [ float-array{ 4 3 2 1 } dup clone [ underlying>> ] bi@ eq? ] unit-test
42
43 [ f ] [ [ float-array{ 4 3 2 1 } dup clone [ underlying>> ] bi@ eq? ] compile-call ] unit-test
44
45 [ ushort-array{ 0 0 0 } ] [
46     3 ALIEN: 123 100 <direct-ushort-array> new-sequence
47     [ drop 0 ] map!
48 ] unit-test
49
50 STRUCT: test-struct
51     { x int }
52     { y int } ;
53
54 SPECIALIZED-ARRAY: test-struct
55
56 [ 1 ] [
57     1 test-struct-array{ } new-sequence length
58 ] unit-test
59
60 [ V{ test-struct } ] [
61     [ [ test-struct-array <struct> ] test-struct-array{ } output>sequence first ] final-classes
62 ] unit-test
63
64 : make-point ( x y -- struct )
65     test-struct <struct-boa> ;
66
67 [ 5/4 ] [
68     2 <test-struct-array>
69     1 2 make-point over set-first
70     3 4 make-point over set-second
71     0 [ [ x>> ] [ y>> ] bi / + ] reduce
72 ] unit-test
73
74 [ 5/4 ] [
75     [
76         2 malloc-test-struct-array
77         dup &free drop
78         1 2 make-point over set-first
79         3 4 make-point over set-second
80         0 [ [ x>> ] [ y>> ] bi / + ] reduce
81     ] with-destructors
82 ] unit-test
83
84 [ ] [ ALIEN: 123 10 <direct-test-struct-array> drop ] unit-test
85
86 [ ] [
87     [
88         10 malloc-test-struct-array
89         &free drop
90     ] with-destructors
91 ] unit-test
92
93 [ 15 ] [ 15 10 <test-struct-array> resize length ] unit-test
94
95 [ S{ test-struct f 12 20 } ] [
96     test-struct-array{
97         S{ test-struct f  4 20 } 
98         S{ test-struct f 12 20 }
99         S{ test-struct f 20 20 }
100     } second
101 ] unit-test
102
103 ! Regression
104 STRUCT: fixed-string { text char[64] } ;
105
106 SPECIALIZED-ARRAY: fixed-string
107
108 [ { ALIEN: 100 ALIEN: 140 ALIEN: 180 ALIEN: 1c0 } ] [
109     ALIEN: 100 4 <direct-fixed-string-array> [ (underlying)>> ] { } map-as
110 ] unit-test
111
112 ! Ensure that byte-length works with direct arrays
113 [ 400 ] [
114     ALIEN: 123 100 <direct-int-array> byte-length
115 ] unit-test
116
117 ! Test prettyprinting
118 [ "int-array{ 1 2 3 }" ] [ int-array{ 1 2 3 } unparse ] unit-test
119 [ "int-array@ f 100" ] [ f 100 <direct-int-array> unparse ] unit-test
120
121 ! If the C type doesn't exist, don't generate a vocab
122 SYMBOL: __does_not_exist__
123
124 [
125     """
126 IN: specialized-arrays.tests
127 USING: specialized-arrays ;
128
129 SPECIALIZED-ARRAY: __does_not_exist__ """ eval( -- )
130 ] must-fail
131
132 [ ] [
133     """
134 IN: specialized-arrays.tests
135 USING: alien.c-types classes.struct specialized-arrays ;
136
137 STRUCT: __does_not_exist__ { x int } ;
138
139 SPECIALIZED-ARRAY: __does_not_exist__
140 """ eval( -- )
141 ] unit-test
142
143 [ f ] [
144     "__does_not_exist__-array{"
145     __does_not_exist__ specialized-array-vocab lookup
146     deferred?
147 ] unit-test
148
149 [ ] [
150     [
151         \ __does_not_exist__ forget
152         __does_not_exist__ specialized-array-vocab forget-vocab
153     ] with-compilation-unit
154 ] unit-test
155
156 STRUCT: struct-resize-test { x int } ;
157
158 SPECIALIZED-ARRAY: struct-resize-test
159
160 [ 40 ] [ 10 <struct-resize-test-array> byte-length ] unit-test
161
162 : struct-resize-test-usage ( seq -- seq )
163     [ struct-resize-test <struct> swap >>x ] map
164     >struct-resize-test-array
165     [ x>> ] { } map-as ;
166     
167 [ { 10 20 30 } ] [ { 10 20 30 } struct-resize-test-usage ] unit-test
168
169 [ ] [ "IN: specialized-arrays.tests USE: classes.struct USE: alien.c-types STRUCT: struct-resize-test { x int } { y int } ;" eval( -- ) ] unit-test
170
171 [ 80 ] [ 10 <struct-resize-test-array> byte-length ] unit-test
172
173 [ { 10 20 30 } ] [ { 10 20 30 } struct-resize-test-usage ] unit-test