# file      : libbuild2/build/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
  buildfile:11:6: error: missing program
  EOE
}}

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

: elif
:
{{
  : without-if
  :
  $* <<EOI 2>>EOE != 0
  while false
  {
    elif true
      cmd
  }
  EOI
  buildfile:13:3: error: 'elif' without preceding 'if'
  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
  buildfile: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

: syntax-1
:
{{
  test.options += -v 1

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

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

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

  : end
  :
  {{
    : without-end
    :
    $* <<EOI 2>>EOE != 0
    while true
      cmd
    EOI
    buildfile:13:1: error: expected closing 'end'
    EOE
  }}

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

  : nested
  :
  {
    $* -l -r <<EOI >>EOO
    while ($v != "aa")      # 1
      cmd1 "$v"             # 2
      if ($v == "a")        # 3
        cmd2                # 4
        while ($v2 != "$v") # 5
          cmd3              # 6
          v2=$v
        end
      else
        cmd4                # 7
      end
      cmd5                  # 8
      v = "$(v)a"
    end
    EOI
    ? true # 1 i1
    cmd1 '' # 2 i1
    ? false # 3 i1
    cmd4 # 7 i1
    cmd5 # 8 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 # 1 i3
    EOO
  }

  : contained
  :
  {{
    : eos
    :
    $* <<EOI 2>>EOE != 0
    while
    EOI
    buildfile:12:1: error: expected closing 'end'
    EOE
  }}

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