Simple:
  - name: 'Simple'
    input:
      type: raw
      value: 'set var HelloWorld; puts $var;'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Bigger value'
    input:
      type: raw
      value: 'set var "Hello World!"; puts $var;'
    stdout:
      type: raw
      value: "Hello World!\n"
  - name: 'In middle of sentence'
    input:
      type: raw
      value: 'set var "Hello World"; puts "I like to say $var!";'
    stdout:
      type: raw
      value: "I like to say Hello World!\n"
  - name: 'In middle of brace sentence'
    input:
      type: raw
      value: 'set var "Hello World"; puts {I like to say $var!};'
    stdout:
      type: raw
      value: "I like to say $var!\n"
  - name: 'Double in middle of sentence'
    input:
      type: raw
      value: 'set var "Hello World"; puts "I like to say $var$var!";'
    stdout:
      type: raw
      value: "I like to say Hello WorldHello World!\n"
  - name: 'In front of square bracket'
    input:
      type: raw
      value: 'set var "Hello World"; puts $var[expr 3];'
    stdout:
      type: raw
      value: "Hello World3\n"
  - name: 'Behind of square bracket'
    input:
      type: raw
      value: 'set var "Hello World"; puts [expr 3]$var;'
    stdout:
      type: raw
      value: "3Hello World\n"
  - name: 'Error on non-existent'
    input:
      type: raw
      value: 'puts $var;'
    output:
      type: error
Array:
  - name: 'Simple'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var(0);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Double simple'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var(0); set var(0) Wow; puts $var(0);'
    stdout:
      type: raw
      value: "HelloWorld\nWow\n"
  - name: 'Nested'
    input:
      type: raw
      value: 'set index 2; set var($index) HelloWorld; puts $var($index);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Double Nested'
    input:
      type: raw
      value: 'set index 2; set double($index) 5; set var($double($index)) HelloWorld; puts $var($double($index));'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Using Square Brackets'
    input:
      type: raw
      value: 'set var([expr 3 * 3]) HelloWorld; puts $var([expr 3 * 3]);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Using Nested Square Brackets'
    input:
      type: raw
      value: 'set multiplier 3; set var([expr 3 * 3]) HelloWorld; puts $var([expr $multiplier * 3]);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Unset and reassign'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var(0); unset var; set var hello; puts $var;'
    stdout:
      type: raw
      value: "HelloWorld\nhello\n"
  - name: 'Error on whole use'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var;'
    output:
      type: error
  - name: 'Error on invalid index'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var(1);'
    output:
      type: error
  - name: 'Error on reassign'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var(0); set var hello'
    output:
      type: error
  - name: 'Error on unfinished bracket'
    input:
      type: raw
      value: 'set var(0) HelloWorld; puts $var(0;'
    output:
      type: error
  - name: 'Error on delete non-existing'
    input:
      type: raw
      value: 'set var(0) HelloWorld; unset var(1);'
    output:
      type: error
  - name: 'Error on object in array'
    input:
      type: raw
      value: 'set var(3) HelloWorld; set var(hello) Hi;'
    output:
      type: error
  - name: 'Error on array in normal'
    input:
      type: raw
      value: 'set var HelloWorld; set var(3) Hi;'
    output:
      type: error
  - name: 'Unset array'
    input:
      type: raw
      value: 'set var(1) HelloWorld; unset var; puts $var'
    output:
      type: error
      value: 'can''t read "var": no such variable'
  - name: 'Unset array index'
    input:
      type: raw
      value: 'set var(1) one; set var(2) two; unset var(1); puts $var(2)'
    stdout:
      type: raw
      value: "two\n"
  - name: 'Unset array index error'
    input:
      type: raw
      value: 'set var(1) one; set var(2) two; unset var(1); puts $var(1)'
    output:
      type: error
      value: 'no value found at given index: 1'
