// Copyright (c) 2017, 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.

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

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

class DirectoryMock extends FileSystemEntity implements Directory {
  final String path = "/mockdir";

  DirectoryMock(String path);

  static DirectoryMock createDirectory(String path) => new DirectoryMock(path);
  static DirectoryMock getCurrent() => new DirectoryMock("");
  static void setCurrent(String path) {}
  static DirectoryMock getSystemTemp() => new DirectoryMock("");

  Uri get uri => throw "";
  Future<Directory> create({bool recursive: false}) => throw "";
  void createSync({bool recursive: false}) {}
  Future<Directory> createTemp([String? prefix]) => throw "";
  Directory createTempSync([String? prefix]) => throw "";
  Future<bool> exists() => throw "";
  bool existsSync() => false;
  Future<String> resolveSymbolicLinks() => throw "";
  String resolveSymbolicLinksSync() => throw "";
  Future<Directory> rename(String newPath) => throw "";
  Directory renameSync(String newPath) => throw "";
  Directory get absolute => throw "";
  Stream<FileSystemEntity> list(
          {bool recursive: false, bool followLinks: true}) =>
      throw "";
  List<FileSystemEntity> listSync(
          {bool recursive: false, bool followLinks: true}) =>
      throw "";
}

class FileMock extends FileSystemEntity implements File {
  String get path => "/mockfile";

  FileMock(String path);

  static FileMock createFile(String path) => new FileMock(path);

  Future<File> create({bool recursive: false}) => throw "";
  void createSync({bool recursive: false}) {}
  Future<File> rename(String newPath) => throw "";
  File renameSync(String newPath) => throw "";
  Future<File> copy(String newPath) => throw "";
  File copySync(String newPath) => throw "";
  Future<bool> exists() => throw "";
  bool existsSync() => false;
  Future<int> length() => throw "";
  int lengthSync() => throw "";
  File get absolute => throw "";
  Future<DateTime> lastAccessed() => throw "";
  DateTime lastAccessedSync() => throw "";
  Future setLastAccessed(DateTime time) => throw "";
  void setLastAccessedSync(DateTime time) {}
  Future<DateTime> lastModified() => throw "";
  DateTime lastModifiedSync() => throw "";
  Future setLastModified(DateTime time) => throw "";
  void setLastModifiedSync(DateTime time) {}
  Future<RandomAccessFile> open({FileMode mode: FileMode.read}) => throw "";
  RandomAccessFile openSync({FileMode mode: FileMode.read}) => throw "";
  Stream<List<int>> openRead([int? start, int? end]) => throw "";
  IOSink openWrite({FileMode mode: FileMode.write, Encoding encoding: utf8}) =>
      throw "";
  Future<Uint8List> readAsBytes() => throw "";
  Uint8List readAsBytesSync() => throw "";
  Future<String> readAsString({Encoding encoding: utf8}) => throw "";
  String readAsStringSync({Encoding encoding: utf8}) => throw "";
  Future<List<String>> readAsLines({Encoding encoding: utf8}) => throw "";
  List<String> readAsLinesSync({Encoding encoding: utf8}) => throw "";
  Future<File> writeAsBytes(List<int> bytes,
          {FileMode mode: FileMode.write, bool flush: false}) =>
      throw "";
  void writeAsBytesSync(List<int> bytes,
      {FileMode mode: FileMode.write, bool flush: false}) {}
  Future<File> writeAsString(String contents,
          {FileMode mode: FileMode.write,
          Encoding encoding: utf8,
          bool flush: false}) =>
      throw "";
  void writeAsStringSync(String contents,
      {FileMode mode: FileMode.write,
      Encoding encoding: utf8,
      bool flush: false}) {}
}

class FileStatMock implements FileStat {
  final changed = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
  final modified = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
  final accessed = new DateTime.fromMillisecondsSinceEpoch(0, isUtc: true);
  final type = FileSystemEntityType.file;
  final int mode = 0;
  final int size = 0;

  FileStatMock();

  static Future<FileStat> stat(String path) {
    return new Future.value(new FileStatMock());
  }

  static FileStat statSync(String path) => new FileStatMock();

  String modeString() => throw "";
}

class FileSystemEntityMock {
  static Future<bool> identical(String path1, String path2) {
    return new Future.value(false);
  }

  static bool identicalSync(String path1, String path2) => false;

  static Future<FileSystemEntityType> getType(String path, bool followLinks) {
    return new Future.value(FileSystemEntityType.file);
  }

  static FileSystemEntityType getTypeSync(String path, bool followLinks) {
    return FileSystemEntityType.file;
  }
}

final _mockFileSystemEvent = new Stream<FileSystemEvent>.empty();

class FileSystemWatcherMock {
  static Stream<FileSystemEvent> watch(
          String path, int events, bool recursive) =>
      _mockFileSystemEvent;

  static bool watchSupported() => false;
}

class LinkMock extends FileSystemEntity implements Link {
  String get path => "/mocklink";

  LinkMock(String path);

  static Link createLink(String path) => new LinkMock(path);

