# file      : libbuild2/shell/script/parser+while.test.testscript
# license   : MIT; see accompanying LICENSE file

: while
:
{{
  : true
  :
  $* <<EOI >>EOO
  while ($v != "aa")
  {
    cmd "$v"
    v = "$(v)a"
  }
  EOI
  ? true
  cmd ''
  ? true
  cmd a
  ? false
  EOO

  : false
  :
  $* <<EOI >>EOO
  while ($v == "aa")
  {
    cmd "$v"
    v = "$(v)a"
  }
  EOI
  ? false
  EOO

  : without-command
  :
  $* <<EOI 2>>EOE != 0
  while
    cmd
  EOI
  shellscript:11:6: error: missing program
  EOE
}}

: without-rcbrace
:
{{
  : without-rcbrace
  :
  $* <<EOI 2>>EOE != 0
  while true
  {
    cmd
  EOI
  shellscript:14:1: error: expected command instead of <end of file>
  EOE
}}

: elif
:
{{
  : without-if
  :
  $* <<EOI 2>>EOE != 0
  while false
  {
    elif true
      cmd
  }
  EOI
  shellscript:13:3: error: 'elif' without preceding 'if'
  EOE
}}

: continue
:
{{
  : basics
  :
  $* -l -r <<EOI >>EOO
  while ($v != "aa") # 1
  {
    v = "$(v)a"

    cmd1            # 2
    continue
    cmd2            # 3
  }
  cmd3              # 4
  EOI
  ? true # 1 i1
  cmd1 # 2 i1
  ? true # 1 i2
  cmd1 # 2 i2
  ? false # 1 i3
  cmd3 # 4
  EOO

  : trailing
  :
  $* <<EOI 2>>EOE != 0
  while false
    continue junk
  EOI
  shellscript:12:12: error: expected newline instead of 'junk'
  EOE
}}

: break
:
{{
  : basics
  :
  $* -l -r <<EOI >>EOO
  while true # 1
  {
    cmd1     # 2
    break
    cmd2     # 3
  }
  cmd3       # 4
  EOI
  ? true # 1 i1
  cmd1 # 2 i1
  cmd3 # 4
  EOO

  : trailing
  :
  $* <<EOI 2>>EOE != 0
  while false
    break junk
  EOI
  shellscript:12:9: error: expected newline instead of 'junk'
  EOE
}}

: nested
:
{
  $* -l -r <<EOI >>EOO
  while ($v != "aaxa")    # 1
  {
    cmd1 "$v"             # 2
    if ($v == "a")        # 3
    {
      cmd2                # 4
      while ($v2 != "$v") # 5
      {
        cmd3              # 6
        v2=$v
      }
    }
    else
      cmd4                # 7
    cmd5                  # 8

    if ($v == "aa")       # 9
    {
      v = "$(v)x"
      continue
    }

    while true            # 10
      break

    v = "$(v)a"
  }
  cmd6                    # 11
  EOI
  ? true # 1 i1
  cmd1 '' # 2 i1
  ? false # 3 i1
  cmd4 # 7 i1
  cmd5 # 8 i1
  ? false # 9 i1
  ? true # 10 i1 i1
  ? true # 1 i2
  cmd1 a # 2 i2
  ? true # 3 i2
  cmd2 # 4 i2
  ? true # 5 i2 i1
  cmd3 # 6 i2 i1
  ? false # 5 i2 i2
  cmd5 # 8 i2
  ? false # 9 i2
  ? true # 10 i2 i1
  ? true # 1 i3
  cmd1 aa # 2 i3
  ? false # 3 i3
  cmd4 # 7 i3
  cmd5 # 8 i3
  ? true # 9 i3
  ? true # 1 i4
  cmd1 aax # 2 i4
  ? false # 3 i4
  cmd4 # 7 i4
  cmd5 # 8 i4
  ? false # 9 i4
  ? true # 10 i4 i1
  ? false # 1 i5
  cmd6 # 11
  EOO
}

: contained
:
{{
  : eos
  :
  $* <<EOI 2>>EOE != 0
  while
  EOI
  shellscript:12:1: error: expected command instead of <end of file>
  EOE
}}

: var
:
$* <<EOI >>EOO
while ($v1 != "a")
{
  v1 = "$(v1)a"
  v2 = "$v1"
}
cmd $v1
EOI
? true
? false
cmd a
EOO
