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

void main() {
  test('Read operations invoke opHandle', () async {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.read) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final 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 {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.write) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final 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 {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.delete) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final file = fs.file('test')..createSync();
    final directory = fs.directory('testDir')..createSync();
    final 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 {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var 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 {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.open) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final 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 {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var fs = MemoryFileSystem.test(
        opHandle: (String context, FileSystemOp operation) {
      if (operation == FileSystemOp.copy) {
        contexts.add(context);
        operations.add(operation);
      }
    });
    final 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 {
    var contexts = <String>[];
    var operations = <FileSystemOp>[];
    var 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');
  });
}