Object:
  - name: 'Simple'
    input:
      type: raw
      value: 'set var(test) HelloWorld; puts $var(test);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Double simple'
    input:
      type: raw
      value: 'set var(hi) HelloWorld; puts $var(hi); set var(hi) Wow; puts $var(hi);'
    stdout:
      type: raw
      value: "HelloWorld\nWow\n"
  - name: 'Simple Empty'
    input:
      type: raw
      value: 'set var() HelloWorld; puts $var();'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'With space'
    input:
      type: raw
      value: 'set "var(test this)" HelloWorld; puts $var(test this);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'With escape'
    input:
      type: raw
      value: 'set "var(test\ this)" HelloWorld; puts $var(test\ this);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Nested'
    input:
      type: raw
      value: 'set wow akey; set var($wow) HelloWorld; puts $var($wow);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Double Nested'
    input:
      type: raw
      value: 'set keyholder tired; set addition jup; set "wow($keyholder $addition)" akey; set var($wow($keyholder $addition)) HelloWorld; puts $var($wow($keyholder $addition));'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Using Square Brackets'
    input:
      type: raw
      value: 'set var([list wow hi]) HelloWorld; puts $var(wow hi);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Using Nested Square Brackets'
    input:
      type: raw
      value: 'set multiplier thing; set var([list thing three]) HelloWorld; puts $var([list $multiplier three]);'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Unset and reassign'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; puts $var(hello); unset var; set var hello; puts $var;'
    stdout:
      type: raw
      value: "HelloWorld\nhello\n"
  - name: 'Error on whole use'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; puts $var;'
    output:
      type: error
  - name: 'Error on invalid index'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; puts $var(wow);'
    output:
      type: error
  - name: 'Error on reassign'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; puts $var(hello); set var hello'
    output:
      type: error
  - name: 'Error on unfinished bracket'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; puts $var(hello;'
    output:
      type: error
  - name: 'Error on delete non-existing'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; unset var(hi);'
    output:
      type: error
  - name: 'Error on array in object'
    input:
      type: raw
      value: 'set var(hello) HelloWorld; set var(3) Hi;'
    output:
      type: error
  - name: 'Error on object in normal'
    input:
      type: raw
      value: 'set var HelloWorld; set var(hello) Hi;'
    output:
      type: error
  - name: 'Unset object'
    input:
      type: raw
      value: 'set var(one) HelloWorld; unset var; puts $var'
    output:
      type: error
      value: 'can''t read "var": no such variable'
  - name: 'Unset object key'
    input:
      type: raw
      value: 'set var(one) one; set var(two) two; unset var(one); puts $var(two)'
    stdout:
      type: raw
      value: "two\n"
  - name: 'Unset object key error'
    input:
      type: raw
      value: 'set var(one) one; set var(two) two; unset var(one); puts $var(one)'
    output:
      type: error
      value: 'no value found at given key: one'
Brace Variables:
  - name: 'Simple'
    input:
      type: raw
      value: 'set var HelloWorld; puts ${var};'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Weird chars'
    input:
      type: raw
      value: 'set {*!@&#^#^@!!*^#} HelloWorld; puts ${*!@&#^#^@!!*^#};'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Weird chars array'
    input:
      type: raw
      value: 'set {*!@&#^#^@!!*^#(3)} HelloWorld; puts ${*!@&#^#^@!!*^#(3)};'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Weird chars object with escape outside'
    input:
      type: raw
      value: 'set {*!@&#^#\^@!!*^#(!@&#^#^@!)} HelloWorld; puts ${*!@&#^#\^@!!*^#(!@&#^#^@!)};'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Weird chars object with escape inside'
    input:
      type: raw
      value: 'set {*!@&#^#^@!!*^#(!@&#\^#^@!)} HelloWorld; puts ${*!@&#^#^@!!*^#(!@&#\^#^@!)};'
    stdout:
      type: raw
      value: "HelloWorld\n"
  - name: 'Error on unexpected end'
    input:
      type: raw
      value: 'set var HelloWorld; puts ${var'
    output:
      type: error
