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

.include common.testscript config.testscript remote.testscript

# Source repository:
#
# pkg-drop
# |-- t4a
# |   |-- libfoo-1.1.0.tar.gz
# |   `-- repositories.manifest
# |-- t4b                     -> t4a (prerequisite repository)
# |   |-- libbar-1.1.0.tar.gz -> libfoo == 1.1.0
# |   `-- repositories.manifest
# |-- t4c                     -> t4b (prerequisite repository)
# |   |-- libbaz-1.1.0.tar.gz -> libfoo, libbar
# |   |-- libfoo-1.0.0.tar.gz
# |   `-- repositories.manifest
# `-- t4d                     -> t4c (complement)
#     |-- libbiz-1.0.0.tar.gz -> libfox, libfoo, libbaz
#     |-- libfox-1.0.0.tar.gz
#     `-- repositories.manifest

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

  cp -r $src/t4a $out/t4a && $rep_create $out/t4a &$out/t4a/packages.manifest
  cp -r $src/t4b $out/t4b && $rep_create $out/t4b &$out/t4b/packages.manifest
  cp -r $src/t4c $out/t4c && $rep_create $out/t4c &$out/t4c/packages.manifest
  cp -r $src/t4d $out/t4d && $rep_create $out/t4d &$out/t4d/packages.manifest
end

pkg_build  += -d cfg --yes 2>!
pkg_status += -d cfg
rep_add    += -d cfg 2>!
rep_fetch  += -d cfg --auth all --trust-yes 2>!

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

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

: invalid-name
:
$clone_cfg;
$* libfoo/1.0.0 2>>~%EOE% != 0
  %error: invalid package name 'libfoo/1.0.0': illegal character%
  EOE

: dependencies-or-dependents
:
{
  +$clone_cfg && $rep_add $rep/t4c && $rep_fetch
  +$pkg_build libbaz

  test.arguments += --print-only

  : foo-baz-bar
  :
  $clone_cfg;
  $* -y libfoo libbaz libbar >>EOO
    drop libbaz
    drop libbar
    drop libfoo
    EOO

  : dependents
  :
  {
    # Prepare the nested tests to use configuration from the enclosing
    # 'dependencies-or-dependents' group scope.
    #
    clone_cfg = cp -r $~/../cfg ./

    : unconfirmed
    :
    {
      test.arguments += --yes

      : libfoo
      :
      $clone_cfg;
      $* libfoo 2>>EOE != 0
        following dependent packages will have to be dropped as well:
          libbar (requires libfoo)
          libbaz (requires libbar)
        error: refusing to drop dependent packages with just --yes
          info: specify --drop-dependent to confirm
        EOE

      : libfoo-libbar
      :
      $clone_cfg;
      $* libfoo libbar 2>>EOE != 0
        following dependent packages will have to be dropped as well:
          libbaz (requires libbar)
        error: refusing to drop dependent packages with just --yes
          info: specify --drop-dependent to confirm
        EOE

      : libfoo-libbaz
      :
      $clone_cfg;
      $* libfoo libbaz 2>>EOE != 0
        following dependent packages will have to be dropped as well:
          libbar (requires libfoo)
        error: refusing to drop dependent packages with just --yes
          info: specify --drop-dependent to confirm
        EOE
    }

    : confirmed
    :
    {
      test.arguments += --drop-dependent

      : libfoo
      :
      $clone_cfg;
      $* libfoo >>EOO
        drop libbaz
        drop libbar
        drop libfoo
        EOO

      : libfoo-libbaz
      :
      $clone_cfg;
      $* libfoo libbaz >>EOO
        drop libbaz
        drop libbar
        drop libfoo
        EOO

      : libbaz-libfoo
      :
      $clone_cfg;
      $* libbaz libfoo >>EOO
        drop libbaz
        drop libbar
        drop libfoo
        EOO
    }
  }

  : dependencies
  :
  {
    # Prepare the nested tests to use configuration from the enclosing
    # 'dependencies-or-dependents' group scope.
    #
    clone_cfg = cp -r $~/../cfg ./

    : libbaz
    :
    $clone_cfg;
    $* -y libbaz >>EOO
      drop libbaz
      drop libbar
      drop libfoo
      EOO

    : libbaz-only
    :
    $clone_cfg;
    $* -n libbaz >>EOO
      drop libbaz
      EOO

    : libbar-libbaz
    :
    $clone_cfg;
    $* -n libbar libbaz >>EOO
      drop libbaz
      drop libbar
      EOO

    : libbaz-libbar
    :
    $clone_cfg;
    $* -n libbaz libbar >>EOO
      drop libbaz
      drop libbar
      EOO

    : dependencies
    :
    : Note that we do not move this test to the dependencies-and-dependents
    : group as the configuration repository set would be different.
    :
    $clone_cfg;
    $* -y --drop-dependent libbar >>EOO
      drop libbaz
      drop libbar
      drop libfoo
      EOO
  }

  # Here we combine the test group teardown and the "actual drop" test.
  #
  -$pkg_drop -d cfg --yes libbaz 2>>EOE
     disfigured libbaz
     disfigured libbar
     disfigured libfoo
     purged libbaz
     purged libbar
     purged libfoo
     EOE

   -$pkg_status libbar/1.1.0 >'libbar available [1.1.0]'
   -$pkg_status libbaz/1.1.0 >'libbaz available 1.1.0'
   -$pkg_status libfoo/1.1.0 >'libfoo available [1.1.0]'
}

