# file      : tests/test/script/builtin/mv.testscript
# license   : MIT; see accompanying LICENSE file

.include ../common.testscript

: synopsis-1
:
: Move an entity to the specified path.
:
{
  : file
  :
  {
    : outside-scope
    :
    : Need to use a path that unlikely exists (not to remove something useful).
    :
    {
      : fail
      :
      : Moving path outside the testscript working directory fails.
      :
      $c <<EOI && $b
        mv ../../a/b/c ./c 2>>/EOE == 1
        mv: 'a/b/c' is out of working directory 'test/'
        EOE
        EOI

      : force
      :
      : Moving path outside the testscript working directory is allowed with -f
      : option. We fail after this check succeeds as the source path does not
      : exist.
      :
      $c <<EOI && $b
        mv -f ../../a/b/c ./c 2>>/~%EOE% == 1
        %mv: unable to move entry '.+/force/a/b/c' to '.+/c': .+%
        EOE
        EOI
    }

    : cleanup
    :
    {
      : enabled
      :
      $c <<EOI && $b
        touch a;
        mv a b
        EOI

      : disabled
      :
      $c <<EOI && $b
        touch a;
        mv --no-cleanup a b &!a;
        rm b
        EOI

      : existing
      :
      : Test that moving over an existing file does not move the cleanup. If
      : it does, then the file would be removed while leaving the embedded
      : scope, and so the cleanup registered by the outer touch would fail. We
      : also test that the source path cleanup is removed, otherwise it would
      : fail.
      :
      $c <<EOI && $b
        +touch b
        {
          touch a;
          mv a ../b
        }
        EOI
    }
  }

  : dir
  :
  {
    : working-dir
    :
    {
      : src
      :
      $c <<EOI && $b
        mv $~ b 2>/"mv: 'test/1/' contains test working directory 'test/1/'" != 0
        EOI

      : dst
      :
      $c <<EOI && $b
        mkdir a;
        mv a "$~" 2>/"mv: 'test/1' contains test working directory 'test/1/'" != 0
        EOI
    }

    : cleanup
    :
    {
      : enabled
      :
      $c <<EOI && $b
        mkdir a;
        mv a b
        EOI

      : disabled
      :
      $c <<EOI && $b
        mkdir a;
        mv --no-cleanup a b &!a/;
        rm -r b
        EOI

      : sub-entry
      :
      $c <<EOI && $b
        mkdir a;
        touch a/b;
        mv a c
        EOI

      : reorder
      :
      : Test that a/, that is created before b/ and so should be removed after
      : it, get removed before b/ after being renamed to b/c.
      :
      $c <<EOI && $b
        mkdir a b;
        mv a b/c
        EOI
    }
  }
}

: synopsis-2
:
: Move entities into the specified directory.
:
{
  : cleanup
  :
  $c <<EOI && $b
    mkdir a c;
    touch a/b b;
    mv a b c/
    EOI

  : no-cleanup
  :
  $c <<EOI && $b
    mkdir a c;
    touch a/b b;
    mv --no-cleanup a b c/ &!a/ &!a/b &!b;
    rm -r c/a/ c/b
    EOI
}