summary refs log tree commit diff stats
path: root/tests/macros/tmacro1.nim
blob: 844738c825925402b0e18a34318341f4b47d240a (plain) (blame)
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
import  macros

from uri import `/`

macro test*(a: untyped): untyped =
  var nodes: tuple[a, b: int]
  nodes.a = 4
  nodes[1] = 45

  type
    TTypeEx = object
      x, y: int
      case b: bool
      of false: nil
      of true: z: float

  var t: TTypeEx
  t.b = true
  t.z = 4.5


test:
  "hi"

import strutils

template assertNot(arg: untyped): untyped =
  assert(not(arg))


proc foo(arg: int): void =
  discard

proc foo(arg: float): void =
  discard

static:
  ## test eqIdent
  let a = "abc_def"
  let b = "abcDef"
  let c = "AbcDef"
  let d = nnkBracketExpr.newTree() # not an identifier at all

  assert eqIdent(             a ,              b )
  assert eqIdent(newIdentNode(a),              b )
  assert eqIdent(             a , newIdentNode(b))
  assert eqIdent(newIdentNode(a), newIdentNode(b))

  assert eqIdent(               a ,                b )
  assert eqIdent(genSym(nskLet, a),                b )
  assert eqIdent(               a , genSym(nskLet, b))
  assert eqIdent(genSym(nskLet, a), genSym(nskLet, b))

  assert eqIdent(newIdentNode(  a), newIdentNode(  b))
  assert eqIdent(genSym(nskLet, a), newIdentNode(  b))
  assert eqIdent(newIdentNode(  a), genSym(nskLet, b))
  assert eqIdent(genSym(nskLet, a), genSym(nskLet, b))

  assertNot eqIdent(             c ,              b )
  assertNot eqIdent(newIdentNode(c),              b )
  assertNot eqIdent(             c , newIdentNode(b))
  assertNot eqIdent(newIdentNode(c), newIdentNode(b))

  assertNot eqIdent(               c ,                b )
  assertNot eqIdent(genSym(nskLet, c),                b )
  assertNot eqIdent(               c , genSym(nskLet, b))
  assertNot eqIdent(genSym(nskLet, c), genSym(nskLet, b))

  assertNot eqIdent(newIdentNode(  c), newIdentNode(  b))
  assertNot eqIdent(genSym(nskLet, c), newIdentNode(  b))
  assertNot eqIdent(newIdentNode(  c), genSym(nskLet, b))
  assertNot eqIdent(genSym(nskLet, c), genSym(nskLet, b))

  # eqIdent on non identifier at all
  assertNot eqIdent(a,d)

  # eqIdent on sym choice
  let fooSym = bindSym"foo"
  assert fooSym.kind in {nnkOpenSymChoice, nnkClosedSymChoice}
  assert    fooSym.eqIdent("fOO")
  assertNot fooSym.eqIdent("bar")

  var empty: NimNode
  var myLit = newLit("str")

  assert( (empty or myLit) == myLit )

  empty = newEmptyNode()

  assert( (empty or myLit) == myLit )

  proc bottom(): NimNode =
    quit("may not be evaluated")

  assert( (myLit or bottom()) == myLit )

type
  Fruit = enum
    apple
    banana
    orange

macro foo(x: typed) =
  doAssert Fruit(x.intVal) == banana

foo(banana)