# file      : tests/config.testscript
# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

# Note that we test the list sub-command while testing other sub-commands.
#

.include common.testscript project.testscript

cxx = cc config.cxx="$recall($cxx.path)"

status += -d prj
init   += -d prj
update += -d prj
deinit += -d prj

: create
:
{
  : name-dir
  :
  {
    $clone_root_prj;

    $* create @cfg cfg-dir $cxx 2>>/"EOE" &cfg-dir/***;
      created configuration @cfg $~/cfg-dir/ 1 default,forwarded,auto-synchronized
      EOE

    $status 2>'error: package prj is not initialized in configuration @cfg' != 0;

    $init @cfg 2>>/~"%EOE%";
      initializing in project $~/prj/
      synchronizing:
      %  new prj.+19700101000000%
      EOE

    $status >'prj configured 0.1.0-a.0.19700101000000';

    $* list @cfg >>/"EOO";
      @cfg $~/cfg-dir/ 1 default,forwarded,auto-synchronized
      EOO

    $update @cfg 2>>~%EOE%;
      %(mkdir|c\+\+|ld) .+%{3}
      EOE

    $deinit @cfg 2>>/"EOE"
      deinitializing in project $~/prj/
      synchronizing:
        drop prj
      EOE
  }

  : name
  :
  {
    $clone_root_prj;

    $* create -- @cfg $cxx 2>>/"EOE" &prj-cfg/***;
      created configuration @cfg $~/prj-cfg/ 1 default,forwarded,auto-synchronized
      EOE

    $init @cfg 2>>/~"%EOE%";
      initializing in project $~/prj/
      synchronizing:
      %  new prj.+19700101000000%
      EOE

    $status >'prj configured 0.1.0-a.0.19700101000000';

    $* list >>/"EOO";
      @cfg $~/prj-cfg/ 1 default,forwarded,auto-synchronized
      EOO

    $update @cfg 2>>~%EOE%;
      %(mkdir|c\+\+|ld) .+%{3}
      EOE

    $deinit @cfg 2>>/"EOE"
      deinitializing in project $~/prj/
      synchronizing:
        drop prj
      EOE
  }

  : dir
  :
  {
    $clone_root_prj;

    $* create cfg $cxx 2>>/"EOE" &cfg/***;
      created configuration $~/cfg/ 1 default,forwarded,auto-synchronized
      EOE

    $init -c cfg 2>>/~"%EOE%";
      initializing in project $~/prj/
      synchronizing:
      %  new prj.+19700101000000%
      EOE

    $status >'prj configured 0.1.0-a.0.19700101000000';

    $* list >>/"EOO";
      $~/cfg/ 1 default,forwarded,auto-synchronized
      EOO

    $update -c cfg 2>>~%EOE%;
      %(mkdir|c\+\+|ld) .+%{3}
      EOE

    $deinit -c cfg 2>>/"EOE"
      deinitializing in project $~/prj/
      synchronizing:
        drop prj
      EOE
  }

  : wipe
  :
  {
    $clone_root_prj;

    mkdir --no-cleanup cfg;
    touch --no-cleanup cfg/a;

    $* create cfg $cxx 2>>/"EOE" != 0;
      error: directory $~/cfg/ is not empty
        info: use --wipe to clean it up but be careful
      EOE

    $* create --wipe cfg $cxx 2>>/"EOE" &cfg/***
      created configuration $~/cfg/ 1 default,forwarded,auto-synchronized
      EOE
  }
}

: add
:
{
  $clone_root_prj;

  # Pre-create configurations.
  #
  $new -C prj-cfg1 tmp1 $cxx 2>! &prj-cfg1/*** &tmp1/***;
  $new -C prj-cfg2 tmp2 $cxx 2>! &prj-cfg2/*** &tmp2/***;

  $* add @cfg1 prj-cfg1 2>>/"EOE";
    added configuration @cfg1 $~/prj-cfg1/ 1 default,forwarded,auto-synchronized
    EOE

  $* add @cfg2 prj-cfg2 2>>/"EOE";
    added configuration @cfg2 $~/prj-cfg2/ 2 auto-synchronized
    EOE

  $init --all 2>>/~"%EOE%";
    initializing in project $~/prj/
    in configuration @cfg1:
    synchronizing:
    %  new prj.+19700101000000%

    in configuration @cfg2:
    synchronizing:
    %  new prj.+19700101000000%
    EOE

  $status --all >>EOO;
    in configuration @cfg1:
    prj configured 0.1.0-a.0.19700101000000

    in configuration @cfg2:
    prj configured 0.1.0-a.0.19700101000000
    EOO

  $* list >>/"EOO";
    @cfg1 $~/prj-cfg1/ 1 default,forwarded,auto-synchronized
    @cfg2 $~/prj-cfg2/ 2 auto-synchronized
    EOO

  $update --all 2>>~%EOE%;
    in configuration @cfg1:
    %(mkdir|c\+\+|ld) .+%{3}

    in configuration @cfg2:
    %(mkdir|c\+\+|ld) .+%{3}
    EOE

  $deinit --all 2>>/"EOE"
    deinitializing in project $~/prj/
    in configuration @cfg1:
    synchronizing:
      drop prj

    in configuration @cfg2:
    synchronizing:
      drop prj
    EOE
}

: move
:
{
  $clone_root_prj;

  $* create -- @cfg $cxx &prj-cfg/*** 2>>/"EOE";
    created configuration @cfg $~/prj-cfg/ 1 default,forwarded,auto-synchronized
    EOE

  $init @cfg 2>>/~"%EOE%";
    initializing in project $~/prj/
    synchronizing:
    %  new prj.+19700101000000%
    EOE

  mv prj-cfg prj-cfg2;

  $* move @cfg prj-cfg2 2>>/"EOE";
    moved configuration @cfg $~/prj-cfg/ 1 to $~/prj-cfg2/
    EOE

  $update --all 2>>~%EOE%;
    %(mkdir|c\+\+|ld) .+%{3}
    EOE

  $deinit 2>>/"EOE"
    deinitializing in project $~/prj/
    synchronizing:
      drop prj
    EOE
}

: rename
:
{
  $clone_root_prj;

  $* create -- @cfg $cxx 2>>/"EOE" &prj-cfg/***;
    created configuration @cfg $~/prj-cfg/ 1 default,forwarded,auto-synchronized
    EOE

  $init @cfg 2>>/~"%EOE%";
    initializing in project $~/prj/
    synchronizing:
    %  new prj.+19700101000000%
    EOE

  $* rename @cfg cfg2 2>>/"EOE";
    renamed configuration @cfg $~/prj-cfg/ 1 to @cfg2
    EOE

  $update @cfg2 2>>~%EOE%;
    %(mkdir|c\+\+|ld) .+%{3}
    EOE

  $deinit 2>>/"EOE"
    deinitializing in project $~/prj/
    synchronizing:
      drop prj
    EOE
}

: remove
:
: Here we also test the set sub-command.
:
{
  $clone_root_prj;

  $* create -- @cfg1 $cxx 2>! &prj-cfg1/***;
  $* create -- @cfg2 $cxx 2>! &prj-cfg2/***;

  $init --all 2>!;

  $* remove @cfg1 2>>EOE != 0;
    error: configuration @cfg1 contains initialized packages
      info: use deinit command to deinitialize packages
      info: use status command to list initialized packages
    EOE

  $deinit @cfg1 2>>/"EOE";
    deinitializing in project $~/prj/
    synchronizing:
      drop prj
    EOE

  $* remove @cfg1 2>>/"EOE";
    removed configuration @cfg1 $~/prj-cfg1/ 1
    EOE

  $status --all >>EOO;
    prj configured 0.1.0-a.0.19700101000000
    EOO

  $* list >>/"EOO";
    @cfg2 $~/prj-cfg2/ 2 auto-synchronized
    EOO

  $update 2>>/"EOE" != 0;
    error: no default configuration in project $~/prj/
      info: use \(@<cfg-name> | --config|-c <cfg-dir> | --all|-a\) to specify configuration explicitly
    EOE

  $* set @cfg2 --default --forward --no-auto-sync 2>>/"EOE";
    updated configuration @cfg2 $~/prj-cfg2/ 2 default,forwarded
    info: explicit bdep-sync is required for changes to take effect
    EOE

  $* list >>/"EOO";
    @cfg2 $~/prj-cfg2/ 2 default,forwarded
    EOO

  $update 2>>~%EOE%;
    %(mkdir|c\+\+|ld) .+%{3}
    EOE

  $deinit --all 2>>/"EOE"
    deinitializing in project $~/prj/
    synchronizing:
      drop prj
    EOE
}