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

: none
:
$* <<EOI
.include
.include --once
EOI

: empty
:
touch foo.testscript;
$* <<EOI
.include foo.testscript
.include --once foo.testscript
EOI

: one
:
cat <"cmd" >=foo.testscript;
$* <<EOI >>EOO
.include foo.testscript
EOI
cmd
EOO

: multiple
:
cat <"cmd foo" >=foo.testscript;
cat <"cmd bar" >=bar.testscript;
$* <<EOI >>EOO
.include foo.testscript bar.testscript
EOI
cmd foo
cmd bar
EOO

: once
:
cat <"cmd" >=foo.testscript;
$* <<EOI >>EOO
.include foo.testscript
x
.include --once foo.testscript
.include --once bar/../foo.testscript
y
.include ../once/foo.testscript
EOI
cmd
x
y
cmd
EOO

: scope
:
cat <<EOI >=setup.testscript;
+setup1
+setup2
EOI
cat <<EOI >=teardown.testscript;
-teardown1
-teardown2
EOI
cat <<EOI >=tests.testscript;
cmd1
cmd2
EOI
cat <<EOI >=test1.testscript;
{
  cmd3
  cmd4
}
EOI
cat <<EOI >=test2.testscript;
cmd5;
cmd6
EOI
$* -s -i <<EOI >>EOO
{{
  .include setup.testscript
  .include tests.testscript
  .include test1.testscript
  .include test2.testscript
  .include teardown.testscript
}}
EOI
{{
  {{ # 1
    +setup1
    +setup2
    { # 1/3-tests-1
      cmd1
    }
    { # 1/3-tests-2
      cmd2
    }
    { # 1/4-test1-1
      cmd3
      cmd4
    }
    { # 1/5-test2-1
      cmd5
      cmd6
    }
    -teardown1
    -teardown2
  }}
}}
EOO

: loop
:
{{
  : stream-for
  :
  {
    cat <<EOI >=body.testscript
      cmd2 $i
      continue
      EOI

    $* -s -i <<EOI >>EOO
      cmd1 | for i
      {
        .include body.testscript
      }
      EOI
      {{
        { # 1
          cmd1 | for i
        }
      }}
      EOO
  }

  : args-for
  :
  {
    cat <<EOI >=body.testscript
      cmd $i
      continue
      EOI

    $* -s -i <<EOI >>EOO
      for i: a b
      {
        .include body.testscript
      }
      EOI
      {{
        { # 1
          cmd a
          cmd b
        }
      }}
      EOO
  }

  : while
  :
  {
    cat <<EOI >=body.testscript
      cmd $i
      i += 1
      continue
      EOI

    $* -s -i <<EOI >>EOO
      i = [uint64] 0
      while ($i != 2)
      {
        .include body.testscript
      }
      EOI
      {{
        { # 2
          ? true
          cmd 0
          ? true
          cmd 1
          ? false
        }
      }}
      EOO
  }
}}

: group-id
:
cat <<EOI >=foo.testscript;
{
  x = b
}
EOI
$* -s -i <<EOI >>EOO
x = a
.include foo.testscript
EOI
{{
  { # 2-foo-1
  }
}}
EOO

: test-id
:
cat <<EOI >=foo.testscript;
cmd
EOI
$* -s -i <<EOI >>EOO
x = a
.include foo.testscript
EOI
{{
  { # 2-foo-1
    cmd
  }
}}
EOO

: invalid-path
:
$* <<EOI 2>>EOE != 0
.include ""
EOI
testscript:1:2: error: invalid testscript include path ''
EOE

: unable-open
:
$* <<EOI 2>>~/EOE/ != 0
.include foo.testscript
EOI
/testscript:1:2: error: unable to read testscript foo.testscript: .+/
EOE

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

  : none
  :
  $* <<EOI
  .include
  .include --once
  EOI

  : empty
  :
  touch foo.testscript;
  $* <<EOI
  .include foo.testscript
  .include --once foo.testscript
  EOI

  : one
  :
  cat <"cmd" >=foo.testscript;
  $* <<EOI >>EOO
  .include foo.testscript
  EOI
  cmd
  EOO

  : multiple
  :
  cat <"cmd foo" >=foo.testscript;
  cat <"cmd bar" >=bar.testscript;
  $* <<EOI >>EOO
  .include foo.testscript bar.testscript
  EOI
  cmd foo
  cmd bar
  EOO

  : once
  :
  cat <"cmd" >=foo.testscript;
  $* <<EOI >>EOO
  .include foo.testscript
  x
  .include --once foo.testscript
  .include --once bar/../foo.testscript
  y
  .include ../once/foo.testscript
  EOI
  cmd
  x
  y
  cmd
  EOO

  : group-id
  :
  cat <<EOI >=foo.testscript;
  {
    x = b
  }
  EOI
  $* -s -i <<EOI >>EOO
  x = a
  .include foo.testscript
  EOI
  {
    { # 2-foo-1
    }
  }
  EOO

  : test-id
  :
  cat <<EOI >=foo.testscript;
  cmd
  EOI
  $* -s -i <<EOI >>EOO
  x = a
  .include foo.testscript
  EOI
  {
    { # 2-foo-1
      cmd
    }
  }
  EOO

  : invalid-path
  :
  $* <<EOI 2>>EOE != 0
  .include ""
  EOI
  testscript:1:2: error: invalid testscript include path ''
  EOE

  : unable-open
  :
  $* <<EOI 2>>~/EOE/ != 0
  .include foo.testscript
  EOI
  /testscript:1:2: error: unable to read testscript foo.testscript: .+/
  EOE
}}
