| 1 | struct Object { |
| 2 | name string |
| 3 | value int |
| 4 | } |
| 5 | |
| 6 | fn multireturner(n int, s string) (int, string) { |
| 7 | return n + 1, s |
| 8 | } |
| 9 | |
| 10 | fn test_assign_multi_expr_func() { |
| 11 | e, f := if false { |
| 12 | multireturner(-1, 'notawesome') |
| 13 | } else if false { |
| 14 | multireturner(-1, 'notawesome') |
| 15 | } else { |
| 16 | multireturner(17, 'awesomer') |
| 17 | } |
| 18 | assert e == 18 |
| 19 | assert f == 'awesomer' |
| 20 | |
| 21 | g, h := match true { |
| 22 | true { multireturner(0, 'good') } |
| 23 | false { multireturner(100, 'bad') } |
| 24 | } |
| 25 | |
| 26 | assert g == 1 |
| 27 | assert h == 'good' |
| 28 | } |
| 29 | |
| 30 | fn test_assign_multi_expr() { |
| 31 | // helpers |
| 32 | val1 := 1 |
| 33 | val2 := 2 |
| 34 | |
| 35 | // simple case for match |
| 36 | a, b, c := match false { |
| 37 | true { 1, 2, 3 } |
| 38 | false { 4, 5, 6 } |
| 39 | } |
| 40 | |
| 41 | assert a == 4 |
| 42 | assert b == 5 |
| 43 | assert c == 6 |
| 44 | |
| 45 | // test with first value `literal` |
| 46 | d, e, f := if true { 1, 'awesome', [13] } else { 0, 'bad', [0] } |
| 47 | assert d == 1 |
| 48 | assert e == 'awesome' |
| 49 | assert f == [13] |
| 50 | |
| 51 | // test with first value `literal expr` and statement |
| 52 | awesome := 'awesome' |
| 53 | g, h, i := if true { 1 + val1, awesome, [13] } else { int(0), 'bad', [0] } |
| 54 | assert g == 2 |
| 55 | assert h == 'awesome' |
| 56 | assert i == [13] |
| 57 | |
| 58 | // test with first value `.name` |
| 59 | j, k, l := if true { val1, 'awesome', [13] } else { val2, 'bad', [0] } |
| 60 | assert j == 1 |
| 61 | assert k == 'awesome' |
| 62 | assert l == [13] |
| 63 | |
| 64 | // test with first value name and peek != .comma |
| 65 | m, n, o := if true { val1 + 1, val1, val1 } else { val2, val2, val2 } |
| 66 | assert m == val1 + 1 |
| 67 | assert n == val1 |
| 68 | assert o == val1 |
| 69 | |
| 70 | // test practical complex expressions |
| 71 | val3 := Object{ |
| 72 | name: 'initial' |
| 73 | value: 19 |
| 74 | } |
| 75 | mut q, mut r, mut s := if true { |
| 76 | 1 + 1, 'awe' + 'some', Object{ |
| 77 | ...val3 |
| 78 | name: 'ok' |
| 79 | } |
| 80 | } else { |
| 81 | 0, '0', Object{} |
| 82 | } |
| 83 | assert q == 2 |
| 84 | assert r == 'awesome' |
| 85 | assert s.name == 'ok' |
| 86 | assert s.value == 19 |
| 87 | |
| 88 | // test assign to existing variables |
| 89 | q, r, s = if false { |
| 90 | 0, '0', Object{} |
| 91 | } else { |
| 92 | 5, '55', Object{ |
| 93 | ...val3 |
| 94 | value: 555 |
| 95 | } |
| 96 | } |
| 97 | assert q == 5 |
| 98 | assert r == '55' |
| 99 | assert s.value == 555 |
| 100 | assert s.name == 'initial' |
| 101 | } |
| 102 | |
| 103 | fn test_issue_9330() { |
| 104 | arr := '0.1'.split('.') |
| 105 | a0, a1 := arr[0], arr[1].int() |
| 106 | assert a0 == '0' |
| 107 | assert a1 == 1 |
| 108 | b0, b1 := arr[0].int(), arr[1] |
| 109 | assert b0 == 0 |
| 110 | assert b1 == '1' |
| 111 | c0, c1 := arr[0], arr[1] |
| 112 | assert c0 == '0' |
| 113 | assert c1 == '1' |
| 114 | d0, d1 := arr[0].int(), arr[1].f64() |
| 115 | assert d0 == 0 |
| 116 | assert d1 == 1.0 |
| 117 | } |
| 118 | |