// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// Dart test program for testing file I/O.

import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:io';

import "package:expect/async_helper.dart";
import "package:expect/expect.dart";
import "package:path/path.dart";

late String tempDirectory;

void main() {
  if (Platform.isWindows) {
    testWindowsCases();
  } else {
    testPosixCases();
  }
  asyncStart();
  createTempDirectories().then(testObjects).whenComplete(() {
    asyncEnd();
    new Directory(tempDirectory).delete(recursive: true);
  });
}

testPosixCases() {
  Expect.equals('/dir', FileSystemEntity.parentOf('/dir/file'));
  Expect.equals('/dir', FileSystemEntity.parentOf('/dir/file/'));
  Expect.equals('/dir', FileSystemEntity.parentOf('/dir//file//'));
  Expect.equals('/', FileSystemEntity.parentOf('/dir'));
  Expect.equals('/', FileSystemEntity.parentOf('/dir///'));
  Expect.equals('/', FileSystemEntity.parentOf('/'));

  Expect.equals('.', FileSystemEntity.parentOf('file'));
  Expect.equals('.', FileSystemEntity.parentOf('file//'));
  Expect.equals('.', FileSystemEntity.parentOf(''));
  Expect.equals('.', FileSystemEntity.parentOf('..'));
  Expect.equals('.', FileSystemEntity.parentOf('.'));
  Expect.equals('.', FileSystemEntity.parentOf(''));
  Expect.equals('/', FileSystemEntity.parentOf('/'));
  Expect.equals('/', FileSystemEntity.parentOf('//'));
  Expect.equals('/', FileSystemEntity.parentOf('//file///'));
  Expect.equals('dir', FileSystemEntity.parentOf('dir/file'));
  Expect.equals('dir', FileSystemEntity.parentOf('dir/file/'));
  Expect.equals('dir', FileSystemEntity.parentOf('dir/file//'));
  Expect.equals('dir/subdir', FileSystemEntity.parentOf('dir/subdir/file'));
  Expect.equals('dir//subdir', FileSystemEntity.parentOf('dir//subdir//file/'));
  Expect.equals(
    'dir/sub.dir',
    FileSystemEntity.parentOf('dir/sub.dir/fi le///'),
  );
  Expect.equals('dir/..', FileSystemEntity.parentOf('dir/../file/'));
  Expect.equals('dir/..', FileSystemEntity.parentOf('dir/../..'));
  Expect.equals('.', FileSystemEntity.parentOf('./..'));
  Expect.equals('..', FileSystemEntity.parentOf('../.'));
}

testWindowsCases() {
  Expect.equals(r'C:/dir', FileSystemEntity.parentOf(r'C:/dir/file'));
  Expect.equals(r'C:/dir', FileSystemEntity.parentOf(r'C:/dir/file/'));
  Expect.equals(r'C:\dir', FileSystemEntity.parentOf(r'C:\dir\file'));
  Expect.equals(r'C:\dir', FileSystemEntity.parentOf(r'C:\dir\file\'));
  Expect.equals(r'C:\dir', FileSystemEntity.parentOf(r'C:\dir\\file\\'));
  Expect.equals(r'C:\', FileSystemEntity.parentOf(r'C:\dir'));
  Expect.equals(r'C:\', FileSystemEntity.parentOf(r'C:\dir\/\'));
  Expect.equals(r'C:\', FileSystemEntity.parentOf(r'C:\'));
  // FileSystemEntity.isAbsolute returns false for 'C:'.
  Expect.equals(r'.', FileSystemEntity.parentOf(r'C:'));

  Expect.equals(
    r'\\server\share\dir',
    FileSystemEntity.parentOf(r'\\server\share\dir\file'),
  );
  Expect.equals(
    r'\\server\share\dir',
    FileSystemEntity.parentOf(r'\\server\share\dir\file\'),
  );
  Expect.equals(
    r'\\server\share',
    FileSystemEntity.parentOf(r'\\server\share\file'),
  );
  Expect.equals(r'\\server\', FileSystemEntity.parentOf(r'\\server\share'));
  Expect.equals(r'\\server\', FileSystemEntity.parentOf(r'\\server\share\'));
  Expect.equals(r'\\server\', FileSystemEntity.parentOf(r'\\server\'));
  Expect.equals(r'\\server/', FileSystemEntity.parentOf(r'\\server/'));
  Expect.equals(r'\\serve', FileSystemEntity.parentOf(r'\\serve'));

  Expect.equals(r'.', FileSystemEntity.parentOf(r'file'));
  Expect.equals(r'.', FileSystemEntity.parentOf(r''));
  Expect.equals(r'.', FileSystemEntity.parentOf(r'..'));
  Expect.equals(r'.', FileSystemEntity.parentOf(r'.'));
  Expect.equals(r'.', FileSystemEntity.parentOf(r''));
  Expect.equals(r'/', FileSystemEntity.parentOf(r'/'));
  Expect.equals(r'\', FileSystemEntity.parentOf(r'\'));
  Expect.equals(r'\', FileSystemEntity.parentOf(r'\file\\/'));
  Expect.equals(r'dir', FileSystemEntity.parentOf(r'dir\file'));
  Expect.equals(r'dir', FileSystemEntity.parentOf(r'dir\file\'));
  Expect.equals(r'dir', FileSystemEntity.parentOf(r'dir/file/'));
  Expect.equals(r'dir\subdir', FileSystemEntity.parentOf(r'dir\subdir\file'));
  Expect.equals(
    r'dir\sub.dir',
    FileSystemEntity.parentOf(r'dir\sub.dir\fi le'),
  );
}

Future createTempDirectories() {
  return Directory.systemTemp
      .createTemp('dart_parent_')
      .then((dir) => tempDirectory = dir.path)
      .then((_) => new File(join(tempDirectory, 'file1')).create())
      .then((_) => new Link(join(tempDirectory, 'link1')).create('.'))
      .then((_) => new Directory(join(tempDirectory, 'dir1')).create());
}

testObjects(var ignored) {
  ['file1', 'link1', 'dir1', 'file2', 'link2', 'dir2'].map(testPath);
}

testPath(String path) {
  Expect.equals(tempDirectory, new File(join(tempDirectory, path)).parent.path);
  Expect.equals(tempDirectory, new Link(join(tempDirectory, path)).parent.path);
  Expect.equals(
    tempDirectory,
    new Directory(join(tempDirectory, path)).parent.path,
  );
}
