# file      : tests/mventry/testscript
# license   : MIT; see accompanying LICENSE file

: file
:
{
  : non-existing
  :
  $* a b 2>- == 1

  : over
  :
  {
    : non-existing
    :
    echo 'foo' >=a &!a;
    $* a b &b;
    cat b >'foo';
    test -f a == 1

    : existing-file
    :
    echo 'foo' >=a &!a;
    echo 'bar' >=b;
    $* a b;
    cat b >'foo';
    test -f a == 1

    : existing-dir
    :
    echo 'foo' >=a;
    mkdir b;
    $* a b 2>- == 1
  }

  : to-dir
  :
  echo 'foo' >=a &!a;
  mkdir b;
  $* a b/ &b/a;
  cat b/a >'foo';
  test -f a == 1
}

: dir
:
{
  : over
  {
    : non-existing
    :
    mkdir -p a/b &!a/b/ &!a/;
    echo 'foo' >=a/c &!a/c;
    $* a b &b/ &b/c &b/b/;
    cat b/c >'foo';
    test -d b/b;
    test -d a == 1

    : empty-dir
    :
    mkdir -p a/b &!a/b/ &!a/;
    echo 'foo' >=a/c &!a/c;
    mkdir b;
    $* a b &b/c &b/b/;
    cat b/c >'foo';
    test -d b/b;
    test -d a == 1

    : non-empty-dir
    :
    mkdir -p a/b;
    mkdir -p b/d;
    $* a b 2>- == 1

    : existing-file
    :
    mkdir a;
    touch b;
    $* a b 2>- == 1
  }

  : to-dir
  :
  mkdir a &!a/;
  mkdir b;
  $* a b/ &b/a/;
  test -d b/a;
  test -f a == 1
}

: symlink
:
: If we are not cross-testing let's test renaming symlynks from and over. On
: Windows that involves mklink command usability test. If we fail to create a
: trial link (say because we are not in the Developer Mode and are running
: non-elevated console), then the test group will be silently skipped.
:
if ($test.target == $build.host)
{
  +if ($cxx.target.class != 'windows')
    lnf = [cmdline] ^ln -s t l &l
    lnd = [cmdline] $lnf
  else
    echo 'yes' >=t
    if cmd /C 'mklink l t' >- 2>- &?l && cat l >'yes'
      lnf = [cmdline] cmd /C 'mklink l t' &l >-
      lnd = [cmdline] cmd /C 'mklink /D l t' &l >-
    end

    jnc = [cmdline] cmd /C 'mklink /J l t' &l >-
  end

  : symlink
  :
  if! $empty($lnf)
  {
    : file
    :
    {
      : from
      :
      : Make sure that if source is a symlink it refers the same target after
      : rename.
      :
      echo 'foo' >=t;
      $lnf;
      $* l ll &!l &ll;
      test -f t;
      test -f l == 1;
      echo 'bar' >=t;
      cat ll >'bar'

      : to
      :
      : Make sure that if destination is a symlink it is get overwritten and
      : it's target stays intact.
      :
      echo 'foo' >=t;
      $lnf;
      echo 'bar' >=f;
      $* f l &!f;
      cat t >'foo';
      test -f f == 1;
      echo 'baz' >=t;
      cat l >'bar'

      : over-existing-dir
      :
      echo 'foo' >=t;
      $lnf;
      mkdir d;
      $* t d 2>- == 1
    }

    : dir
    :
    {
      : from
      :
      : Make sure that if source is a symlink it refers the same target after
      : rename.
      :
      mkdir -p t;
      $lnd;
      $* l ll &!l &ll;
      touch t/f;
      test -f ll/f;
      test -f l == 1;
      test -d l == 1

      : to
      :
      : Make sure that if destination is a symlink it is get overwritten and
      : it's target stays intact.
      :
      mkdir -p t;
      $lnd;
      echo 'foo' >=f;
      $* f l &!f;
      cat l >'foo';
      test -d t;
      test -f f == 1

      : over-existing-dir
      :
      mkdir t;
      $lnd;
      mkdir d;
      $* l d 2>- == 1
    }
  }

  : junction
  :
  if! $empty($jnc)
  {
    : from
    :
    : Make sure that if source is a junction it refers the same target after
    : rename.
    :
    mkdir -p t;
    $jnc;
    $* l ll &!l &ll;
    touch t/f;
    test -f ll/f;
    test -f l == 1;
    test -d l == 1

    : to
    :
    : Make sure that if destination is a junction it is get overwritten and
    : it's target stays intact.
    :
    mkdir -p t;
    $jnc;
    echo 'foo' >=f;
    $* f l &!f;
    cat l >'foo';
    test -d t;
    test -f f == 1

    : over-existing-dir
    :
    mkdir t;
    $jnc;
    mkdir d;
    $* l d 2>- == 1
  }
}

: different-fs
:
: Note that nested tests may fail for cross-testing as the directory path will
: unlikelly be usable on both host (build2 driver) and target (test driver)
: platforms.
:
if! $empty($config.libbutl.test.rename.dir)
{
  wd = $config.libbutl.test.rename.dir/libbutl-rename
  +rm -rf $wd
  +mkdir $wd

  : file
  :
  {
    : over-non-existing
    :
    {
      wd = "$wd/$@";
      mkdir -p $wd;
      b = $wd/b;

      echo 'foo' >=a &!a;
      $* a $b;
      cat $b >'foo';
      test -f a == 1
    }

    : over-file
    :
    {
      wd = "$wd/$@";
      mkdir -p $wd;
      b = $wd/b;

      touch $b;
      echo 'foo' >=a &!a;
      $* a $b;
      cat $b >'foo';
      test -f a == 1
    }
  }

  : dir
  :
  : Test that renaming directory to different fs/drive expectedly fails.
  :
  {
    wd = "$wd/$@";
    mkdir -p $wd;
    b = $wd/b;

    mkdir a;
    $* a $b 2>- == 1
  }

  -rm -rf $wd
}
