-
-
Notifications
You must be signed in to change notification settings - Fork 354
/
FFICalloutTest.class.st
109 lines (87 loc) · 3.63 KB
/
FFICalloutTest.class.st
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
"
Tests for FFICallout
"
Class {
#name : #FFICalloutTest,
#superclass : #TestCase,
#classVars : [
'CLASSVAR',
'TYPEVAR'
],
#category : #'UnifiedFFI-Tests-Tests'
}
{ #category : #private }
FFICalloutTest >> checkType: type class: typeClass arity: ptrArity argument: arg [
self assert: type class equals: typeClass.
self assert: type pointerArity equals: ptrArity.
self assert: type loader class equals: FFIMethodArgument.
self assert: type loader argName equals: arg
]
{ #category : #private }
FFICalloutTest >> checkType: type class: typeClass arity: ptrArity value: anObject [
self assert: type class equals: typeClass.
self assert: type pointerArity equals: ptrArity.
self assert: type loader class equals: FFIValueArgument.
self assert: type loader value equals: anObject
]
{ #category : #private }
FFICalloutTest >> checkType: type class: typeClass value: const [
self assert: type class equals: typeClass.
self assert: type value equals: const
]
{ #category : #private }
FFICalloutTest >> checkTypeSelf: type class: typeClass arity: ptrArity [
self assert: type class equals: typeClass.
self assert: type pointerArity equals: ptrArity.
self assert: type loader class equals: FFISelfArgument.
]
{ #category : #binding }
FFICalloutTest >> ffiBindingOf: aName [
^ self class ffiBindingOf: aName
]
{ #category : #tests }
FFICalloutTest >> testBuildingFnSpec [
| generator type s |
generator := FFICallout new.
CLASSVAR := 100.
TYPEVAR := 'long'.
generator
requestor: self;
methodArgs: #(arg1 arg2 arg3 arg11 arg12);
namedFnSpec: #( long* fn (int self , String arg1, void**arg2, TYPEVAR arg1, char arg3, 0, (ulong)42, nil, NULL, true, false , CLASSVAR, ExternalAddress arg11, ByteArray arg12 ) ).
type := generator fnSpec returnType.
self assert: type class equals: FFILong.
self assert: type pointerArity equals: 1.
self assert: (generator fnSpec arguments size) equals: 14.
s := generator fnSpec arguments readStream.
"int self" self checkTypeSelf: s next class: FFIInt32 arity: 0.
"String arg1" self checkType: s next class: FFIExternalString arity: 0 argument: 'arg1'.
"void**arg2" self checkType: s next class: FFIVoid arity: 2 argument: 'arg2'.
"TYPEVAR arg1" self checkType: s next class: FFILong arity: 0 argument: 'arg1'.
"char arg3" self checkType: s next class: FFICharacterType arity: 0 argument: 'arg3'.
"0" self checkType: s next class: FFIConst value: 0.
"(ulong)42" self checkType: s next class: FFIConst value: 42.
"nil" self checkType: s next class: FFIVoid arity: 1 value: ExternalAddress null.
"NULL" self checkType: s next class: FFIVoid arity: 1 value: ExternalAddress null.
"true" self checkType: s next class: FFIConst value: 1.
"false" self checkType: s next class: FFIConst value: 0.
"CLASSVAR" self checkType: s next class: FFIConst value: 100.
"ExternalAddress" self checkType: s next class: FFIOop arity: 0 argument: 'arg11'.
"ByteArray" self checkType: s next class: FFIOop arity: 0 argument: 'arg12'.
]
{ #category : #tests }
FFICalloutTest >> testParseOptions [
|generator|
generator := FFICallout new.
generator parseOptions: #(optStringOrNil).
self assert: (generator optionAt: #optStringOrNil).
generator parseOptions: #(- optStringOrNil).
self deny: (generator optionAt: #optStringOrNil).
"Lets move on to something a bit more advanced..."
self deny: (generator optionAt: #optNotThere).
generator parseOptions: #(+ optEncoding: utf8 optStringOrNil - optNotThere).
self assert: (generator optionAt: #optEncoding) equals: #utf8.
self assert: (generator optionAt: #optStringOrNil).
generator parseOptions: #(- optEncoding).
self deny: (generator optionAt: #optEncoding)
]