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

.include ../common.testscript

: args
:
{
  : none
  :
  $c <'mv 2>"mv: missing arguments" == 1' && $b

  : no-source
  :
  $c <'mv a 2>"mv: missing source path" == 1' && $b

  : no-trailing-sep
  :
  $c <<EOI && $b
  mv a b c 2>"mv: multiple source paths without trailing separator for destination directory" == 1
  EOI

  : empty
  :
  {
    : dest
    :
    $c <<EOI && $b
    mv '' 2>"mv: invalid path ''" == 1
    EOI

    : src1
    :
    $c <<EOI && $b
    mv '' a 2>"mv: invalid path ''" == 1
    EOI

    : src2
    :
    $c <<EOI && $b
    mv '' a b/ 2>"mv: invalid path ''" == 1
    EOI
  }
}

: synopsis-1
:
: Move an entity to the specified path.
:
{
  : file
  :
  {
    : existing
    :
    {
      : to-non-existing
      :
      $c <<EOI && $b
      touch a;
      mv a b && test -f b && test -f a == 1
      EOI

      : to-existing
      :
      $c <<EOI && $b
      touch a b;
      mv a b && test -f b && test -f a == 1
      EOI

      : to-self
      :
      $c <<EOI && $b
      touch a;
      mv a a 2>>/~%EOE% != 0
      %mv: unable to move entity '.+/a' to itself%
      EOE
      EOI

      : to-dir
      :
      $c <<EOI && $b
      touch a;
      mkdir b;
      mv a b 2>>/~%EOE% != 0
      %mv: unable to move entity '.+/a' to '.+/b': .+%
      EOE
      EOI
    }

    : 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: '.+/fail/a/b/c' is out of working directory '.+/fail/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 entity '.+/force/a/b/c' to '.+/c': .+%
      EOE
      EOI
    }

    : cleanup
    :
    {
      : 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
  :
  {
    : existing
    :
    {
      : to-non-existing
      :
      : Note the here we also test that b path is cleaned up as a directory.
      :
      $c <<EOI && $b
      mkdir a;
      mv a b && test -d b && test -d a == 1
      EOI

      : to-non-empty
      :
      $c <<EOI && $b
      mkdir a b;
      touch b/c;
      mv a b 2>>/~%EOE% != 0
      %mv: unable to move entity '.+/a' to '.+/b': .+%
      EOE
      EOI

      : to-non-dir
      :
      $c <<EOI && $b
      mkdir a;
      touch b;
      mv a b 2>>/~%EOE% != 0
      %mv: unable to move entity '.+/a' to '.+/b': .+%
      EOE
      EOI
    }

    : working-dir
    :
    {
      : src
      :
      {
        $c <<EOI && $b
        mv $~ b 2>"mv: '([string] $~)' contains test working directory '$~'" != 0
        EOI
      }

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

    : overlap
    :
    $c <<EOI && $b
    mkdir a;
    mv a a/b 2>>/~%EOE% != 0
    %mv: unable to move entity '.+/a' to '.+/a/b': .+%
    EOE
    EOI

    : cleanup
    :
    {
      : sub-entry
      :
      {
	mkdir a;
	touch a/b;
	mv a c
      }

      : 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
    }
  }

  : non-existing
  :
  {
    $c <<EOI && $b
    mv a b 2>>/~%EOE% != 0
    %mv: unable to move entity '.+/a' to '.+/b': .+%
    EOE
    EOI
  }
}

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