blob: 457db7b851f53eabc9861b1e03eff32e891524ff (
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
import std/unittest
import nimterop/cimport
cDebug()
cDisableCaching()
cDefine("FORCE")
cIncludeDir "$projpath/include"
cAddSearchDir "$projpath/include"
cCompile cSearchPath("test.c")
cPlugin:
import strutils
proc onSymbol*(sym: var Symbol) {.exportc, dynlib.} =
sym.name = sym.name.strip(chars={'_'})
cImport cSearchPath "test.h"
check TEST_INT == 512
check TEST_FLOAT == 5.12
check TEST_HEX == 0x512
when defined(osx):
check OSDEF == 10
elif defined(windows):
check OSDEF == 20
else:
check OSDEF == 30
block:
# workaround for https://github.com/nim-lang/Nim/issues/10129
const ok = OSDEF
var
pt: PRIMTYPE
ct: CUSTTYPE
s0: STRUCT0
s1: STRUCT1
s2: STRUCT2
s3: STRUCT3
s4: STRUCT4
s5: STRUCT5
s51: struct5
e: ENUM
e2: ENUM2 = enum5
e3: Enum_testh1 = enum7
e4: ENUM4 = enum11
vptr: VOIDPTR
iptr: INTPTR
u: UNION1
u2: UNION2
i: cint
pt = 3
ct = 4
s1.field1 = 5
s2.field1 = 6
s3.field1 = 7
s4.field2[2] = 5
when defined(cpp):
discard # TODO
else: # TODO: what's `defined(cpp)` for c ?
s4.field3[3] = enum1
s5.tci = test_call_int
s5.tcp = test_call_param
s5.tcp8 = test_call_param8
s51.tci = test_call_int
s51.tcv = test_call9
check s5.tci() == 5
check s51.tci() == 5
check s51.tcv() == nil
e = enum1
e2 = enum4
u2.field2 = 'c'
i = 5
check test_call_int() == 5
check test_call_param(5).field1 == 5
check test_call_param2(5, s2).field1 == 11
check test_call_param3(5, s1).field1 == 10
# error: assigning to 'enum ENUM' from incompatible type 'NI' (aka 'long long')
when defined(cpp):
discard # TODO
else:
check test_call_param4(e) == e2
check test_call_param5(5.0).field2 == 5.0
check test_call_param6(u2) == 'c'
u.field1 = 4
check test_call_param7(u) == 4
when defined(cpp):
# TODO
# note: candidate function not viable: no known conversion from 'NI *' (aka 'long long *') to 'int *' for 1st argument
# check test_call_param8(cast[ptr int](addr i)) == 25.0
discard
else:
check test_call_param8(addr i) == 25.0
check i == 25
check test_call9() == nil
check e3 == enum7
check e4 == enum11
check enum13 == 4
check enum14 == 9
check enum15 == 2
# Issue #58
multiline1()
let p = multiline2()
multiline3()
# Issue #52
var
s6: struct6
s6p: STRUCT6
e6: enum6t
e6p: ENUM6
u3: union3
u3p: UNION3
cAddStdDir()
## failing tests
when false:
static: # Error: undeclared identifier: 'foobar1'
doAssert foobar1(3) == OSDEF * 3
when false: # Error: undeclared identifier: 'foobar2'
doAssert foobar2(3) == 3 + 1
|