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

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

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

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

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

# Initially assumed summary.
#
$* <<EOI >>EOO                                         # details-summary
: foo bar
: bar baz
cmd
EOI
: foo bar
: bar baz
cmd
EOO

# Initially assumed id and summary.
#
$* <<EOI >>EOO                                         # details-id-summary
: foo-bar
: bar baz
: baz fox
cmd
EOI
: foo-bar
: bar baz
: baz fox
cmd
EOO

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

$* <<EOI >>EOO                                         # summary-details
: foo bar
:
: foo bar
: bar baz
cmd
EOI
: sm:foo bar
:
: foo bar
: bar baz
cmd
EOO

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

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

$* <<EOI >>EOO                                         # strip
:  	  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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# Interaction with test scope merging.
#

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

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