// 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.

// @dart = 2.9

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";

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);
}
