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

.include ../common.testscript

: unknown-option
:
$c <<EOI && $b
ln -u 2>"ln: unknown option '-u'" == 1
EOI

: args
:
{
  : -s-option
  :
  $c <'ln 2>"ln: missing -s|--symbolic option" == 1' && $b

  : none
  :
  $c <'ln -s 2>"ln: missing arguments" == 1' && $b

  : no-target
  :
  $c <'ln -s a 2>"ln: missing target path" == 1' && $b

  : no-trailing-sep
  :
  $c <<EOI && $b
  ln -s a b c 2>"ln: multiple target paths with non-directory link path" == 1
  EOI

  : empty
  :
  {
    : link
    :
    $c <<EOI && $b
    ln -s '' 2>"ln: invalid path ''" == 1
    EOI

    : target1
    :
    $c <<EOI && $b
    ln -s '' a 2>"ln: invalid path ''" == 1
    EOI

    : target2
    :
    $c <<EOI && $b
    ln -s '' a b/ 2>"ln: invalid path ''" == 1
    EOI
  }
}

: file
:
: Test creating a file symlink.
:
{
  : non-existing-link-path
  :
  $c <<EOI && $b
  touch a;
  ln -s a b && test -f b
  EOI

  : existing-link
  :
  {
    : file
    :
    $c <<EOI && $b
    touch a b;
    ln -s a b 2>>/~%EOE% != 0
    %(
    %ln: unable to create .+link '.+/b' to '.+/a': .+%|
    %ln: unable to copy file '.+/a' to '.+/b': .+%
    %)
    EOE
    EOI

    : dir
    :
    $c <<EOI && $b
    touch a;
    mkdir b;
    ln -s a b 2>>/~%EOE% != 0
    %(
    %ln: unable to create .+link '.+/b' to '.+/a': .+%|
    %ln: unable to copy file '.+/a' to '.+/b': .+%
    %)
    EOE
    EOI
  }

  : non-existing
  {
    : target
    :
    $c <<EOI && $b
    ln -s a b 2>>/~%EOE% != 0
    %ln: unable to create symlink to '.+/a': no such file or directory%
    EOE
    EOI

    : link-dir
    :
    $c <<EOI && $b
    touch a;
    ln -s a b/c 2>>/~%EOE% != 0
    %(
    %ln: unable to create .+link '.+/b/c' to '.+/a': .+%|
    %ln: unable to copy file '.+/a' to '.+/b/c': .+%
    %)
    EOE
    EOI
  }
}

: dir
:
: Test creating a directory symlink.
:
{
  : non-existing-link-path
  :
  $c <<EOI && $b
  mkdir a;
  touch a/b;
  ln -s a c && test -f c/b
  EOI

  : existing-link
  :
  {
    : dir
    :
    $c <<EOI && $b
    mkdir a b;
    ln -s a b 2>>/~%EOE% != 0
    %(
    %ln: unable to create .+link '.+/b' to '.+/a': .+%|
    %ln: unable to copy directory '.+/a' to '.+/b': .+%
    %)
    EOE
    EOI

    : file
    :
    $c <<EOI && $b
    mkdir a;
    touch b;
    ln -s a b 2>>/~%EOE% != 0
    %(
    %ln: unable to create .+link '.+/b' to '.+/a': .+%|
    %ln: unable to copy directory '.+/a' to '.+/b': .+%
    %)
    EOE
    EOI
  }

  : non-existing
  {
    : link-dir
    :
    $c <<EOI && $b
    mkdir a;
    ln -s a b/c 2>>/~%EOE% != 0
    %(
    %ln: unable to create .+link '.+/b/c' to '.+/a': .+%|
    %ln: unable to copy directory '.+/a' to '.+/b/c': .+%
    %)
    EOE
    EOI
  }
}

: multiple-targets
:
: Test creating links for multiple targets in the specified directory.
:
{
  $c <<EOI && $b
  touch a;
  mkdir b c;
  ln -s a b c/ && test -f c/a && test -d c/b
  EOI
}