# file      : tests/pkg-update.testscript
# license   : MIT; see accompanying LICENSE file

.include common.testscript auth.testscript config.testscript remote.testscript

# Source repository:
#
# pkg-update
# |-- hello
# |   |-- libhello-1.0.0.tar.gz
# |   `-- repositories.manifest
# `-- libhello-1.0.0
#     |-- build
#     |   |-- bootstrap.build
#     |   |-- export.build
#     |   `-- root.build
#     |-- buildfile
#     |-- hello
#     |   |-- buildfile
#     |   |-- export
#     |   |-- hello
#     |   `-- hello.cxx
#     |-- INSTALL
#     |-- manifest
#     |-- tests
#     |   |-- build
#     |   |   |-- bootstrap.build
#     |   |   `-- root.build
#     |   |-- buildfile
#     |   `-- test
#     |       |-- buildfile
#     |       |-- driver.cxx
#     |       `-- test.out
#     `-- version

# Prepare repositories used by tests if running in the local mode.
#
+if! $remote
  rep_create += 2>!

  # Create the signed 'hello' repository.
  #
  cp -r $src/hello $out/hello
  cat <<<$cert_manifest >+$out/hello/repositories.manifest

  $rep_create --key $key $out/hello &$out/hello/packages.manifest \
                                    &$out/hello/signature.manifest
end

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

pkg_configure += -d cfg $config_cxx 2>!
pkg_disfigure += -d cfg
pkg_fetch     += -d cfg 2>!
pkg_purge     += -d cfg
pkg_build     += -d cfg
pkg_unpack    += -d cfg 2>!
rep_add       += -d cfg 2>!
rep_fetch     += -d cfg --auth all 2>!

: no-name
:
$clone_cfg;
$* 2>>EOE != 0
  error: package name argument expected
    info: run 'bpkg help pkg-update' for more information
  EOE

: fetched
:
{
  +$clone_cfg
  +$rep_add $rep/hello
  +$rep_fetch --trust $cert_fp &cfg/.bpkg/certs/**

  : no-such-package
  :
  $clone_cfg;
  $* libhello 2>>/EOE != 0
    error: package libhello does not exist in configuration cfg/
    EOE

  : wrong-state
  :
  {
    $clone_cfg && $pkg_fetch libhello/1.0.0;

    $* libhello 2>>EOE != 0;
      error: package libhello is fetched
        info: expected it to be configured
      EOE

    $pkg_purge libhello 2>'purged libhello/1.0.0'
  }

  : src-eq-out
  :
  {
    $clone_cfg;
    $pkg_fetch libhello/1.0.0 && $pkg_unpack libhello;
    $pkg_configure libhello;

    $* libhello 2>>~%EOE%;
      %(c\+\+|ar|ld) .+%{6}
      updated libhello/1.0.0
      EOE

    $* libhello 2>>~%EOE%;
      %info: .+ is up to date%
      updated libhello/1.0.0
      EOE

    $pkg_disfigure libhello 2>'disfigured libhello/1.0.0';
    $pkg_purge     libhello 2>'purged libhello/1.0.0'
  }
}

: src-ne-out
:
{
  $clone_cfg;
  $pkg_unpack -e $src/libhello-1.0.0 && $pkg_configure libhello;

  $* libhello 2>>~%EOE%;
    %(mkdir|c\+\+|ar|ld) .+%{8}
    updated libhello/1.0.0
    EOE

  $* libhello 2>>~%EOE%;
    %info: .+ is up to date%
    updated libhello/1.0.0
    EOE

  $pkg_disfigure libhello 2>'disfigured libhello/1.0.0';
  $pkg_purge     libhello 2>'purged libhello/1.0.0'
}

: vars
:
{
  +$cfg_create cxx $config_cxx -d cfg 2>- &cfg/***
  +$rep_fetch $rep/hello --trust $cert_fp &cfg/.bpkg/certs/**

  : global-and-local
  :
  {
    $clone_cfg;
    $pkg_fetch libhello/1.0.0 && $pkg_unpack libhello;
    $pkg_configure libhello;

    $* -v config.cxx.poptions=-DG libhello +{ config.cxx.poptions+=-DL } 2>>~%EOE%;
      %.+ config\.cxx\.poptions=-DG config\.cxx\.poptions\+=-DL update.+%
      %.{6}
      updated libhello/1.0.0
      EOE

    $pkg_disfigure libhello 2>'disfigured libhello/1.0.0';
    $pkg_purge     libhello 2>'purged libhello/1.0.0'
  }

  : all-packages
  :
  {
    $clone_cfg;
    $pkg_build libhello 2>!; # To hold libhello package.

    $* -v --all config.cxx.poptions=-DG 2>>~%EOE%;
      %.+ config\.cxx\.poptions=-DG update.+%
      %.{6}
      updated libhello/1.0.0
      EOE

    $pkg_disfigure libhello 2>'disfigured libhello/1.0.0';
    $pkg_purge     libhello 2>'purged libhello/1.0.0'
  }

  : var-opts
  :
  {
    $clone_cfg;

    $* config.cxx.poptions=-DG +{ --all } 2>>EOE != 0
      error: unexpected options group for variable 'config.cxx.poptions=-DG'
      EOE
  }
}