From 7b9b76d84069716e5b711076ba71ef77bf8a3338 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Tue, 2 Feb 2021 11:17:13 -0800 Subject: [PATCH] tests/tuples/ttuples_issues.nim: test on all backends + various improvements (#16907) * improve tests/tuples/ttuples_issues.nim: test on all backends * address comments --- tests/js/readme.md | 5 + tests/js/t16822.nim | 29 ------ tests/tuples/ttuples_issues.nim | 159 ++++++++++++++++++++------------ 3 files changed, 103 insertions(+), 90 deletions(-) create mode 100644 tests/js/readme.md delete mode 100644 tests/js/t16822.nim diff --git a/tests/js/readme.md b/tests/js/readme.md new file mode 100644 index 0000000000..7fcc722fa2 --- /dev/null +++ b/tests/js/readme.md @@ -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`) diff --git a/tests/js/t16822.nim b/tests/js/t16822.nim deleted file mode 100644 index 687d60be93..0000000000 --- a/tests/js/t16822.nim +++ /dev/null @@ -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,)) \ No newline at end of file diff --git a/tests/tuples/ttuples_issues.nim b/tests/tuples/ttuples_issues.nim index f294f2f1ce..0cc505d28e 100644 --- a/tests/tuples/ttuples_issues.nim +++ b/tests/tuples/ttuples_issues.nim @@ -1,84 +1,121 @@ discard """ -output: '''(a: 1) -(a: 1) -(a: 1, b: 2) -''' + targets: "c cpp js" """ +# 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: - type - MyTuple = tuple - num: int - strings: seq[string] - ints: seq[int] + var foo = MyTuple(( + num: 7, + strings: @[], + ints: @[], + )) - var foo = MyTuple(( - num: 7, - strings: @[], - ints: @[], - )) + var bar = 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: @[])) - var fooUnnamed = MyTuple((7, @[], @[])) - var n = 7 - var fooSym = MyTuple((num: n, strings: @[], ints: @[])) + block: # bug #1910 + 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: # bug #2121 + type + Item[K,V] = tuple + key: K + value: V -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 + var q = newseq[Item[int,int]](1) + let (x,y) = q[0] + block: # bug #2369 + type HashedElem[T] = tuple[num: int, storedVal: ref T] -block t2121: - type - Item[K,V] = tuple - key: K - value: V + 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 q = newseq[Item[int,int]](1) - let (x,y) = q[0] + var g: seq[HashedElem[int]] = @[] + proc foo() = + var x: ref int + new(x) + x[] = 77 + g.append(44, x) -block t2369: - type HashedElem[T] = tuple[num: int, storedVal: ref T] + block: # bug #1986 + proc test(): int64 = + return 0xdeadbeef.int64 - 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) + const items = [ + (var1: test(), var2: 100'u32), + (var1: test(), var2: 192'u32) + ] - 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() = - var x: ref int - new(x) - x[] = 77 - g.append(44, x) + block: # bug #16822 + var scores: seq[(set[char], int)] = @{{'/'} : 10} + var x1: set[char] + for item in items(scores): + x1 = item[0] -block t1986: - proc test(): int64 = - return 0xdeadbeef.int64 + doAssert x1 == {'/'} - const items = [ - (var1: test(), var2: 100'u32), - (var1: test(), var2: 192'u32) - ] + var x2: set[char] + for (chars, value) in items(scores): + x2 = chars -# bug #14911 -echo (a: 1) # works -echo (`a`: 1) # works -echo (`a`: 1, `b`: 2) # Error: named expression expected + 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,)) + +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()