// 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:async_helper/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);
}
