# file      : tests/default-options/testscript
# license   : MIT; see accompanying LICENSE file

# Note that when cross-testing the driver may not be able to run the command
# due to the meaningless program path.
#
#+if ($test.target != $build.host)
#  exit
#end

: basic
:
{
  sys_dir = $canonicalize([dir_path] $~/build2)
  +mkdir -p $sys_dir/local

  +echo '--sys-foo' >=$sys_dir/foo
  +echo '--sys-bar' >=$sys_dir/bar
  +echo '--sys-local-foo' >=$sys_dir/local/foo
  +echo '--sys-local-bar' >=$sys_dir/local/bar

  home_dir = $canonicalize([dir_path] $~/home)
  +mkdir -p $home_dir/.build2/local/

  +echo '--home-foo'       >=$home_dir/.build2/foo
  +echo '--home-bar'       >=$home_dir/.build2/bar
  +echo '--home-local-foo' >=$home_dir/.build2/local/foo
  +echo '--home-local-bar' >=$home_dir/.build2/local/bar

  work_dir = $home_dir/work
  +mkdir -p $work_dir/.build2/local/

  d = $work_dir/.build2

  +echo '--work-foo'       >=$d/foo
  +echo '--work-bar'       >=$d/bar
  +echo '--work-local-foo' >=$d/local/foo
  +echo '--work-local-bar' >=$d/local/bar

  d = $work_dir/project/.build2
  +mkdir -p $d/local/

  +touch $work_dir/project/.git

  +echo '--project-foo'       >=$d/foo
  +echo '--project-bar'       >=$d/bar
  +echo '--project-local-foo' >=$d/local/foo
  +echo '--project-local-bar' >=$d/local/bar

  d = $work_dir/project/package/.build2
  +mkdir -p $d/local/

  +echo '--package-foo'       >=$d/foo
  +echo '--package-fox'       >+$d/foo
  +echo '--package-bar'       >=$d/bar
  +echo '--package-local-foo' >=$d/local/foo
  +echo '--package-local-bar' >=$d/local/bar

  +echo '--no-default-options' >=$d/local/baz

  start_dir = $canonicalize([dir_path] $work_dir/project/package)

  : entries
  :
  $* -e -t -f foo -f bar -d $start_dir -s $sys_dir -h $home_dir >>/~%EOO%d 2>>/~%EOE%d
    %\.+/build2/foo,--sys-foo,false%
    %\.+/build2/bar,--sys-bar,false%
    %\.+/build2/local/foo,--sys-local-foo,false%
    %\.+/build2/local/bar,--sys-local-bar,false%
    %\.+/home/.build2/foo,--home-foo,false%
    %\.+/home/.build2/bar,--home-bar,false%
    %\.+/home/.build2/local/foo,--home-local-foo,false%
    %\.+/home/.build2/local/bar,--home-local-bar,false%
    %\.+/home/work/.build2/foo,--work-foo,false%
    %\.+/home/work/.build2/bar,--work-bar,false%
    %\.+/home/work/.build2/local/foo,--work-local-foo,false%
    %\.+/home/work/.build2/local/bar,--work-local-bar,false%
    %\.+/home/work/project/.build2/foo,--project-foo,true%
    %\.+/home/work/project/.build2/bar,--project-bar,true%
    %\.+/home/work/project/.build2/local/foo,--project-local-foo,true%
    %\.+/home/work/project/.build2/local/bar,--project-local-bar,true%
    %\.+/home/work/project/package/.build2/foo,--package-foo --package-fox,true%
    %\.+/home/work/project/package/.build2/bar,--package-bar,true%
    %\.+/home/work/project/package/.build2/local/foo,--package-local-foo,true%
    %\.+/home/work/project/package/.build2/local/bar,--package-local-bar,true%
    EOO
    %loading local \.+/home/work/project/package/.build2/local/bar%
    %loading local \.+/home/work/project/package/.build2/local/foo%
    %loading local \.+/home/work/project/package/.build2/bar%
    %loading local \.+/home/work/project/package/.build2/foo%
    %overwriting remote \.+/home/work/project/package/.build2/local/bar%
    %overwriting remote \.+/home/work/project/package/.build2/local/foo%
    %overwriting remote \.+/home/work/project/package/.build2/bar%
    %overwriting remote \.+/home/work/project/package/.build2/foo%
    %loading remote \.+/home/work/project/.build2/local/bar%
    %loading remote \.+/home/work/project/.build2/local/foo%
    %loading remote \.+/home/work/project/.build2/bar%
    %loading remote \.+/home/work/project/.build2/foo%
    %loading local \.+/home/work/.build2/local/bar%
    %loading local \.+/home/work/.build2/local/foo%
    %loading local \.+/home/work/.build2/bar%
    %loading local \.+/home/work/.build2/foo%
    %loading local \.+/home/.build2/local/bar%
    %loading local \.+/home/.build2/local/foo%
    %loading local \.+/home/.build2/bar%
    %loading local \.+/home/.build2/foo%
    %loading local \.+/build2/local/bar%
    %loading local \.+/build2/local/foo%
    %loading local \.+/build2/bar%
    %loading local \.+/build2/foo%
    EOE

  : merged
  :
  $* -f foo -f bar -d $start_dir -s $sys_dir -h $home_dir --cmd-foo --cmd-bar >>EOO
    --sys-foo
    --sys-bar
    --sys-local-foo
    --sys-local-bar
    --home-foo
    --home-bar
    --home-local-foo
    --home-local-bar
    --work-foo
    --work-bar
    --work-local-foo
    --work-local-bar
    --project-foo
    --project-bar
    --project-local-foo
    --project-local-bar
    --package-foo
    --package-fox
    --package-bar
    --package-local-foo
    --package-local-bar
    --cmd-foo
    --cmd-bar
    EOO

  : no-default-options
  :
  $* -e -t -f foo -f baz -f bar -d $start_dir -s $sys_dir -h $home_dir >>/~%EOO%d 2>>/~%EOE%d
    %\.+/home/work/project/package/.build2/local/foo,--package-local-foo,true%
    %\.+/home/work/project/package/.build2/local/baz,--no-default-options,true%
    %\.+/home/work/project/package/.build2/local/bar,--package-local-bar,true%
    EOO
    %loading local \.+/home/work/project/package/.build2/local/bar%
    %loading local \.+/home/work/project/package/.build2/local/baz%
    %loading local \.+/home/work/project/package/.build2/local/foo%
    %overwriting remote \.+/home/work/project/package/.build2/local/bar%
    %overwriting remote \.+/home/work/project/package/.build2/local/baz%
    %overwriting remote \.+/home/work/project/package/.build2/local/foo%
    EOE

  : positions
  :
  {
    : success
    :
    $* -f foo -f bar -d $start_dir -m 36 -l 2 >!

    : fail-file
    :
    $* -f foo -f bar -d $start_dir -m 36 -l 1 2>>/~%EOE% != 0
      %error: unable to load default options files: too many options in file .+/package/\.build2/foo%
      EOE

    : fail-globally
    :
    $* -f foo -f bar -d $start_dir -m 100 -l 10 2>>EOE != 0
      error: unable to load default options files: too many options files
      EOE
  }
}

