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

: 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
  testscript:1:6: error: missing program
  EOE

  : after-semi
  :
  $* -s <<EOI >>EOO
  cmd1;
  while ($v != "aa")
    cmd2 "$v"
    v = "$(v)a"
  end
  EOI
  {
    {
      cmd1
      ? true
      cmd2 ''
      ? true
      cmd2 a
      ? false
    }
  }
  EOO

  : setup
  :
  $* -s <<EOI >>EOO
  +while ($v != "aa")
    cmd2 "$v"
    v = "$(v)a"
  end
  EOI
  {
    ? true
    +cmd2 ''
    ? true
    +cmd2 a
    ? false
  }
  EOO

  : tdown
  :
  $* -s <<EOI >>EOO
  -while ($v != "aa")
    cmd2 "$v"
    v = "$(v)a"
  end
  EOI
  {
    ? true
    -cmd2 ''
    ? true
    -cmd2 a
    ? false
  }
  EOO
}

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

: elif
:
{
  : without-if
  :
  $* <<EOI 2>>EOE != 0
  while false
    elif true
      cmd
    end
  end
  EOI
  testscript:2: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;
  cmd6
  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
  cmd6 # 9
  EOO
}

: contained
:
{
  : semi
  :
  $* <<EOI 2>>EOE != 0
  while
    cmd;
    cmd
  end
  EOI
  testscript:2:3: error: ';' inside 'while'
  EOE

  : colon-leading
  :
  $* <<EOI 2>>EOE != 0
  while
    : foo
    cmd
  end
  EOI
  testscript:2:3: error: description inside 'while'
  EOE

  : colon-trailing
  :
  $* <<EOI 2>>EOE != 0
  while
    cmd : foo
  end
  EOI
  testscript:2:3: error: description inside 'while'
  EOE

  : eos
  :
  $* <<EOI 2>>EOE != 0
  while
  EOI
  testscript:2:1: error: expected closing 'end'
  EOE

  : scope
  :
  $* <<EOI 2>>EOE != 0
  while
    cmd
    {
    }
  end
  EOI
  testscript:3:3: error: expected closing 'end'
  EOE

  : setup
  :
  $* <<EOI 2>>EOE != 0
  while
    +cmd
  end
  EOI
  testscript:2:3: error: setup command inside 'while'
  EOE

  : tdown
  :
  $* <<EOI 2>>EOE != 0
  while
    -cmd
  end
  EOI
  testscript:2:3: error: teardown command inside 'while'
  EOE
}

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

: leading-and-trailing-description
:
$* <<EOI 2>>EOE != 0
: foo
while false
  cmd
end : bar
EOI
testscript:4:1: error: both leading and trailing descriptions
EOE
