tests/tuples/ttuples_issues.nim: test on all backends + various improvements (#16907)

* improve tests/tuples/ttuples_issues.nim: test on all backends

* address comments
This commit is contained in:
Timothee Cour 2021-02-02 11:17:13 -08:00 • committed by GitHub
commit 7b9b76d840
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 90 deletions

5
tests/js/readme.md Normal file
View file

@ -0,0 +1,5 @@
## notes
Prefer moving tests to a non-js directory so that they get tested across all backends automatically.
Ideally, tests/js should be reserved to code that only makes sense in js.
Note also that tests for a js specific module (e.g.: `std/jsbigints`) belong to `tests/stdlib`, (e.g.: `tests/stdlib/tjsbigints.nim`)

View file

@ -1,29 +0,0 @@
block: # bug #16822
var scores: seq[(set[char], int)] = @{{'/'} : 10}
var x1: set[char]
for item in items(scores):
x1 = item[0]
doAssert x1 == {'/'}
var x2: set[char]
for (chars, value) in items(scores):
x2 = chars
doAssert x2 == {'/'}
block: # bug #14574
proc fn(): auto =
let a = @[("foo", (12, 13))]
for (k,v) in a:
return (k,v)
doAssert fn() == ("foo", (12, 13))
block: # bug #14574
iterator fn[T](a:T): lent T = yield a
let a = (10, (11,))
proc bar(): auto =
for (x,y) in fn(a):
return (x,y)
doAssert bar() == (10, (11,))

View file

@ -1,84 +1,121 @@
discard """ discard """
output: '''(a: 1) targets: "c cpp js"
(a: 1)
(a: 1, b: 2)
'''
""" """
# targets include `cpp` because in the past, there were several cpp-specific bugs with tuples.
import tables import std/tables
template main() =
block: # bug #4479
type
MyTuple = tuple
num: int
strings: seq[string]
ints: seq[int]
block t4479: var foo = MyTuple((
type num: 7,
MyTuple = tuple strings: @[],
num: int ints: @[],
strings: seq[string] ))
ints: seq[int]
var foo = MyTuple(( var bar = MyTuple (
num: 7, num: 7,
strings: @[], strings: @[],
ints: @[], ints: @[],
)) )
var bar = ( var fooUnnamed = MyTuple((7, @[], @[]))
num: 7, var n = 7
strings: @[], var fooSym = MyTuple((num: n, strings: @[], ints: @[]))
ints: @[],
).MyTuple
var fooUnnamed = MyTuple((7, @[], @[])) block: # bug #1910
var n = 7 var p = newOrderedTable[tuple[a:int], int]()
var fooSym = MyTuple((num: n, strings: @[], ints: @[])) var q = newOrderedTable[tuple[x:int], int]()
for key in p.keys:
echo key.a
for key in q.keys:
echo key.x
block: # bug #2121
type
Item[K,V] = tuple
key: K
value: V
block t1910: var q = newseq[Item[int,int]](1)
var p = newOrderedTable[tuple[a:int], int]() let (x,y) = q[0]
var q = newOrderedTable[tuple[x:int], int]()
for key in p.keys:
echo key.a
for key in q.keys:
echo key.x
block: # bug #2369
type HashedElem[T] = tuple[num: int, storedVal: ref T]
block t2121: proc append[T](tab: var seq[HashedElem[T]], n: int, val: ref T) =
type #tab.add((num: n, storedVal: val))
Item[K,V] = tuple var he: HashedElem[T] = (num: n, storedVal: val)
key: K #tab.add(he)
value: V
var q = newseq[Item[int,int]](1) var g: seq[HashedElem[int]] = @[]
let (x,y) = q[0]
proc foo() =
var x: ref int
new(x)
x[] = 77
g.append(44, x)
block t2369: block: # bug #1986
type HashedElem[T] = tuple[num: int, storedVal: ref T] proc test(): int64 =
return 0xdeadbeef.int64
proc append[T](tab: var seq[HashedElem[T]], n: int, val: ref T) = const items = [
#tab.add((num: n, storedVal: val)) (var1: test(), var2: 100'u32),
var he: HashedElem[T] = (num: n, storedVal: val) (var1: test(), var2: 192'u32)
#tab.add(he) ]
var g: seq[HashedElem[int]] = @[] block: # bug #14911
doAssert $(a: 1) == "(a: 1)" # works
doAssert $(`a`: 1) == "(a: 1)" # works
doAssert $(`a`: 1, `b`: 2) == "(a: 1, b: 2)" # was: Error: named expression expected
proc foo() = block: # bug #16822
var x: ref int var scores: seq[(set[char], int)] = @{{'/'} : 10}
new(x)
x[] = 77
g.append(44, x)
var x1: set[char]
for item in items(scores):
x1 = item[0]
block t1986: doAssert x1 == {'/'}
proc test(): int64 =
return 0xdeadbeef.int64
const items = [ var x2: set[char]
(var1: test(), var2: 100'u32), for (chars, value) in items(scores):
(var1: test(), var2: 192'u32) x2 = chars
]
# bug #14911 doAssert x2 == {'/'}
echo (a: 1) # works
echo (`a`: 1) # works block: # bug #14574
echo (`a`: 1, `b`: 2) # Error: named expression expected proc fn(): auto =
let a = @[("foo", (12, 13))]
for (k,v) in a:
return (k,v)
doAssert fn() == ("foo", (12, 13))
block: # bug #14574
iterator fn[T](a:T): lent T = yield a
let a = (10, (11,))
proc bar(): auto =
for (x,y) in fn(a):
return (x,y)
doAssert bar() == (10, (11,))
proc mainProc() =
# other tests should be in `main`
block:
type A = tuple[x: int, y: int]
doAssert (x: 1, y: 2).A == A (x: 1, y: 2) # MCS => can't use a template
static:
main()
mainProc()
main()
mainProc()