# file      : libbuild2/test/script/parser+description.test.testscript
# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

: id
:
{
  : lead
  :
  $* <<EOI >>EOO
  : foo
  cmd
  EOI
  : id:foo
  cmd
  EOO

  : trail
  :
  $* <<EOI >>EOO
  cmd : foo
  EOI
  : id:foo
  cmd
  EOO

  : dup
  : Id uniqueness
  :
  {
    : test
    :
    {
      : test
      :
      $* <<EOI 2>>EOE != 0
      : foo
      cmd
      : foo
      cmd
      EOI
      testscript:3:1: error: duplicate id foo
        testscript:1:1: info: previously used here
      EOE

      : group
      :
      $* <<EOI 2>>EOE != 0
      : foo
      cmd
      : foo
      {
        cmd
        cmd
      }
      EOI
      testscript:3:1: error: duplicate id foo
        testscript:1:1: info: previously used here
      EOE

      : derived
      :
      $* <<EOI 2>>EOE != 0
      : 3
      cmd
      cmd
      EOI
      testscript:3:1: error: duplicate id 3
        testscript:1:1: info: previously used here
      EOE
    }

    : group
    :
    {
      : test
      :
      $* <<EOI 2>>EOE != 0
      : foo
      {
        cmd
        cmd
      }
      : foo
      cmd
      EOI
      testscript:6:1: error: duplicate id foo
        testscript:1:1: info: previously used here
      EOE

      : group
      :
      $* <<EOI 2>>EOE != 0
      : foo
      {
        cmd
        cmd
      }
      : foo
      {
        cmd
        cmd
      }
      EOI
      testscript:6:1: error: duplicate id foo
        testscript:1:1: info: previously used here
      EOE

      : derived
      :
      $* <<EOI 2>>EOE != 0
      : 3
      cmd
      {
        cmd
        cmd
      }
      EOI
      testscript:3:1: error: duplicate id 3
        testscript:1:1: info: previously used here
      EOE
    }
  }
}

: summary
{
  : lead
  :
  $* <<EOI >>EOO
  : foo bar
  cmd
  EOI
  : sm:foo bar
  cmd
  EOO

  : trail
  :
  $* <<EOI >>EOO
  cmd: foo bar
  EOI
  : sm:foo bar
  cmd
  EOO

  : id
  :
  $* <<EOI >>EOO
  : foo-bar
  : foo bar
  cmd
  EOI
  : id:foo-bar
  : sm:foo bar
  cmd
  EOO
}

: details
{
  : id
  :
  $* <<EOI >>EOO
  : foo-bar
  :
  : foo bar
  : bar baz
  cmd
  EOI
  : id:foo-bar
  :
  : foo bar
  : bar baz
  cmd
  EOO

  : summary
  :
  {
    : only
    :
    $* <<EOI >>EOO
    : foo bar
    :
    : foo bar
    : bar baz
    cmd
    EOI
    : sm:foo bar
    :
    : foo bar
    : bar baz
    cmd
    EOO

    : assumed
    :
    $* <<EOI >>EOO
    : foo bar
    : bar baz
    cmd
    EOI
    : foo bar
    : bar baz
    cmd
    EOO

    : id
    :
    $* <<EOI >>EOO
    : foo-bar
    : foo bar
    :
    : foo bar
    : bar baz
    cmd
    EOI
    : id:foo-bar
    : sm:foo bar
    :
    : foo bar
    : bar baz
    cmd
    EOO

    : id-assumed
    :
    $* <<EOI >>EOO
    : foo-bar
    : bar baz
    : baz fox
    cmd
    EOI
    : foo-bar
    : bar baz
    : baz fox
    cmd
    EOO
  }
}

: legal
:
: Legal places for description.
:
{
  : var
  :
  $* <<EOI >>EOO
  : foo bar
  x = y;
  cmd $x
  EOI
  : sm:foo bar
  cmd y
  EOO
}

: illegal
:
: Illegal places for description.
:
{
  : eof
  :
  $* <": foo" 2>>EOE != 0
  testscript:2:1: error: description before <end of file>
  EOE

  : rcbrace
  :
  $* <<EOI 2>>EOE != 0
  {
    cmd
    : foo
  }
  EOI
  testscript:4:1: error: description before '}'
  EOE

  : setup
  :
  $* <<EOI 2>>EOE != 0
  : foo
  +cmd
  EOI
  testscript:2:1: error: description before setup command
  EOE

  : tdown
  :
  $* <<EOI 2>>EOE != 0
  : foo
  -cmd
  EOI
  testscript:2:1: error: description before teardown command
  EOE

  : var
  :
  $* <<EOI 2>>EOE != 0
  : foo
  x = y
  EOI
  testscript:2:1: error: description before setup/teardown variable
  EOE

  : var-if
  :
  $* <<EOI 2>>EOE != 0
  : foo
  if true
    x = y
  end
  EOI
  testscript:2:1: error: description before/after setup/teardown variable-if
  EOE

  : var-if-after
  :
  $* <<EOI 2>>EOE != 0
  if true
    x = y
  end : foo
  EOI
  testscript:1:1: error: description before/after setup/teardown variable-if
  EOE

  : test
  :
  $* <<EOI 2>>EOE != 0
  cmd1;
  : foo
  cmd2
  EOI
  testscript:2:1: error: description inside test
  EOE
}

: test-scope
:
: Interaction with test scope merging.
:
{
  : both
  :
  : No merge since both have description.
  :
  $* -s -i <<EOI >>EOO
  : foo
  {
    : bar
    cmd
  }
  EOI
  {
    : id:foo
    { # foo
      : id:bar
      { # foo/bar
        cmd
      }
    }
  }
  EOO

  : test
  :
  : No merge since test has description.
  :
  $* -s -i <<EOI >>EOO
  {
    : foo-bar
    : foo bar
    cmd
  }
  EOI
  {
    { # 1
      : id:foo-bar
      : sm:foo bar
      { # 1/foo-bar
        cmd
      }
    }
  }
  EOO

  : group
  :
  $* -s -i <<EOI >>EOO
  : foo-bar
  : foo bar
  {
    cmd
  }
  EOI
  {
    : id:foo-bar
    : sm:foo bar
    { # foo-bar
      cmd
    }
  }
  EOO
}

: blanks
:
$* <<EOI >>EOO
:
:
: foo bar
: bar baz
:
: baz fox
:
:
cmd
EOI
: foo bar
: bar baz
:
: baz fox
cmd
EOO

: strip
:
$* <<EOI >>EOO
:         foo-bar
:         bar baz
:
:           baz fox
: fox biz
:biz buz
:
cmd
EOI
: id:foo-bar
: sm:bar baz
:
:   baz fox
:  fox biz
: biz buz
cmd
EOO

: trail-compound
:
$* <<EOI >>EOO
cmd1;
cmd2: foo
EOI
: id:foo
cmd1
cmd2
EOO

: empty
:
$* <<EOI 2>>EOE != 0
:
:
cmd
EOI
testscript:1:1: error: empty description
EOE

: trail-empty
:
$* <<EOI 2>>EOE != 0
cmd:
EOI
testscript:1:4: error: empty description
EOE

: both
:
$* <<EOI 2>>EOE != 0
: foo
cmd : bar
EOI
testscript:2:1: error: both leading and trailing descriptions
EOE