// 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 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:file/src/interface/file.dart';
import 'package:test/test.dart';

void main() {
  test('Read operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.read) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final File file = fs.file('test')..createSync();

    await file.readAsBytes();
    file.readAsBytesSync();
    await file.readAsString();
    file.readAsStringSync();

    expect(contexts, <String>['test', 'test', 'test', 'test']);
    expect(operations, <FileSystemOp>[
      FileSystemOp.read,
      FileSystemOp.read,
      FileSystemOp.read,
      FileSystemOp.read
    ]);
  });

  test('Write operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.write) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final File file = fs.file('test')..createSync();

    await file.writeAsBytes(<int>[]);
    file.writeAsBytesSync(<int>[]);
    await file.writeAsString('');
    file.writeAsStringSync('');

    expect(contexts, <String>['test', 'test', 'test', 'test']);
    expect(operations, <FileSystemOp>[
      FileSystemOp.write,
      FileSystemOp.write,
      FileSystemOp.write,
      FileSystemOp.write
    ]);
  });

  test('Delete operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.delete) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final File file = fs.file('test')..createSync();
    final Directory directory = fs.directory('testDir')..createSync();
    final Link link = fs.link('testLink')..createSync('foo');

    await file.delete();
    file.createSync();
    file.deleteSync();

    await directory.delete();
    directory.createSync();
    directory.deleteSync();

    await link.delete();
    link.createSync('foo');
    link.deleteSync();

    expect(contexts,
        <String>['test', 'test', 'testDir', 'testDir', 'testLink', 'testLink']);
    expect(operations, <FileSystemOp>[
      FileSystemOp.delete,
      FileSystemOp.delete,
      FileSystemOp.delete,
      FileSystemOp.delete,
      FileSystemOp.delete,
      FileSystemOp.delete,
    ]);
  });

  test('Create operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.create) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    fs.file('testA').createSync();
    await fs.file('testB').create();
    fs.directory('testDirA').createSync();
    await fs.directory('testDirB').create();
    fs.link('testLinkA').createSync('foo');
    await fs.link('testLinkB').create('foo');
    fs.currentDirectory.createTempSync('tmp.bar');
    await fs.currentDirectory.createTemp('tmp.bar');

    expect(contexts, <dynamic>[
      'testA',
      'testB',
      'testDirA',
      'testDirB',
      'testLinkA',
      'testLinkB',
      startsWith('/tmp.bar'),
      startsWith('/tmp.bar'),
    ]);
    expect(operations, <FileSystemOp>[
      FileSystemOp.create,
      FileSystemOp.create,
      FileSystemOp.create,
      FileSystemOp.create,
      FileSystemOp.create,
      FileSystemOp.create,
      FileSystemOp.create,
      FileSystemOp.create,
    ]);
  });

  test('Open operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.open) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final File file = fs.file('test')..createSync();

    await file.open();
    file.openSync();
    file.openRead();
    file.openWrite();

    expect(contexts, <String>['test', 'test', 'test', 'test']);
    expect(operations, <FileSystemOp>[
      FileSystemOp.open,
      FileSystemOp.open,
      FileSystemOp.open,
      FileSystemOp.open,
    ]);
  });

  test('Copy operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.copy) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final File file = fs.file('test')..createSync();

    await file.copy('A');
    file.copySync('B');

    expect(contexts, <String>['test', 'test']);
    expect(operations, <FileSystemOp>[
      FileSystemOp.copy,
      FileSystemOp.copy,
    ]);
  });

  test('Exists operations invoke opHandle', () async {
    List<String> contexts = <String>[];
    List<FileSystemOp> operations = <FileSystemOp>[];
    MemoryFileSystem fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.exists) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    fs.file('testA').existsSync();
    await fs.file('testB').exists();
    fs.directory('testDirA').existsSync();
    await fs.directory('testDirB').exists();
    fs.link('testLinkA').existsSync();
    await fs.link('testLinkB').exists();

    expect(contexts, <dynamic>[
      'testA',
      'testB',
      'testDirA',
      'testDirB',
      'testLinkA',
      'testLinkB',
    ]);
    expect(operations, <FileSystemOp>[
      FileSystemOp.exists,
      FileSystemOp.exists,
      FileSystemOp.exists,
      FileSystemOp.exists,
      FileSystemOp.exists,
      FileSystemOp.exists,
    ]);
  });

  test('FileSystemOp toString', () {
    expect(FileSystemOp.create.toString(), 'FileSystemOp.create');
    expect(FileSystemOp.delete.toString(), 'FileSystemOp.delete');
    expect(FileSystemOp.read.toString(), 'FileSystemOp.read');
    expect(FileSystemOp.write.toString(), 'FileSystemOp.write');
    expect(FileSystemOp.exists.toString(), 'FileSystemOp.exists');
  });
}