: dependencies-and-dependents
:
{
  +$clone_cfg && $rep_add $rep/t4d && $rep_fetch
  +$pkg_build libbiz

  clone_cfg = cp -r ../../cfg ./
  test.arguments += --print-only

  : drop-dependencies-no-dependents
  :
  {
    test.arguments += --yes

    : libbiz
    :
    $clone_cfg;
    $* libbiz >>EOO
      drop libbiz
      drop libbaz
      drop libbar
      drop libfoo
      drop libfox
      EOO

    : libfox-libbiz
    :
    $clone_cfg;
    $* libfox libbiz >>EOO
      drop libbiz
      drop libfox
      drop libbaz
      drop libbar
      drop libfoo
      EOO
  }

  : drop-dependencies
  :
  {
    test.arguments += --yes --drop-dependent

    : libfox
    :
    $clone_cfg;
    $* libfox >>EOO
      drop libbiz
      drop libfox
      drop libbaz
      drop libbar
      drop libfoo
      EOO

    : libbaz
    :
    $clone_cfg;
    $* libbaz >>EOO
      drop libbiz
      drop libbaz
      drop libbar
      drop libfoo
      drop libfox
      EOO

    : libbar
    :
    $clone_cfg;
    $* libbar >>EOO
      drop libbiz
      drop libbaz
      drop libbar
      drop libfoo
      drop libfox
      EOO

    : libfoo
    :
    $clone_cfg;
    $* libfoo >>EOO
      drop libbiz
      drop libbaz
      drop libbar
      drop libfoo
      drop libfox
      EOO
  }

  : keep-dependencies
  {
    test.arguments += --no --drop-dependent

    : fox-baz
    :
    $clone_cfg;
    $* libfox libbaz >>EOO
      drop libbiz
      drop libfox
      drop libbaz
      EOO

    : libbaz-libfox
    :
    $clone_cfg;
    $* libbaz libfox >>EOO
      drop libbiz
      drop libbaz
      drop libfox
      EOO

    : libfox-libbar
    :
    $clone_cfg;
    $* libfox libbar >>EOO
      drop libbiz
      drop libfox
      drop libbaz
      drop libbar
      EOO

    : libbar-libfox
    :
    $clone_cfg;
    $* libbar libfox >>EOO
      drop libbiz
      drop libbaz
      drop libbar
      drop libfox
      EOO
  }

  -$pkg_drop -d cfg --yes --drop-dependent libbar 2>>EOE
     disfigured libbiz
     disfigured libbaz
     disfigured libbar
     disfigured libfoo
     disfigured libfox
     purged libbiz
     purged libbaz
     purged libbar
     purged libfoo
     purged libfox
     EOE

   -$pkg_status libfox/1.0.0 >'libfox available 1.0.0'
   -$pkg_status libfoo/1.1.0 >'libfoo available [1.1.0]'
   -$pkg_status libbar/1.1.0 >'libbar available [1.1.0]'
   -$pkg_status libbaz/1.1.0 >'libbaz available 1.1.0'
   -$pkg_status libbiz/1.0.0 >'libbiz available 1.0.0'
}

: keep-drop-options
:
: Test --drop-dependent, --keep-dependent, --keep-unused, option.
:
{
  +$clone_cfg && $rep_add $rep/t4b && $rep_fetch

  : keep-drop-dependent
  :
  {
    $clone_cfg && $pkg_build libbar;

    $* --keep-dependent libfoo 2>>EOE != 0;
      error: following dependent packages will have to be dropped as well:
        libbar (requires libfoo)
      EOE

    $* --drop-dependent libfoo 2>>EOE
      disfigured libbar
      disfigured libfoo
      purged libbar
      purged libfoo
      EOE
  }

  : drop-dependency
  :
  {
    $clone_cfg && $pkg_build libbar;

    $* libbar --yes 2>>EOE
      disfigured libbar
      disfigured libfoo
      purged libbar
      purged libfoo
      EOE
  }

  : keep-dependency
  :
  {
    $clone_cfg && $pkg_build libbar;

    $* --keep-unused libbar 2>>EOE;
      disfigured libbar
      purged libbar
      EOE

    $pkg_status libfoo >'libfoo configured 1.1.0';

    $* libfoo 2>>EOE
      disfigured libfoo
      purged libfoo
      EOE
  }
}

: disfigure-only
:
: Test --disfigure-only option.
:
{
  $clone_cfg && $rep_add $rep/t4a && $rep_fetch;
  $pkg_build libfoo;

  $* --disfigure-only libfoo 2>'disfigured libfoo';
  $pkg_status libfoo >'!libfoo unpacked 1.1.0';

  $* libfoo 2>'purged libfoo'
}