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

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

  : empty-body
  :
  $* <<EOI >>EOO
  while ($x == a)
  {
  };
  cmd
  EOI
  ? false
  cmd
  EOO

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

    : flow
    :
    $* -s <<EOI >>EOO
    +while ($v != "axaa")
    {
      if ($v == 'a')
      {
        v = "$(v)x"
        continue
      }

      if ($v == 'axa')
        break

      cmd2 "$v"

      v = "$(v)a"
    }
    EOI
    {{
      ? true
      ? false
      ? false
      +cmd2 ''
      ? true
      ? true
      ? true
      ? false
      ? false
      +cmd2 ax
      ? true
      ? false
      ? true
    }}
    EOO
  }}

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

    : flow
    :
    $* -s <<EOI >>EOO
    +while ($v != "axaa")
    {
      if ($v == 'a')
      {
        v = "$(v)x"
        continue
      }

      if ($v == 'axa')
        break

      cmd2 "$v"

      v = "$(v)a"
    }
    EOI
    {{
      ? true
      ? false
      ? false
      +cmd2 ''
      ? true
      ? true
      ? true
      ? false
      ? false
      +cmd2 ax
      ? true
      ? false
      ? true
    }}
    EOO
  }}

  : setup-var-only
  :
  $* -s <<EOI >>EOO
  while ($v != "aa")
    v = "$(v)a"
  cmd $v
  EOI
  {{
    ? true
    ? true
    ? false
    {
      cmd aa
    }
  }}
  EOO

  : tdown-var-only
  :
  $* -s <<EOI >>EOO
  cmd1
  while ($v != "aa")
    v = "$(v)a"
  -cmd $v
  EOI
  {{
    {
      cmd1
    }
    ? true
    ? true
    ? false
    -cmd aa
  }}
  EOO
}}

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

: elif
:
{{
  : without-if
  :
  $* <<EOI 2>>EOE != 0
  while false
    elif true
      cmd
  EOI
  testscript:2: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
  testscript:2: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
  testscript:2: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
:
{{
  : semi
  :
  $* <<EOI 2>>EOE != 0
  while
  {
    cmd;
    cmd
  }
  EOI
  testscript:3:6: error: ';' inside 'while'
  EOE

  : semi-after-block
  :
  $* <<EOI 2>>EOE != 0
  {
    while true
    {
      cmd
    };
    cmd2
  }
  EOI
  testscript:5:4: error: ';' inside test scope
  EOE

  : semi-after-line
  :
  $* <<EOI 2>>EOE != 0
  {
    while true
      cmd;
    cmd2
  }
  EOI
  testscript:3:8: error: ';' inside test scope
  EOE

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

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

  : colon-after-block
  :
  $* <<EOI 2>>EOE != 0
  {
    while true
    {
      cmd
    } : description
  }
  EOI
  testscript:5:5: error: description inside test scope
  EOE

  : colon-after-line
  :
  $* <<EOI 2>>EOE != 0
  {
    while true
      cmd : description
  }
  EOI
  testscript:3:9: error: description inside test scope
  EOE

  : duplicate-id-trailing
  :
  $* <<EOI 2>>EOE != 0
  cmd1 : foo

  cmd2;
  while true
  {
    cmd3 : foo
  }
  EOI
  testscript:6:8: error: description inside 'while'
  EOE

  : eos
  :
  $* <<EOI 2>>EOE != 0
  while
  EOI
  testscript:2:1: error: expected command instead of <end of file> inside 'while'
  EOE

  : scope
  :
  $* <<EOI 2>>EOE != 0
  while
  {
    cmd
    {
    }
  }
  EOI
  testscript:4:3: error: expected command instead of '{' inside 'while'
  EOE

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

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

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

: leading-and-trailing-description-block
:
$* <<EOI 2>>EOE != 0
: foo
while false
{
  cmd
} : bar
EOI
testscript:5:3: error: both leading and trailing descriptions specified
EOE

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

: 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
    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

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

    : tdown-var-only
    :
    $* -s <<EOI >>EOO
    cmd1
    while ($v != "aa")
      v = "$(v)a"
    end
    -cmd $v
    EOI
    {
      {
        cmd1
      }
      ? true
      ? true
      ? false
      -cmd aa
    }
    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 specified
  EOE
}}
