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

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

# Source repository:
#
# pkg-clean
# |-- 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

pkg_configure += -d cfg config.cxx=$quote($recall($cxx.path) $cxx.config.mode, true) 2>!
pkg_disfigure += -d cfg
pkg_fetch     += -d cfg 2>!
pkg_purge     += -d cfg
pkg_unpack    += -d cfg 2>!
pkg_update    += -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-clean' 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       && $pkg_update libhello;

    $* libhello 2>>~%EOE%;
      %rm .+%{6}
      cleaned libhello/1.0.0
      EOE

    $* libhello 2>>~%EOE%;
      %info: .+ is clean%
      cleaned 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 && $pkg_update libhello;

  $* libhello 2>>~%EOE%;
    %(rm|rmdir) .+%{8}
    cleaned libhello/1.0.0
    EOE

  $* libhello 2>>~%EOE%;
    %info: .+ is clean%
    cleaned libhello/1.0.0
    EOE

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