# Test if the puts command works
Puts:
  - name: Simple
    input:
      type: raw
      value: 'puts HelloWorld'
    stdout:
      type: raw
      value: "HelloWorld\n"

  - name: 'With -nonewline'
    input:
      type: raw
      value: 'puts -nonewline HelloWorld'
    stdout:
      type: raw
      value: HelloWorld

  - name: 'With longer text'
    input:
      type: raw
      value: 'puts "Hello World!"'
    stdout:
      type: raw
      value: "Hello World!\n"

  - name: 'To stderr'
    input:
      type: raw
      value: 'puts stderr "Hello World!"'
    stderr:
      type: raw
      value: "Hello World!\n"

  - name: 'Error on uncomplete'
    input:
      type: raw
      value: 'puts'
    output:
      type: error

Expr:
  - name: Simple
    input:
      type: raw
      value: 'expr 3'
    output:
      type: raw
      value: '3'
  - name: Simple math
    input:
      type: raw
      value: 'expr (3 +6) * (5 % 3) / 7 - 3**2'
    output:
      type: raw
      value: '-6.428571428571429'
  - name: Math with variables
    input:
      type: raw
      value: 'set five 5; expr 3 + $five'
    output:
      type: raw
      value: '8'
  - name: Nested expressions
    input:
      type: raw
      value: 'expr {[expr 3]}'
    output:
      type: raw
      value: '3'
  - name: String expressions
    input:
      type: raw
      value: "expr {true ? 'hello': 'no'}"
    output:
      type: error
      value: 'expression resolved to unusable value'

# Test the functionality of variables
'Set and Unset':
  - name: Simple
    input:
      type: raw
      value: 'set var HelloWorld'
    output:
      type: raw
      value: HelloWorld

  - name: 'Print variable'
    input:
      type: raw
      value: 'set var HelloWorld; puts $var;'
    stdout:
      type: raw
      value: "HelloWorld\n"

  - name: 'Retrieve variable'
    input:
      type: raw
      value: 'set var HelloWorld; puts $var; set var;'
    stdout:
      type: raw
      value: "HelloWorld\n"
    output:
      type: raw
      value: HelloWorld

  - name: 'Unset variable'
    input:
      type: raw
      value: 'set var HelloWorld; puts $var; unset var;'
    stdout:
      type: raw
      value: "HelloWorld\n"

  - name: 'Set variable and change'
    input:
      type: raw
      value: 'set var HelloWorld; puts $var; set var HelloEarth; puts $var;'
    stdout:
      type: raw
      value: "HelloWorld\nHelloEarth\n"

  - name: 'Set variable, unset variable and set again'
    input:
      type: raw
      value: 'set var HelloWorld; puts $var; unset var; set var HelloEarth; puts $var;'
    stdout:
      type: raw
      value: "HelloWorld\nHelloEarth\n"

  - name: 'Unset non-existing'
    input:
      type: raw
      value: 'set var HelloWorld; unset rav;'
    output:
      type: error

  - name: 'Unset non-existing with nocomplain'
    input:
      type: raw
      value: 'set var HelloWorld; unset -nocomplain rav;'

  - name: 'Error on unfinshed variable name'
    input:
      type: raw
      value: 'set (wow)'
    output:
      type: error

  - name: 'Error on uncomplete'
    input:
      type: raw
      value: 'set'
    output:
      type: error

  - name: 'Unset object key from nonexistent object'
    input:
      type: raw
      value: 'unset -nocomplain var(test)'
    output:
      type: error
      value: 'cant'' unset "var": variable isn''t object'

  - name: 'Unset array index from nonexistent array'
    input:
      type: raw
      value: 'unset -nocomplain var(2)'
    output:
      type: error
      value: 'cant'' unset "var": variable isn''t array'

List:
  - name: 'Simple'
    input:
      type: raw
      value: 'puts [list hello this is a list]'
    stdout:
      type: raw
      value: "hello this is a list\n"
  - name: 'With spaces'
    input:
      type: raw
      value: 'puts [list   hello   this        is a list]'
    stdout:
      type: raw
      value: "hello this is a list\n"
  - name: 'With captured spaces'
    input:
      type: raw
      value: 'puts [list   "hello   this"        is a list]'
    stdout:
      type: raw
      value: "{hello   this} is a list\n"

Lindex:
  - name: 'No depth'
    input:
      type: raw
      value: 'set lst "one two three four five"; puts [lindex $lst]'
    stdout:
      type: raw
      value: "one two three four five\n"
  - name: 'Simple'
    input:
      type: raw
      value: 'set lst "zero one two three four five"; puts [lindex $lst 2]'
    stdout:
      type: raw
      value: "two\n"
  - name: 'Nested'
    input:
      type: raw
      value: 'set lst "zero one two {three four five} six"; puts [lindex $lst 3 1]'
    stdout:
      type: raw
      value: "four\n"
  - name: 'Double Nested'
    input:
      type: raw
      value: 'set lst "zero one two {{three four} five} six"; puts [lindex $lst 3 0 1]'
    stdout:
      type: raw
      value: "four\n"
  - name: 'Error on not number'
    input:
      type: raw
      value: 'set lst "one two three four five"; puts [lindex $lst wow]'
    output:
      type: error

Eval:
  - name: 'Simple'
    input:
      type: raw
      value: 'eval {puts -nonewline {Hello World!}}'
    stdout:
      type: raw
      value: 'Hello World!'

Wait:
  - name: 'Simple'
    input:
      type: raw
      value: 'wait 5'
  - name: 'Error on wrong arg'
    input:
      type: raw
      value: 'wait five'
    output:
      type: error

Incr:
  - name: 'Basic increment'
    input:
      type: raw
      value: 'incr i'
    output:
      type: raw
      value: '1'
  - name: 'Basic increment with increment specified'
    input:
      type: raw
      value: 'incr i 3'
    output:
      type: raw
      value: '3'
  - name: 'Basic increment with wrong increment specified'
    input:
      type: raw
      value: 'incr i wow'
    output:
      type: error
      value: 'expected integer but got "wow"'
  - name: 'Basic increment on existing variable'
    input:
      type: raw
      value: 'set i 3; incr i'
    output:
      type: raw
      value: '4'
  - name: 'Basic increment on existing variable with increment set'
    input:
      type: raw
      value: 'set i 3; incr i 3'
    output:
      type: raw
      value: '6'
  - name: 'Basic increment on wrong existing variable'
    input:
      type: raw
      value: 'set i wow; incr i'
    output:
      type: error
      value: 'expected integer but got "wow"'

Info:
  - name: 'Simple'
    input:
      type: raw
      value: 'info commands'
    output:
      type: raw
      value: 'commands'
  - name: 'Empty'
    input:
      type: raw
      value: 'info empty'
    output:
      type: raw
      value: ''
  - name: Error on wrong arguments
    input:
      type: raw
      value: 'info'
    output:
      type: error

Switch: 'subtests/switch.yml'

Proc: 'subtests/proc.yml'

If: 'subtests/if.yml'

Loop commands: 'subtests/loops.yml'
