// 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:io' as io;

import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:file/src/backends/memory/memory_random_access_file.dart';
import 'package:test/test.dart';

import 'common_tests.dart';

void main() {
  group('MemoryFileSystem unix style', () {
    late MemoryFileSystem fs;

    setUp(() {
      fs = MemoryFileSystem();
    });

    runCommonTests(() => fs);

    group('toString', () {
      test('File', () {
        expect(fs.file('/foo').toString(), "MemoryFile: '/foo'");
      });

      test('Directory', () {
        expect(fs.directory('/foo').toString(), "MemoryDirectory: '/foo'");
      });

      test('Link', () {
        expect(fs.link('/foo').toString(), "MemoryLink: '/foo'");
      });
    });
  });

  group('MemoryFileSystem windows style', () {
    late MemoryFileSystem fs;

    setUp(() {
      fs = MemoryFileSystem(style: FileSystemStyle.windows);
    });

    runCommonTests(
      () => fs,
      root: () => fs.style.root,
    );

    group('toString', () {
      test('File', () {
        expect(fs.file('C:\\foo').toString(), "MemoryFile: 'C:\\foo'");
      });

      test('Directory', () {
        expect(
            fs.directory('C:\\foo').toString(), "MemoryDirectory: 'C:\\foo'");
      });

      test('Link', () {
        expect(fs.link('C:\\foo').toString(), "MemoryLink: 'C:\\foo'");
      });
    });
  });

  test('MemoryFileSystem.test', () {
    final fs = MemoryFileSystem.test(); // creates root directory
    fs.file('/test1.txt').createSync(); // creates file
    fs.file('/test2.txt').createSync(); // creates file
    expect(fs.directory('/').statSync().modified, DateTime(2000, 1, 1, 0, 1));
    expect(
        fs.file('/test1.txt').statSync().modified, DateTime(2000, 1, 1, 0, 2));
    expect(
        fs.file('/test2.txt').statSync().modified, DateTime(2000, 1, 1, 0, 3));
    fs.file('/test1.txt').createSync();
    fs.file('/test2.txt').createSync();
    expect(fs.file('/test1.txt').statSync().modified,
        DateTime(2000, 1, 1, 0, 2)); // file already existed
    expect(fs.file('/test2.txt').statSync().modified,
        DateTime(2000, 1, 1, 0, 3)); // file already existed
    fs.file('/test1.txt').writeAsStringSync('test'); // touches file
    expect(
        fs.file('/test1.txt').statSync().modified, DateTime(2000, 1, 1, 0, 4));
    expect(fs.file('/test2.txt').statSync().modified,
        DateTime(2000, 1, 1, 0, 3)); // didn't touch it
    fs.file('/test1.txt').copySync(
        '/test2.txt'); // creates file, then mutates file (so time changes twice)
    expect(fs.file('/test1.txt').statSync().modified,
        DateTime(2000, 1, 1, 0, 4)); // didn't touch it
    expect(
        fs.file('/test2.txt').statSync().modified, DateTime(2000, 1, 1, 0, 6));
  });

  test('MemoryFile.openSync returns a MemoryRandomAccessFile', () async {
    final fs = MemoryFileSystem.test();
    final io.File file = fs.file('/test1')..createSync();

    var raf = file.openSync();
    try {
      expect(raf, isA<MemoryRandomAccessFile>());
    } finally {
      raf.closeSync();
    }

    raf = await file.open();
    try {
      expect(raf, isA<MemoryRandomAccessFile>());
    } finally {
      raf.closeSync();
    }
  });

  test('MemoryFileSystem.systemTempDirectory test', () {
    final fs = MemoryFileSystem.test();

    final io.Directory fooA = fs.systemTempDirectory.createTempSync('foo');
    final io.Directory fooB = fs.systemTempDirectory.createTempSync('foo');

    expect(fooA.path, '/.tmp_rand0/foorand0');
    expect(fooB.path, '/.tmp_rand0/foorand1');

    final secondFs = MemoryFileSystem.test();

    final io.Directory fooAA =
        secondFs.systemTempDirectory.createTempSync('foo');
    final io.Directory fooBB =
        secondFs.systemTempDirectory.createTempSync('foo');

    // Names are recycled with a new instance
    expect(fooAA.path, '/.tmp_rand0/foorand0');
    expect(fooBB.path, '/.tmp_rand0/foorand1');
  });

  test('Failed UTF8 decoding in MemoryFileSystem throws a FileSystemException',
      () {
    final fileSystem = MemoryFileSystem.test();
    final file = fileSystem.file('foo')
      ..writeAsBytesSync(<int>[0xFFFE]); // Invalid UTF8

    expect(file.readAsStringSync, throwsA(isA<FileSystemException>()));
  });

  test('Creating a temporary directory actually creates the directory', () {
    final fileSystem = MemoryFileSystem.test();
    final tempDir = fileSystem.currentDirectory.createTempSync('foo');

    expect(tempDir.existsSync(), true);
  });

  test(
      'addStream forwards error to returned future and file can still be '
      'closed', () async {
    final file = MemoryFileSystem.test().file('foo').openWrite();
    await expectLater(file.addStream(Stream.error('bar')), throwsA('bar'));
    await file.close();
  });

  test(
      'addStream cancels on error and does not misbehave if the stream '
      'produces multiple errors and then closes', () async {
    final file = MemoryFileSystem.test().file('foo').openWrite();
    final controller = StreamController<List<int>>()
      ..addError('bar')
      ..addError('baz');
    final close = controller.close();
    await expectLater(file.addStream(controller.stream), throwsA('bar'));
    await file.close();
    await close;
  });
}