: args
:
{
  home_dir = $canonicalize([dir_path] $~/home)
  +mkdir -p $home_dir/.build2
  +echo '--home' >=$home_dir/.build2/ops
  +echo 'home'   >+$home_dir/.build2/ops

  start_dir = $canonicalize([dir_path] $home_dir/start)
  +mkdir -p $start_dir/.build2
  +echo '--start1' >=$start_dir/.build2/ops
  +echo 'start2'   >+$start_dir/.build2/ops
  +echo '--start3' >+$start_dir/.build2/ops
  +echo 'start4'   >+$start_dir/.build2/ops

  : allowed
  :
  $* -a -e -f ops -d $start_dir -h $home_dir >>/~%EOO%d
    %\.+/home/.build2/ops,--home\|home,false%
    %\.+/home/start/.build2/ops,--start1 --start3\|start2 start4,false%
    EOO

  : disallowed
  :
  $* -e -f ops -d $start_dir -h $home_dir 2>>EOE != 0
    error: unexpected argument 'start2'
    EOE

  : merged
  :
  $* -a -f ops -d $start_dir -h $home_dir cmd >>EOO
    --home
    --start1
    --start3
    home
    start2
    start4
    cmd
    EOO
}

: common-start
:
{
  home_dir = $canonicalize([dir_path] $~/home)

  work_dir = $home_dir/work
  +mkdir -p $work_dir/.build2

  cfg1 = $canonicalize([dir_path] $work_dir/cfg1)
  cfg2 = $canonicalize([dir_path] $work_dir/cfg2)
  cfg3 = $canonicalize([dir_path] $cfg2/cfg3)

  +mkdir -p $work_dir/.build2 $cfg1/.build2 $cfg2/.build2 $cfg3/.build2

  +echo '--work' >=$work_dir/.build2/ops
  +echo '--cfg1' >=$cfg1/.build2/ops
  +echo '--cfg2' >=$cfg2/.build2/ops
  +echo '--cfg3' >=$cfg3/.build2/ops

  : exists
  :
  {
    : single
    :
    $* -f ops -d $cfg3 -h $home_dir >>EOO
      --work
      --cfg2
      --cfg3
      EOO

    : same
    :
    $* -f ops -d $cfg1 -d $cfg1 -h $home_dir >>EOO
      --work
      --cfg1
      EOO

    : adjacent
    :
    $* -f ops -d $cfg1 -d $cfg2 -h $home_dir >>EOO
      --work
      EOO

    : nested
    :
    $* -f ops -d $cfg2 -d $cfg3 -h $home_dir >>EOO
      --work
      --cfg2
      EOO
  }

  : not-exists
  :
  {
    : home-reached
    :
    $* -f ops -d $cfg1 -d $cfg2 -h $work_dir >>EOO
      --work
      EOO

    : root-reached
    :
    if ($cxx.target.class != 'windows')
    {
      $* -f ops -d $cfg1 -d /non-existent-directory/cfg2
    }
  }
}

