*** Running test-EvalExpr-calls ===== CASE: -c json write (len(42)) ===== json write (len(42)) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c = len(42) ===== = len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c _ len(42) ===== _ len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c echo $[len(42)] ===== echo $[len(42)] ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c echo $[len(z = 42)] ===== echo $[len(z = 42)] ^ [ -c flag ]:1: fatal: Expected at least 1 arguments, but only got 0 ===== CASE: -c echo @[len(42)] ===== echo @[len(42)] ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c echo @[len(z = 42)] ===== echo @[len(z = 42)] ^ [ -c flag ]:1: fatal: Expected at least 1 arguments, but only got 0 ===== CASE: -c const x = len(42) ===== const x = len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c setvar x += len(42) ===== setvar x += len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c var d = {} setvar d[len(42)] = "foo" ===== setvar d[len(42)] = "foo" ^~ [ -c flag ]:3: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c var d = {} setvar len(42)->z = "foo" ===== setvar len(42)->z = "foo" ^~ [ -c flag ]:3: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c hay define Package Package foo { x = len(42) } ===== x = len(42) ^~ [ -c flag ]:4: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c if (len(42)) { echo hi } ===== if (len(42)) { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c while (len(42)) { echo hi } ===== while (len(42)) { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c for x in (len(42)) { echo $x } ===== for x in (len(42)) { echo $x } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int OK test-EvalExpr-calls *** Running test-dict-convert ===== CASE: -c = dict(1) ===== = dict(1) ^ [ -c flag ]:1: fatal: Dict() expected List or Dict, got Int ===== CASE: -c = dict("foo") ===== = dict("foo") ^ [ -c flag ]:1: fatal: Dict() expected List or Dict, got Str ===== CASE: -c = dict(len) ===== = dict(len) ^~~ [ -c flag ]:1: fatal: Dict() expected List or Dict, got Func ===== CASE: -c = dict("foo"->startswith) ===== = dict("foo"->startswith) ^~ [ -c flag ]:1: fatal: Dict() expected List or Dict, got BoundFunc ===== CASE: -c = dict([["too", "many", "parts"]]) ===== = dict([["too", "many", "parts"]]) ^ [ -c flag ]:1: fatal: Dict() expected List or Dict, got List OK test-dict-convert *** Running test-eggex ===== CASE: -c = / [ \x00 \xff ] / ===== (Eggex) (value.Eggex expr: (re.CharClass negated: F terms: [ (CharCode i: 0 u_braced: F blame_tok: (Token id: Id.Char_Hex col: 7 length: 4 span_id: 7 line: (SourceLine line_num:1 content:' = / [ \\x00 \\xff ] /' src:(source__CFlag)) tval: '\\x00' ) ) (CharCode i: 255 u_braced: F blame_tok: (Token id: Id.Char_Hex col: 12 length: 4 span_id: 9 line: (SourceLine line_num:1 content:' = / [ \\x00 \\xff ] /' src:(source__CFlag)) tval: '\\xff' ) ) ] ) ) ===== CASE: -c = / [ \x00-\xff ] / ===== (Eggex) (value.Eggex expr: (re.CharClass negated: F terms: [ (char_class_term.Range start: (CharCode i: 0 u_braced: F blame_tok: (Token id: Id.Char_Hex col: 7 length: 4 span_id: 7 line: (SourceLine line_num:1 content:' = / [ \\x00-\\xff ] /' src:(source__CFlag)) tval: '\\x00' ) ) end: (CharCode i: 255 u_braced: F blame_tok: (Token id: Id.Char_Hex col: 12 length: 4 span_id: 9 line: (SourceLine line_num:1 content:' = / [ \\x00-\\xff ] /' src:(source__CFlag)) tval: '\\xff' ) ) ) ] ) ) ===== CASE: -c = / [ $'\x00 \xff' ] / ===== = / [ $'\x00 \xff' ] / ^~ [ -c flag ]:1: fatal: Use unquoted char literal for byte 255, which is >= 128 (avoid confusing a set of bytes with a sequence) ===== CASE: -c = / [ \u{0} ] / ===== (Eggex) (value.Eggex expr: (re.CharClass negated: F terms: [ (CharCode i: 0 u_braced: T blame_tok: (Token id: Id.Char_UBraced col: 7 length: 5 span_id: 7 line: (SourceLine line_num:1 content:' = / [ \\u{0} ] /' src:(source__CFlag)) tval: '\\u{0}' ) ) ] ) ) ===== CASE: -c = / [ \u{0}-\u{1} ] / ===== (Eggex) (value.Eggex expr: (re.CharClass negated: F terms: [ (char_class_term.Range start: (CharCode i: 0 u_braced: T blame_tok: (Token id: Id.Char_UBraced col: 7 length: 5 span_id: 7 line: (SourceLine line_num:1 content:' = / [ \\u{0}-\\u{1} ] /' src:(source__CFlag)) tval: '\\u{0}' ) ) end: (CharCode i: 1 u_braced: T blame_tok: (Token id: Id.Char_UBraced col: 13 length: 5 span_id: 9 line: (SourceLine line_num:1 content:' = / [ \\u{0}-\\u{1} ] /' src:(source__CFlag)) tval: '\\u{1}' ) ) ) ] ) ) ===== CASE: -c var x =/ [ \u{80} ] /; echo $x ===== var x =/ [ \u{80} ] /; echo $x ^~~~~~ [ -c flag ]:1: fatal: ERE can't express char code 128 ===== CASE: -c var x = / [ \u{7f}-\u{80} ] /; echo $x ===== var x = / [ \u{7f}-\u{80} ] /; echo $x ^~~~~~ [ -c flag ]:1: fatal: ERE can't express char code 128 ===== CASE: -c = / [ \\ '^-]' 'abc' ] / ===== (Eggex) (value.Eggex expr: (re.CharClass negated: F terms: [ (CharCode i: 92 u_braced: F blame_tok: (Token id: Id.Char_OneChar col: 6 length: 2 span_id: 6 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\\\\' ) ) (CharCode i: 94 u_braced: F blame_tok: (Token id: Id.Left_SingleQuote col: 9 length: 1 span_id: 8 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\'' ) ) (CharCode i: 45 u_braced: F blame_tok: (Token id: Id.Left_SingleQuote col: 9 length: 1 span_id: 8 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\'' ) ) (CharCode i: 93 u_braced: F blame_tok: (Token id: Id.Left_SingleQuote col: 9 length: 1 span_id: 8 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\'' ) ) (CharCode i: 97 u_braced: F blame_tok: (Token id: Id.Left_SingleQuote col: 15 length: 1 span_id: 12 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\'' ) ) (CharCode i: 98 u_braced: F blame_tok: (Token id: Id.Left_SingleQuote col: 15 length: 1 span_id: 12 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\'' ) ) (CharCode i: 99 u_braced: F blame_tok: (Token id: Id.Left_SingleQuote col: 15 length: 1 span_id: 12 line: (SourceLine line_num:1 content:'= / [ \\\\ \'^-]\' \'abc\' ] /' src:(source__CFlag)) tval: '\'' ) ) ] ) ) ===== CASE: -c var x = / [ a-'^' ] /; echo $x ===== var x = / [ a-'^' ] /; echo $x ^ [ -c flag ]:1: fatal: Can't use char 94 as end of range in ERE syntax ===== CASE: -c var x = / [ '-'-z ] /; echo $x ===== var x = / [ '-'-z ] /; echo $x ^ [ -c flag ]:1: fatal: Can't use char 45 as start of range in ERE syntax ===== CASE: -c var x = / [ ']'-z ] /; echo $x ===== var x = / [ ']'-z ] /; echo $x ^ [ -c flag ]:1: fatal: Can't use char 93 as start of range in ERE syntax ===== CASE: -c var x = / ['^'] /; echo $x ===== [^] ===== CASE: -c var i = 42 = / @i / # splice object of wrong type ===== = / @i / # splice object of wrong type ^ [ -c flag ]:3: fatal: Eggex splice expected Str or Eggex, got Int ===== CASE: -c var i = 42 = / [a @i] / # char class splice object of wrong type ===== = / [a @i] / # char class splice object of wrong type ^ [ -c flag ]:3: fatal: Eggex char class splice expected Str, got Int OK test-eggex *** Running test-eggex-2 ===== CASE: -c var sq = / 'foo'+ / ===== ===== CASE: -c var sq = / ('foo')+ / echo $sq var sq2 = / <'foo'>+ / echo $sq2 ===== (foo)+ (foo)+ ===== CASE: -c var literal = "foo" var svs = / @literal+ / echo $svs ===== var svs = / @literal+ / ^~~~~~~ [ -c flag ]:3: fatal: POSIX EREs don't have groups without capture, so this node needs () around it. OK test-eggex-2 *** Running test-fallback-locations ===== CASE: -c if (len(42)) { echo hi } ===== if (len(42)) { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c if (1 + len(42)) { echo hi } ===== if (1 + len(42)) { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c const f = 42; func f() { echo hi } ===== const f = 42; func f() { echo hi } ^ [ -c flag ]:1: fatal: Can't assign to readonly value 'f' ===== CASE: -c for x in $[2 + len(42)] { echo hi } ===== for x in $[2 + len(42)] { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c for x in (len(42)) { echo hi } ===== for x in (len(42)) { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c while (len(42)) { echo hi } ===== while (len(42)) { echo hi } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c case (len(42)) { pat { echo argument } } ===== case (len(42)) { pat { echo argument } } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c case (42) { (len(42)) { echo arm } } ===== case (42) { (len(42)) { echo arm } } ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c case "$[len(42)]" in pat) echo hi ;; esac ===== case "$[len(42)]" in pat) echo hi ;; esac ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c var x = 3 + len(42) ===== var x = 3 + len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c const x = 3 + len(42) ===== const x = 3 + len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c setvar x = 3 + len(42) ===== setvar x = 3 + len(42) ^~ [ -c flag ]:1: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c setvar x = "s" + 5 ===== setvar x = "s" + 5 ^ [ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Int ===== CASE: -c while ("s" + 5) { echo yes } ===== while ("s" + 5) { echo yes } ^ [ -c flag ]:1: fatal: Binary operator expected numbers, got Str and Int ===== CASE: -c func f(x) { return (x) }; var x = f([1,2])[1](3); echo $x ===== func f(x) { return (x) }; var x = f([1,2])[1](3); echo $x ^ [ -c flag ]:1: fatal: Expected a function or method, got Int OK test-fallback-locations *** Running test-float-convert ===== CASE: -c = float({}) ===== = float({}) ^ [ -c flag ]:1: fatal: Float() expected Int, Float, or Str, got Dict ===== CASE: -c = float([]) ===== = float([]) ^ [ -c flag ]:1: fatal: Float() expected Int, Float, or Str, got List ===== CASE: -c = float("foo") ===== = float("foo") ^ [ -c flag ]:1: fatal: Cannot convert foo to Float ===== CASE: -c = float(len) ===== = float(len) ^~~ [ -c flag ]:1: fatal: Float() expected Int, Float, or Str, got Func ===== CASE: -c = float("foo"->startswith) ===== = float("foo"->startswith) ^~ [ -c flag ]:1: fatal: Float() expected Int, Float, or Str, got BoundFunc OK test-float-convert *** Running test-func-error-locs ===== CASE: -c = join(["foo", "bar"], " ", 99) ===== = join(["foo", "bar"], " ", 99) ^~ [ -c flag ]:1: fatal: Expected 2 arguments, but got 3 ===== CASE: -c = int() ===== = int() ^ [ -c flag ]:1: fatal: Expected at least 1 arguments, but only got 0 ===== CASE: -c = str({}) ===== = str({}) ^ [ -c flag ]:1: fatal: Str() expected Str, Int, or Float, got Dict ===== CASE: -c = "foo"->startswith("f", "o") ===== = "foo"->startswith("f", "o") ^ [ -c flag ]:1: fatal: Expected 1 arguments, but got 2 ===== CASE: -c = "foo"->startswith() ===== = "foo"->startswith() ^ [ -c flag ]:1: fatal: Expected at least 2 arguments, but only got 1 ===== CASE: -c = "foo"->startswith(1) ===== = "foo"->startswith(1) ^ [ -c flag ]:1: fatal: Arg 2 should be a Str, got Int OK test-func-error-locs *** Running test-hay ===== CASE: -c hay define package user TASK hay eval :result { package foo { # commands can be run while evaluating oops } bad 2 } ===== oops ^~~~ [ -c flag ]:7: Unknown command 'oops' while running hay [ -c flag ]:7: errexit PID 5435: command.Simple failed with status 127 OK test-hay *** Running test-hay-osh ===== CASE: -c hay define package TASK package foo { version = 1 } ===== version = 1 ^~~~~~~ [ -c flag ]:5: 'version' not found } ^ [ -c flag ]:6: Unexpected right brace ===== CASE: -c shopt --set parse_brace hay define package TASK hay eval :result { package foo { version = 1 } } ===== version = 1 ^~~~~~~ [ -c flag ]:8: Unknown command 'version' while running hay OK test-hay-osh *** Running test-int-convert ===== CASE: -c = int({}) ===== = int({}) ^ [ -c flag ]:1: fatal: Int() expected Bool, Int, Float, or Str, got Dict ===== CASE: -c = int([]) ===== = int([]) ^ [ -c flag ]:1: fatal: Int() expected Bool, Int, Float, or Str, got List ===== CASE: -c = int("foo") ===== = int("foo") ^ [ -c flag ]:1: fatal: Cannot convert foo to Int ===== CASE: -c = int(len) ===== = int(len) ^~~ [ -c flag ]:1: fatal: Int() expected Bool, Int, Float, or Str, got Func ===== CASE: -c = int("foo"->startswith) ===== = int("foo"->startswith) ^~ [ -c flag ]:1: fatal: Int() expected Bool, Int, Float, or Str, got BoundFunc OK test-int-convert *** Running test-list-convert ===== CASE: -c = list(1) ===== = list(1) ^ [ -c flag ]:1: fatal: List() expected Dict, List, or Range, got Int ===== CASE: -c = list(len) ===== = list(len) ^~~ [ -c flag ]:1: fatal: List() expected Dict, List, or Range, got Func ===== CASE: -c = list("foo"->startswith) ===== = list("foo"->startswith) ^~ [ -c flag ]:1: fatal: List() expected Dict, List, or Range, got BoundFunc OK test-list-convert *** Running test-proc-ref-param ===== CASE: -c proc p (out Ref) { setref out = "yo" } p :x p y ===== p y ^ [ -c flag ]:6: fatal: Ref param 'out' expected arg starting with colon : but got 'y' OK test-proc-ref-param *** Running test-str-convert ===== CASE: -c = str({}) ===== = str({}) ^ [ -c flag ]:1: fatal: Str() expected Str, Int, or Float, got Dict ===== CASE: -c = str([]) ===== = str([]) ^ [ -c flag ]:1: fatal: Str() expected Str, Int, or Float, got List ===== CASE: -c = str(len) ===== = str(len) ^~~ [ -c flag ]:1: fatal: Str() expected Str, Int, or Float, got Func ===== CASE: -c = str("foo"->startswith) ===== = str("foo"->startswith) ^~ [ -c flag ]:1: fatal: Str() expected Str, Int, or Float, got BoundFunc OK test-str-convert *** Running test-undefined-vars ===== CASE: -c echo hi; const y = 2 + x + 3 ===== hi echo hi; const y = 2 + x + 3 ^ [ -c flag ]:1: fatal: Undefined variable 'x' ===== CASE: -c if (x) { echo hello } ===== if (x) { echo hello } ^ [ -c flag ]:1: fatal: Undefined variable 'x' ===== CASE: -c if (${x}) { echo hi } ===== if (${x}) { echo hi } ^ [ -c flag ]:1: fatal: Undefined variable 'x' ===== CASE: -c const x = / @undef /; echo hi ===== const x = / @undef /; echo hi ^~~~~ [ -c flag ]:1: fatal: Undefined variable 'undef' ===== CASE: -c var x = undef; echo $x ===== var x = undef; echo $x ^~~~~ [ -c flag ]:1: fatal: Undefined variable 'undef' ===== CASE: -c setvar a = undef ===== setvar a = undef ^~~~~ [ -c flag ]:1: fatal: Undefined variable 'undef' OK test-undefined-vars *** Running test-user-reported ===== CASE: -c var snippets = [{status: 42}] for snippet in (snippets) { if (len(42)) { echo hi } } ===== if (len(42)) { ^~ [ -c flag ]:4: fatal: len() expected Str, List, or Dict, got Int ===== CASE: -c var count = 0 # The $ causes a weird error while (count < len(count)) { setvar count += 1 } ===== while (count < len(count)) { ^~~~~ [ -c flag ]:5: fatal: len() expected Str, List, or Dict, got Int OK test-user-reported *** Running test-word-eval-with-ysh-data ===== CASE: -c var d = {}; echo ${d:-} ===== var d = {}; echo ${d:-} ^~ [ -c flag ]:1: fatal: Can't substitute into word, got Dict ===== CASE: -c var d = {}; echo ${#d} ===== var d = {}; echo ${#d} ^ [ -c flag ]:1: fatal: Length op expected Str, BashArray, BashAssoc, got Dict ===== CASE: -c var d = {}; echo ${d[0]} ===== var d = {}; echo ${d[0]} ^~ [ -c flag ]:1: fatal: Index op expected BashArray, BashAssoc, got Dict ===== CASE: -c var d = {}; echo ${d[@]:1:3} ===== var d = {}; echo ${d[@]:1:3} ^~ [ -c flag ]:1: fatal: Slice op expected Str or BashArray, got Dict ===== CASE: -c var d = {}; echo ${!d} ===== var d = {}; echo ${!d} ^ [ -c flag ]:1: fatal: Var Ref op expected Str, got Dict ===== CASE: -c var d = {}; echo ${!d[@]} ===== var d = {}; echo ${!d[@]} ^ [ -c flag ]:1: fatal: Keys op expected Str, got Dict ===== CASE: -c var d = {}; echo ${d#prefix} ===== var d = {}; echo ${d#prefix} ^ [ -c flag ]:1: fatal: Unary op expected Str, BashArray, BashAssoc, got Dict ===== CASE: -c var d = {}; echo ${d//a/b} ===== var d = {}; echo ${d//a/b} ^ [ -c flag ]:1: fatal: Pat Sub op expected Str, BashArray, BashAssoc, got Dict OK test-word-eval-with-ysh-data *** Running test-ysh-expr-eval ===== CASE: -c echo $[42 / 0 ] ===== echo $[42 / 0 ] ^ [ -c flag ]:1: fatal: Divide by zero ===== CASE: -c var d = {}; var item = d->nonexistent ===== var d = {}; var item = d->nonexistent ^~~~~~~~~~~ [ -c flag ]:1: fatal: Method 'nonexistent' does not exist on type Dict ===== CASE: -c var d = {}; var item = d["nonexistent"] ===== var d = {}; var item = d["nonexistent"] ^~~~ [ -c flag ]:1: fatal: dict entry not found ===== CASE: -c var a = []; setvar item = a[1] ===== var a = []; setvar item = a[1] ^~~~~~ [ -c flag ]:1: fatal: index out of range ===== CASE: -c const x = 42 / 0 ===== const x = 42 / 0 ^ [ -c flag ]:1: fatal: Divide by zero ===== CASE: -c var x = "z" ++ $(false) ===== var x = "z" ++ $(false) ^~~~~ [ -c flag ]:1: errexit PID 5567: command.Simple failed with status 1 [ -c flag ]:1: errexit PID 5564: Command Sub exited with status 1 ===== CASE: -c case (42 / 0) { * { echo hi } }; echo OK ===== case (42 / 0) { * { echo hi } }; echo OK ^ [ -c flag ]:1: fatal: Divide by zero ===== CASE: -c var d = {}; for x in $[d->zzz] { echo hi } ===== var d = {}; for x in $[d->zzz] { echo hi } ^~~ [ -c flag ]:1: fatal: Method 'zzz' does not exist on type Dict ===== CASE: -c var d = {}; setvar d[42] = 3 ===== var d = {}; setvar d[42] = 3 ^~~~~~ [ -c flag ]:1: fatal: Dict index should be Str, got Int ===== CASE: -c var L = []; setvar L["key"] = 3 ===== var L = []; setvar L["key"] = 3 ^~~~~~ [ -c flag ]:1: fatal: List index should be Int, got Str OK test-ysh-expr-eval *** Running test-ysh-expr-eval-2 ===== CASE: -c var L = []; var slice = L["foo": "bar"] ===== var L = []; var slice = L["foo": "bar"] ^~~~~ [ -c flag ]:1: fatal: Slice begin should be Int, got Str ===== CASE: -c = 3 < true ===== = 3 < true ^ [ -c flag ]:1: fatal: Comparison operator expected numbers, got Int and Bool ===== CASE: -c = "a" < "b" ===== = "a" < "b" ^ [ -c flag ]:1: fatal: Comparison operator expected numbers, got Str and Str ===== CASE: -c var key = 42; var d = {[key]: 3} ===== var key = 42; var d = {[key]: 3} ^ [ -c flag ]:1: fatal: Dict keys must be strings, got Int ===== CASE: -c var d = {}; var a = d.a ===== var d = {}; var a = d.a ^ [ -c flag ]:1: fatal: dict entry not found ===== CASE: -c var d = []; var a = d.a ===== var d = []; var a = d.a ^ [ -c flag ]:1: fatal: Dot operator expected Dict, got List ===== CASE: -c = 3 ** -2 ===== = 3 ** -2 ^~ [ -c flag ]:1: fatal: Exponent can't be a negative number ===== CASE: -c = 3.2 ** 2 ===== = 3.2 ** 2 ^~ [ -c flag ]:1: fatal: Left operand should be Int, got Float ===== CASE: -c = - "foo" ===== = - "foo" ^ [ -c flag ]:1: fatal: Negation expected Int or Float, got Str OK test-ysh-expr-eval-2 *** Running test-ysh-word-eval ===== CASE: -c echo $[maybe("foo")] ===== echo $[maybe("foo")] ^~ [ -c flag ]:1: fatal: expected Null, Bool, Int, Float, Eggex, got List ===== CASE: -c source --builtin funcs.ysh; echo $[identity({key: "val"})] ===== source --builtin funcs.ysh; echo $[identity({key: "val"})] ^~ [ -c flag ]:1: fatal: expected Null, Bool, Int, Float, Eggex, got Dict ===== CASE: -c source --builtin funcs.ysh; write -- @[identity([{key: "val"}])] ===== source --builtin funcs.ysh; write -- @[identity([{key: "val"}])] ^~ [ -c flag ]:1: fatal: Expr splice expected Null, Bool, Int, Float, Eggex, got Dict ===== CASE: -c const x = [1, 2]; echo $x ===== const x = [1, 2]; echo $x ^~ [ -c flag ]:1: fatal: Can't substitute into word, got List ===== CASE: -c var x = [1, 2]; write @x ===== 1 2 ===== CASE: -c var x = [3, {}]; write @x ===== var x = [3, {}]; write @x ^~ [ -c flag ]:1: fatal: Splice expected Null, Bool, Int, Float, Eggex, got Dict ===== CASE: -c var x = [3, {}]; write @[x] ===== var x = [3, {}]; write @[x] ^~ [ -c flag ]:1: fatal: Expr splice expected Null, Bool, Int, Float, Eggex, got Dict ===== CASE: -c var x = /d+/; write @x ===== var x = /d+/; write @x ^~ [ -c flag ]:1: fatal: Splice expected List, got Eggex ===== CASE: -c var x = /d+/; write @[x] ===== var x = /d+/; write @[x] ^~ [ -c flag ]:1: fatal: Expr splice expected List, got Eggex OK test-ysh-word-eval test/ysh-runtime-errors.sh: 19 tests passed.