Merge tests into a larger file (part 8 of ∞) (#9583)
* merge tuple tests * merge trmacros tests * merge template tests
This commit is contained in:
parent
c735b75f6f
commit
66a76d3165
51 changed files with 862 additions and 835 deletions
|
|
@ -1,26 +0,0 @@
|
|||
discard """
|
||||
output: '''61, 125
|
||||
(Field0: 0) (Field0: 13)'''
|
||||
"""
|
||||
|
||||
import macros
|
||||
|
||||
proc `^` (a, b: int): int =
|
||||
result = 1
|
||||
for i in 1..b: result = result * a
|
||||
|
||||
var m = (0, 5)
|
||||
var n = (56, 3)
|
||||
|
||||
m = (n[0] + m[1], m[1] ^ n[1])
|
||||
|
||||
echo m[0], ", ", m[1]
|
||||
|
||||
# also test we can produce unary anon tuples in a macro:
|
||||
macro mm(): untyped =
|
||||
result = newTree(nnkTupleConstr, newLit(13))
|
||||
|
||||
proc nowTuple(): (int,) =
|
||||
result = (0,)
|
||||
|
||||
echo nowTuple(), " ", mm()
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
# Bug 4479
|
||||
|
||||
type
|
||||
MyTuple = tuple
|
||||
num: int
|
||||
strings: seq[string]
|
||||
ints: seq[int]
|
||||
|
||||
var foo = MyTuple((
|
||||
num: 7,
|
||||
strings: @[],
|
||||
ints: @[],
|
||||
))
|
||||
|
||||
var bar = (
|
||||
num: 7,
|
||||
strings: @[],
|
||||
ints: @[],
|
||||
).MyTuple
|
||||
|
||||
var fooUnnamed = MyTuple((7, @[], @[]))
|
||||
var n = 7
|
||||
var fooSym = MyTuple((num: n, strings: @[], ints: @[]))
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
# bug #1910
|
||||
import tables
|
||||
|
||||
var p: OrderedTable[tuple[a:int], int]
|
||||
var q: OrderedTable[tuple[x:int], int]
|
||||
for key in p.keys:
|
||||
echo key.a
|
||||
for key in q.keys:
|
||||
echo key.x
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
# bug #2121
|
||||
|
||||
type
|
||||
Item[K,V] = tuple
|
||||
key: K
|
||||
value: V
|
||||
|
||||
var q = newseq[Item[int,int]](0)
|
||||
let (x,y) = q[0]
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
|
||||
# bug #2369
|
||||
|
||||
type HashedElem[T] = tuple[num: int, storedVal: ref T]
|
||||
|
||||
proc append[T](tab: var seq[HashedElem[T]], n: int, val: ref T) =
|
||||
#tab.add((num: n, storedVal: val))
|
||||
var he: HashedElem[T] = (num: n, storedVal: val)
|
||||
#tab.add(he)
|
||||
|
||||
var g: seq[HashedElem[int]] = @[]
|
||||
|
||||
proc foo() =
|
||||
var x: ref int
|
||||
new(x)
|
||||
x[] = 77
|
||||
g.append(44, x)
|
||||
77
tests/tuples/ttuples_issues.nim
Normal file
77
tests/tuples/ttuples_issues.nim
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
discard """
|
||||
output: '''
|
||||
'''
|
||||
"""
|
||||
|
||||
|
||||
import tables
|
||||
|
||||
|
||||
block t4479:
|
||||
type
|
||||
MyTuple = tuple
|
||||
num: int
|
||||
strings: seq[string]
|
||||
ints: seq[int]
|
||||
|
||||
var foo = MyTuple((
|
||||
num: 7,
|
||||
strings: @[],
|
||||
ints: @[],
|
||||
))
|
||||
|
||||
var bar = (
|
||||
num: 7,
|
||||
strings: @[],
|
||||
ints: @[],
|
||||
).MyTuple
|
||||
|
||||
var fooUnnamed = MyTuple((7, @[], @[]))
|
||||
var n = 7
|
||||
var fooSym = MyTuple((num: n, strings: @[], ints: @[]))
|
||||
|
||||
|
||||
block t1910:
|
||||
var p = newOrderedTable[tuple[a:int], int]()
|
||||
var q = newOrderedTable[tuple[x:int], int]()
|
||||
for key in p.keys:
|
||||
echo key.a
|
||||
for key in q.keys:
|
||||
echo key.x
|
||||
|
||||
|
||||
block t2121:
|
||||
type
|
||||
Item[K,V] = tuple
|
||||
key: K
|
||||
value: V
|
||||
|
||||
var q = newseq[Item[int,int]](1)
|
||||
let (x,y) = q[0]
|
||||
|
||||
|
||||
block t2369:
|
||||
type HashedElem[T] = tuple[num: int, storedVal: ref T]
|
||||
|
||||
proc append[T](tab: var seq[HashedElem[T]], n: int, val: ref T) =
|
||||
#tab.add((num: n, storedVal: val))
|
||||
var he: HashedElem[T] = (num: n, storedVal: val)
|
||||
#tab.add(he)
|
||||
|
||||
var g: seq[HashedElem[int]] = @[]
|
||||
|
||||
proc foo() =
|
||||
var x: ref int
|
||||
new(x)
|
||||
x[] = 77
|
||||
g.append(44, x)
|
||||
|
||||
|
||||
block t1986:
|
||||
proc test(): int64 =
|
||||
return 0xdeadbeef.int64
|
||||
|
||||
const items = [
|
||||
(var1: test(), var2: 100'u32),
|
||||
(var1: test(), var2: 192'u32)
|
||||
]
|
||||
136
tests/tuples/ttuples_various.nim
Normal file
136
tests/tuples/ttuples_various.nim
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
discard """
|
||||
output: '''
|
||||
it's nil
|
||||
@[1, 2, 3]
|
||||
'''
|
||||
"""
|
||||
|
||||
import macros
|
||||
|
||||
|
||||
block anontuples:
|
||||
proc `^` (a, b: int): int =
|
||||
result = 1
|
||||
for i in 1..b: result = result * a
|
||||
|
||||
var m = (0, 5)
|
||||
var n = (56, 3)
|
||||
|
||||
m = (n[0] + m[1], m[1] ^ n[1])
|
||||
|
||||
doAssert m == (61, 125)
|
||||
|
||||
# also test we can produce unary anon tuples in a macro:
|
||||
macro mm(): untyped =
|
||||
result = newTree(nnkTupleConstr, newLit(13))
|
||||
|
||||
proc nowTuple(): (int,) =
|
||||
result = (0,)
|
||||
|
||||
doAssert nowTuple() == (Field0: 0)
|
||||
doAssert mm() == (Field0: 13)
|
||||
|
||||
|
||||
|
||||
block unpack_asgn:
|
||||
proc foobar(): (int, int) = (2, 4)
|
||||
|
||||
# test within a proc:
|
||||
proc pp(x: var int) =
|
||||
var y: int
|
||||
(y, x) = foobar()
|
||||
|
||||
template pt(x) =
|
||||
var y: int
|
||||
(x, y) = foobar()
|
||||
|
||||
# test within a generic:
|
||||
proc pg[T](x, y: var T) =
|
||||
pt(x)
|
||||
|
||||
# test as a top level statement:
|
||||
var x, y, a, b: int
|
||||
# test for regression:
|
||||
(x, y) = (1, 2)
|
||||
(x, y) = fooBar()
|
||||
|
||||
doAssert x == 2
|
||||
doAssert y == 4
|
||||
|
||||
pp(a)
|
||||
doAssert a == 4
|
||||
|
||||
pg(a, b)
|
||||
doAssert a == 2
|
||||
doAssert b == 0
|
||||
|
||||
|
||||
|
||||
block tuple_subscript:
|
||||
proc`[]` (t: tuple, key: string): string =
|
||||
for name, field in fieldPairs(t):
|
||||
if name == key:
|
||||
return $field
|
||||
return ""
|
||||
|
||||
proc`[]` [A,B](t: tuple, key: string, op: (proc(x: A): B)): B =
|
||||
for name, field in fieldPairs(t):
|
||||
when field is A:
|
||||
if name == key:
|
||||
return op(field)
|
||||
|
||||
proc`[]=`[T](t: var tuple, key: string, val: T) =
|
||||
for name, field in fieldPairs(t):
|
||||
when field is T:
|
||||
if name == key:
|
||||
field = val
|
||||
|
||||
var tt = (a: 1, b: "str1")
|
||||
|
||||
# test built in operator
|
||||
tt[0] = 5
|
||||
|
||||
doAssert tt[0] == 5
|
||||
doAssert `[]`(tt, 0) == 5
|
||||
|
||||
# test overloaded operator
|
||||
tt["b"] = "str2"
|
||||
doAssert tt["b"] == "str2"
|
||||
doAssert `[]`(tt, "b") == "str2"
|
||||
doAssert tt["b", proc(s: string): int = s.len] == 4
|
||||
|
||||
|
||||
|
||||
block tuple_with_seq:
|
||||
template foo(s: string = "") =
|
||||
if s.len == 0:
|
||||
echo "it's nil"
|
||||
else:
|
||||
echo s
|
||||
foo
|
||||
|
||||
# bug #2632
|
||||
proc takeTup(x: tuple[s: string;x: seq[int]]) =
|
||||
discard
|
||||
takeTup(("foo", @[]))
|
||||
|
||||
#proc foobar(): () =
|
||||
proc f(xs: seq[int]) =
|
||||
discard
|
||||
|
||||
proc g(t: tuple[n:int, xs:seq[int]]) =
|
||||
discard
|
||||
|
||||
when isMainModule:
|
||||
f(@[]) # OK
|
||||
g((1,@[1])) # OK
|
||||
g((0,@[])) # NG
|
||||
|
||||
# bug #2630
|
||||
type T = tuple[a: seq[int], b: int]
|
||||
var t: T = (@[1,2,3], 7)
|
||||
|
||||
proc test(s: seq[int]): T =
|
||||
echo s
|
||||
(s, 7)
|
||||
t = test(t.a)
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
# bug #1986 found by gdmoore
|
||||
|
||||
proc test(): int64 =
|
||||
return 0xdeadbeef.int64
|
||||
|
||||
const items = [
|
||||
(var1: test(), var2: 100'u32),
|
||||
(var1: test(), var2: 192'u32)
|
||||
]
|
||||
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
discard """
|
||||
output: '''2 4
|
||||
4
|
||||
2 0'''
|
||||
"""
|
||||
|
||||
proc foobar(): (int, int) = (2, 4)
|
||||
|
||||
# test within a proc:
|
||||
proc pp(x: var int) =
|
||||
var y: int
|
||||
(y, x) = foobar()
|
||||
|
||||
template pt(x) =
|
||||
var y: int
|
||||
(x, y) = foobar()
|
||||
|
||||
# test within a generic:
|
||||
proc pg[T](x, y: var T) =
|
||||
pt(x)
|
||||
|
||||
# test as a top level statement:
|
||||
var x, y, a, b: int
|
||||
# test for regression:
|
||||
(x, y) = (1, 2)
|
||||
(x, y) = fooBar()
|
||||
|
||||
echo x, " ", y
|
||||
|
||||
pp(a)
|
||||
echo a
|
||||
|
||||
pg(a, b)
|
||||
echo a, " ", b
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
discard """
|
||||
output: '''5
|
||||
5
|
||||
str2
|
||||
str2
|
||||
4'''
|
||||
"""
|
||||
|
||||
proc`[]` (t: tuple, key: string): string =
|
||||
for name, field in fieldPairs(t):
|
||||
if name == key:
|
||||
return $field
|
||||
return ""
|
||||
|
||||
|
||||
proc`[]` [A,B](t: tuple, key: string, op: (proc(x: A): B)): B =
|
||||
for name, field in fieldPairs(t):
|
||||
when field is A:
|
||||
if name == key:
|
||||
return op(field)
|
||||
|
||||
proc`[]=`[T](t: var tuple, key: string, val: T) =
|
||||
for name, field in fieldPairs(t):
|
||||
when field is T:
|
||||
if name == key:
|
||||
field = val
|
||||
|
||||
var tt = (a: 1, b: "str1")
|
||||
|
||||
# test built in operator
|
||||
tt[0] = 5
|
||||
echo tt[0]
|
||||
echo `[]`(tt, 0)
|
||||
|
||||
|
||||
# test overloaded operator
|
||||
tt["b"] = "str2"
|
||||
echo tt["b"]
|
||||
echo `[]`(tt, "b")
|
||||
echo tt["b", proc(s: string) : int = s.len]
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
discard """
|
||||
output: '''it's nil
|
||||
@[1, 2, 3]'''
|
||||
"""
|
||||
|
||||
template foo(s: string = "") =
|
||||
if s.len == 0:
|
||||
echo "it's nil"
|
||||
else:
|
||||
echo s
|
||||
|
||||
foo
|
||||
|
||||
|
||||
# bug #2632
|
||||
|
||||
proc takeTup(x: tuple[s: string;x: seq[int]]) =
|
||||
discard
|
||||
|
||||
takeTup(("foo", @[]))
|
||||
|
||||
|
||||
#proc foobar(): () =
|
||||
|
||||
proc f(xs: seq[int]) =
|
||||
discard
|
||||
|
||||
proc g(t: tuple[n:int, xs:seq[int]]) =
|
||||
discard
|
||||
|
||||
when isMainModule:
|
||||
f(@[]) # OK
|
||||
g((1,@[1])) # OK
|
||||
g((0,@[])) # NG
|
||||
|
||||
|
||||
# bug #2630
|
||||
type T = tuple[a: seq[int], b: int]
|
||||
|
||||
var t: T = (@[1,2,3], 7)
|
||||
|
||||
proc test(s: seq[int]): T =
|
||||
echo s
|
||||
(s, 7)
|
||||
|
||||
t = test(t.a)
|
||||
Loading…
Add table
Add a link
Reference in a new issue