: extra-dir
:
{
  : after-traversal
  :
  {
    home_dir = $canonicalize([dir_path] $~/home);
    mkdir -p $home_dir/.build2;
    echo '--home' >=$home_dir/.build2/ops;

    extra_dir = $canonicalize([dir_path] $home_dir/extra);
    mkdir -p $extra_dir;
    echo '--extra' >=$extra_dir/ops;

    start_dir = $canonicalize([dir_path] $home_dir/start);
    mkdir -p $start_dir/.build2;
    echo '--start' >=$start_dir/.build2/ops;

    $* -e -f ops -d $start_dir -h $home_dir -x $extra_dir >>/~%EOO%d
      %\.+/home/.build2/ops,--home,false%
      %\.+/home/extra/ops,--extra,false%
      %\.+/home/start/.build2/ops,--start,false%
      EOO
  }

  : inside-traversal
  :
  {
    home_dir = $canonicalize([dir_path] $~/home);
    mkdir -p $home_dir/.build2;
    echo '--home' >=$home_dir/.build2/ops;

    d = $home_dir/project/.build2;
    mkdir -p $d;
    echo '--project' >=$d/ops;

    touch $home_dir/project/.git;

    d = $home_dir/project/package/.build2;
    mkdir -p $d;
    echo '--package' >=$d/ops;

    extra_dir = $canonicalize([dir_path] $home_dir/project/package/extra1);
    mkdir -p $extra_dir;
    echo '--extra1' >=$extra_dir/ops;

    start_dir = $canonicalize([dir_path] $home_dir/project/package);

    $* -e -f ops -d $start_dir -h $home_dir -x $extra_dir >>/~%EOO%d;
      %\.+/home/.build2/ops,--home,false%
      %\.+/home/project/.build2/ops,--project,true%
      %\.+/home/project/package/.build2/ops,--package,true%
      %\.+/home/project/package/extra1/ops,--extra1,false%
      EOO

    extra_dir = $canonicalize([dir_path] $home_dir/project/package/.build2);

    $* -e -f ops -d $start_dir -h $home_dir -x $extra_dir/ >>/~%EOO%d;
      %\.+/home/.build2/ops,--home,false%
      %\.+/home/project/.build2/ops,--project,true%
      %\.+/home/project/package/.build2/ops,--package,false%
      EOO

    extra_dir = $canonicalize([dir_path] $home_dir/project/extra2);
    mkdir -p $extra_dir;
    echo '--extra2' >=$extra_dir/ops;

    $* -e -f ops -d $start_dir -h $home_dir -x $extra_dir >>/~%EOO%d;
      %\.+/home/.build2/ops,--home,false%
      %\.+/home/project/.build2/ops,--project,true%
      %\.+/home/project/extra2/ops,--extra2,false%
      %\.+/home/project/package/.build2/ops,--package,true%
      EOO

    extra_dir = $canonicalize([dir_path] $home_dir/project/.build2);

    $* -e -f ops -d $start_dir -h $home_dir -x $extra_dir/ >>/~%EOO%d
      %\.+/home/.build2/ops,--home,false%
      %\.+/home/project/.build2/ops,--project,false%
      %\.+/home/project/package/.build2/ops,--package,true%
      EOO
  }
}

: options-file
:
{
  d = work/.build2;
  mkdir -p work/.build2;

  cat <<EOI >=$d/foo;
    --foo
    --options-file
    bar
    --fox
    EOI

  cat <<EOI >=$d/bar;
    --bar
    --options-file
    baz
    --box
    EOI

  cat <<EOI >=$d/baz;
    --baz
    EOI

  $* -d $~/work -f foo >>EOO
    --foo
    --bar
    --baz
    --box
    --fox
    EOO
}