  Future<Link> create(String target, {bool recursive: false}) => throw "";
  void createSync(String target, {bool recursive: false}) {}
  void updateSync(String target) {}
  Future<Link> update(String target) => throw "";
  Future<bool> exists() => throw "";
  bool existsSync() => false;
  Future<String> resolveSymbolicLinks() => throw "";
  String resolveSymbolicLinksSync() => throw "";
  Future<Link> rename(String newPath) => throw "";
  Link renameSync(String newPath) => throw "";
  Link get absolute => throw "";
  Future<String> target() => throw "";
  String targetSync() => throw "";
}

Future<Socket> socketConnect(dynamic host, int port,
    {dynamic sourceAddress, int sourcePort = 0, Duration? timeout}) async {
  throw "";
}

Future<ConnectionTask<Socket>> socketStartConnect(dynamic host, int port,
    {dynamic sourceAddress, int sourcePort = 0}) async {
  throw "";
}

Future<ServerSocket> serverSocketBind(dynamic address, int port,
    {int backlog: 0, bool v6Only: false, bool shared: false}) async {
  throw "";
}

class StdinMock extends Stream<List<int>> implements Stdin {
  bool echoMode = false;
  bool echoNewlineMode = false;
  bool lineMode = false;
  bool get hasTerminal => throw "";
  bool get supportsAnsiEscapes => throw "";

  int readByteSync() => throw "";
  String readLineSync(
          {Encoding encoding = systemEncoding, bool retainNewlines = false}) =>
      throw "";
  StreamSubscription<List<int>> listen(void onData(List<int> event)?,
      {Function? onError, void onDone()?, bool? cancelOnError}) {
    throw "";
  }
}

class StdoutMock implements Stdout {
  Never noSuchMethod(Invocation i) => throw "";
}

Future<Null> ioOverridesRunTest() async {
  StdoutMock stdoutMock = StdoutMock();
  StdoutMock stderrMock = StdoutMock();

  Future<Null> f = IOOverrides.runZoned(
    () async {
      Expect.isTrue(new Directory("directory") is DirectoryMock);
      Expect.isTrue(Directory.current is DirectoryMock);
      Expect.isTrue(Directory.systemTemp is DirectoryMock);
      Expect.isTrue(new File("file") is FileMock);
      Expect.isTrue(await FileStat.stat("file") is FileStatMock);
      Expect.isTrue(FileStat.statSync("file") is FileStatMock);
      Expect.isFalse(await FileSystemEntity.identical("file", "file"));
      Expect.isFalse(FileSystemEntity.identicalSync("file", "file"));
      Expect.equals(
          await FileSystemEntity.type("file"), FileSystemEntityType.file);
      Expect.equals(
          FileSystemEntity.typeSync("file"), FileSystemEntityType.file);
      Expect.isFalse(FileSystemEntity.isWatchSupported);
      Expect.identical(
          _mockFileSystemEvent, new Directory("directory").watch());
      Expect.isTrue(new Link("link") is LinkMock);
      asyncExpectThrows(Socket.connect(null, 0));
      asyncExpectThrows(Socket.startConnect(null, 0));
      asyncExpectThrows(ServerSocket.bind(null, 0));
      Expect.isTrue(stdin is StdinMock);
      Expect.identical(stdout, stdoutMock);
      Expect.identical(stderr, stderrMock);
    },
    createDirectory: DirectoryMock.createDirectory,
    getCurrentDirectory: DirectoryMock.getCurrent,
    setCurrentDirectory: DirectoryMock.setCurrent,
    getSystemTempDirectory: DirectoryMock.getSystemTemp,
    createFile: FileMock.createFile,
    stat: FileStatMock.stat,
    statSync: FileStatMock.statSync,
    fseIdentical: FileSystemEntityMock.identical,
    fseIdenticalSync: FileSystemEntityMock.identicalSync,
    fseGetType: FileSystemEntityMock.getType,
    fseGetTypeSync: FileSystemEntityMock.getTypeSync,
    fsWatch: FileSystemWatcherMock.watch,
    fsWatchIsSupported: FileSystemWatcherMock.watchSupported,
    createLink: LinkMock.createLink,
    socketConnect: socketConnect,
    socketStartConnect: socketStartConnect,
    serverSocketBind: serverSocketBind,
    stdin: () => StdinMock(),
    stdout: () => stdoutMock,
    stderr: () => stderrMock,
  );
  Expect.isFalse(new Directory("directory") is DirectoryMock);
  Expect.isTrue(new Directory("directory") is Directory);
  await f;
}

class MyIOOverrides extends IOOverrides {
  Directory createDirectory(String path) => DirectoryMock.createDirectory(path);
}

globalIOOverridesTest() {
  IOOverrides.global = new MyIOOverrides();
  Expect.isTrue(new Directory("directory") is DirectoryMock);
  IOOverrides.global = null;
  Directory dir = new Directory("directory");
  Expect.isTrue(dir is! DirectoryMock);
  Expect.isTrue(dir is Directory);
}

globalIOOverridesZoneTest() {
  IOOverrides.global = new MyIOOverrides();
  runZoned(() {
    runZoned(() {
      Expect.isTrue(new Directory("directory") is DirectoryMock);
    });
  });
  IOOverrides.global = null;
  Directory dir = new Directory("directory");
  Expect.isTrue(dir is! DirectoryMock);
  Expect.isTrue(dir is Directory);
}

main() async {
  await ioOverridesRunTest();
  globalIOOverridesTest();
  globalIOOverridesZoneTest();
}
