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

.include ../common.test

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

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

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

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

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

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

: file
:
: Test synopsis 1: make a file copy at the specified path.
:
{
  : existing
  :
  {
    : to-non-existing
    :
    $c <<EOI && $b
    touch a;
    cp a b && test -f b
    EOI

    : to-existing
    :
    $c <<EOI && $b
    touch a b;
    cp a b
    EOI

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

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

  : non-file
  :
  {
    $c <<EOI && $b
    mkdir a;
    cp a b 2>>/~%EOE% != 0
    %cp: unable to copy file '.+/a' to '.+/b': .+%
    EOE
    EOI
  }

  : cleanup
  :
  {
    : existing
    :
    : Test that copy over an existing file doesn't register 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.
    :
    $c <<EOI && $b
    +touch b
    {
      touch a;
      cp a ../b
    }
    EOI
  }
}

: dir
:
: Test synopsis 2: make a directory copy at the specified path.
:
{
  : existing
  :
  {
    : to-non-existing
    :
    $c <<EOI && $b
    mkdir a;
    cp -r a b && test -d b
    EOI

    : to-existing
    :
    $c <<EOI && $b
    mkdir a b;
    cp -R a b 2>>/~%EOE% != 0
    %cp: unable to copy directory '.+/a' to '.+/b': .+%
    EOE
    EOI

    : to-file
    :
    $c <<EOI && $b
    mkdir a;
    touch b;
    cp -r a b 2>>/~%EOE% != 0
    %cp: unable to copy directory '.+/a' to '.+/b': .+%
    EOE
    EOI

    : recursively
    :
    {
      $c <<EOI && $b
      mkdir -p a/b/c;
      touch a/x a/b/y;
      cp -r a d && test -d d/b/c && test -f d/x && test -f d/b/y
      EOI
    }
  }

  : non-existing
  :
  {
    $c <<EOI && $b
    cp -r a b 2>>/~%EOE% != 0
    %cp: unable to copy directory '.+/a' to '.+/b': .+%
    EOE
    EOI
  }

  : non-dir
  :
  {
    $c <<EOI && $b
    touch a;
    cp -r a b 2>>/~%EOE% != 0
    %cp: unable to copy directory '.+/a' to '.+/b': .+%
    EOE
    EOI
  }
}

: files
:
: Test synopsis 3: copy files into the specified directory.
:
{
  : existing
  :
  {
    : into-dir
    :
    {
      : over-non-existing
      :
      $c <<EOI && $b
      mkdir b;
      touch a;
      cp a b/ && test -f b/a
      EOI

      : over-dir
      :
      $c <<EOI && $b
      mkdir -p b/a;
      touch a;
      cp a b/ 2>>/~%EOE% != 0
      %cp: unable to copy file '.+/a' to '.+/b/a': .+%
      EOE
      EOI

      : multiple
      :
      $c <<EOI && $b
      touch a b;
      mkdir c;
      cp a b c/ && test -f c/a && test -f c/b
      EOI
    }

    : into-non-existing-dir
    :
    {
      $c <<EOI && $b
      touch a;
      cp a b/ 2>>/~%EOE% != 0
      %cp: unable to copy file '.+/a' to '.+/b/a': .+%
      EOE
      EOI
    }

    : into-non-dir
    :
    {
      $c <<EOI && $b
      touch a b;
      cp a b/ 2>>/~%EOE% != 0
      %cp: unable to copy file '.+/a' to '.+/b/a': .+%
      EOE
      EOI
    }
  }

  : non-existing
  :
  {
    $c <<EOI && $b
    mkdir b;
    cp a b/ 2>>/~%EOE% != 0
    %cp: unable to copy file '.+/a' to '.+/b/a': .+%
    EOE
    EOI
  }

  : non-file
  :
  {
    $c <<EOI && $b
    mkdir a b;
    cp a b/ 2>>/~%EOE% != 0
    %cp: unable to copy file '.+/a' to '.+/b/a': .+%
    EOE
    EOI
  }
}

: filesystem-entries
:
: Test synopsis 4: copy filesystem entries into the specified directory.
:
{
  : file
  :
  {
    $c <<EOI && $b
    mkdir b;
    touch a;
    cp -R a b/ && test -f b/a
    EOI
  }

  : dir
  :
  {
    : over-non-existing
    :
    $c <<EOI && $b
    mkdir a b;
    touch a/c;
    cp -R a b/ && test -f b/a/c
    EOI

    : over-existing
    :
    $c <<EOI && $b
    mkdir -p a b/a;
    cp -R a b/ 2>>/~%EOE% != 0
    %cp: unable to copy directory '.+/a' to '.+/b/a': .+%
    EOE
    EOI
  }
}