summary refs log tree commit diff stats
path: root/tests/system/tvarargslen.nim
blob: 24b54a1e0e44854b7ad242e92ffc775e6271df30 (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
discard """
  output: '''
tvarargslen.nim:35:2 (1, 2)
tvarargslen.nim:36:2 12
tvarargslen.nim:37:2 1
tvarargslen.nim:38:8 
done
'''
"""
## line 10

template myecho*(a: varargs[untyped]) =
  ## shows a useful debugging echo-like proc that is dependency-free (no dependency
  ## on macros.nim) so can be used in more contexts
  const info = instantiationInfo(-1, false)
  const loc = info.filename & ":" & $info.line & ":" & $info.column & " "
  when varargsLen(a) > 0:
    echo(loc, a)
  else:
    echo(loc)

template fun*(a: varargs[untyped]): untyped =
  varargsLen(a)

template fun2*(a: varargs[typed]): untyped =
  a.varargsLen

template fun3*(a: varargs[int]): untyped =
  a.varargsLen

template fun4*(a: varargs[untyped]): untyped =
  len(a)

proc main()=
  myecho (1, 2)
  myecho 1, 2
  myecho 1
  myecho()

  doAssert fun() == 0
  doAssert fun('a') == 1
  doAssert fun("asdf", 1) == 2

  doAssert fun2() == 0
  doAssert fun2('a') == 1
  doAssert fun2("asdf", 1) == 2

  doAssert fun3() == 0
  doAssert fun3(10) == 1
  doAssert fun3(10, 11) == 2

  ## shows why `varargsLen` can't be named `len`
  doAssert fun4("abcdef") == len("abcdef")

  ## workaround for BUG:D20191218T171447 whereby if testament expected output ends
  ## in space, testament strips it from expected output but not actual output,
  ## which leads to a mismatch when running test via megatest
  echo "done"

main()