# file      : tests/cfg-create.testscript
# license   : MIT; see accompanying LICENSE file

.include common.testscript

config_cxx = [cmdline] config.cxx=$quote($recall($cxx.path) $cxx.config.mode, true)

cfg_create += 2>!

cfg_info   += -d cfg
pkg_status += -d cfg

: non-empty
:
$* 2>>/~%EOE% != 0
error: directory ./ is not empty
  info: use --wipe to clean it up but be careful
EOE

: dir
:
{
  test.arguments += -d cfg
  test.cleanups  += &cfg/***

  : no-vars-mods
  :
  {
    $* 2>>/~%EOE%;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }

  : conf-var
  :
  {
    $* "config.install.root='$~/opt'" 2>>/~%EOE%;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown';

    cat cfg/build/config.build >>/~"%EOO%"
      %.+
      %config.install.root = '?.+/opt/'?%
      %.+
      EOO
  }

  : module
  :
  {
    $* cxx $config_cxx 2>>/~%EOE%;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown';

    cat cfg/build/config.build >>/~"%EOO%"
      %.+
      %config.cxx = .+%
      %.+
      EOO
  }

  : wipe
  :
  {
    mkdir -p cfg/foo/bar &!cfg/ &!cfg/foo/ &!cfg/foo/bar/;

    $* --wipe 2>>/~%EOE%;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }

  : existing
  :
  {
    $build 'create(cfg/,cc)' $config_cxx 2>!;

    $* --existing 2>>/~%EOE%;
      %initialized existing configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }
}

: name
:
{
  test.arguments += -d cfg

  : valid
  :
  {
    $* --name foo 2>>/~%EOE% &cfg/***;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
        name: foo
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      name: foo
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }

  : invalid
  :
  : Also use the short option.
  :
  $* --name 123 2>>EOE != 0
    error: invalid --name option value '123': illegal first character (must be alphabetic or underscore)
    EOE
}

: type
:
{
  test.arguments += -d cfg

  : valid
  :
  {
    $* --type host 2>>/~%EOE% &cfg/***;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: host
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: host
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }

  : invalid
  :
  : Also use the short option.
  :
  $* --type '' 2>>EOE != 0
    error: empty --type option value
    EOE
}

: uuid
:
{
  test.arguments += -d cfg

  : valid
  :
  {
    uuid='18f48b4b-b5d9-4712-b98c-1930df1c4228';

    $* --uuid $uuid --name foo 2>>/~"%EOE%" &cfg/***;
      %created new configuration in .+/cfg/%
        uuid: $uuid
        type: target
        name: foo
      EOE

    $cfg_info >>/~"%EOO%";
      %path: .+/cfg/%
      uuid: $uuid
      type: target
      name: foo
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }

  : invalid
  :
  : Also use the short option.
  :
  $* --uuid '123' 2>>EOE != 0
    error: invalid value '123' for option '--uuid'
    EOE
}

: link-config
:
{
  test.arguments += -d cfg

  : valid-type
  :
  {
    $cfg_create -d host   --type 'host'   &host/***;
    $cfg_create -d build2 --type 'build2' &build2/***;

    $* --host-config host --build2-config build2 2>>/~%EOE% &cfg/***;
      %created new configuration in .+/cfg/%
      %  uuid: .{36}%
        type: target
      EOE

    $cfg_info --link >>/~"%EOO%";
      %path: .+/cfg/%
      %uuid: .{36}%
      type: target
      %name: %

      %path: .+/host/%
      %uuid: .{36}%
      type: host
      %name: %

      %path: .+/build2/%
      %uuid: .{36}%
      type: build2
      %name: %
      EOO

    $pkg_status libfoo >'libfoo unknown'
  }

  : invalid-type
  :
  {
    $cfg_create -d cfg2 &cfg2/***;

    $* --host-config cfg2 2>>/~%EOE% != 0;
      %error: host configuration .+/cfg2/ is of 'target' type%
      EOE

    $* --build2-config cfg2 2>>/~%EOE% != 0
      %error: build2 configuration .+/cfg2/ is of 'target' type%
      EOE
  }
}