aboutsummaryrefslogtreecommitdiff
path: root/tests/tnimterop_c.nim
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