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

@TestOn('vm')

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

import 'package:path/path.dart' as p;
import 'package:term_glyph/term_glyph.dart' as term_glyph;
import 'package:test/test.dart';

import 'package:test_descriptor/test_descriptor.dart' as d;

import 'utils.dart';

void main() {
  group("create()", () {
    test("creates a directory and its contents", () async {
      await d.dir('dir', [
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents1'),
          d.file('subfile2.txt', 'subcontents2')
        ]),
        d.file('file1.txt', 'contents1'),
        d.file('file2.txt', 'contents2')
      ]).create();

      expect(File(p.join(d.sandbox, 'dir', 'file1.txt')).readAsString(),
          completion(equals('contents1')));
      expect(File(p.join(d.sandbox, 'dir', 'file2.txt')).readAsString(),
          completion(equals('contents2')));
      expect(
          File(p.join(d.sandbox, 'dir', 'subdir', 'subfile1.txt'))
              .readAsString(),
          completion(equals('subcontents1')));
      expect(
          File(p.join(d.sandbox, 'dir', 'subdir', 'subfile2.txt'))
              .readAsString(),
          completion(equals('subcontents2')));
    });

    test("works if the directory already exists", () async {
      await d.dir('dir').create();
      await d.dir('dir', [d.file('name.txt', 'contents')]).create();

      expect(File(p.join(d.sandbox, 'dir', 'name.txt')).readAsString(),
          completion(equals('contents')));
    });
  });

  group("validate()", () {
    test("completes successfully if the filesystem matches the descriptor",
        () async {
      var dirPath = p.join(d.sandbox, 'dir');
      var subdirPath = p.join(dirPath, 'subdir');
      await Directory(subdirPath).create(recursive: true);
      await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
      await File(p.join(dirPath, 'file2.txt')).writeAsString('contents2');
      await File(p.join(subdirPath, 'subfile1.txt'))
          .writeAsString('subcontents1');
      await File(p.join(subdirPath, 'subfile2.txt'))
          .writeAsString('subcontents2');

      await d.dir('dir', [
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents1'),
          d.file('subfile2.txt', 'subcontents2')
        ]),
        d.file('file1.txt', 'contents1'),
        d.file('file2.txt', 'contents2')
      ]).validate();
    });

    test("fails if the directory doesn't exist", () async {
      var dirPath = p.join(d.sandbox, 'dir');
      await Directory(dirPath).create();
      await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
      await File(p.join(dirPath, 'file2.txt')).writeAsString('contents2');

      expect(
          d.dir('dir', [
            d.dir('subdir', [
              d.file('subfile1.txt', 'subcontents1'),
              d.file('subfile2.txt', 'subcontents2')
            ]),
            d.file('file1.txt', 'contents1'),
            d.file('file2.txt', 'contents2')
          ]).validate(),
          throwsA(toString(
              equals('Directory not found: "${p.join('dir', 'subdir')}".'))));
    });

    test("emits an error for each child that fails to validate", () async {
      var dirPath = p.join(d.sandbox, 'dir');
      var subdirPath = p.join(dirPath, 'subdir');
      await Directory(subdirPath).create(recursive: true);
      await File(p.join(dirPath, 'file1.txt')).writeAsString('contents1');
      await File(p.join(subdirPath, 'subfile2.txt'))
          .writeAsString('subwrongtents2');

      var errors = 0;
      var controller = StreamController<String>();
      runZoned(() {
        d.dir('dir', [
          d.dir('subdir', [
            d.file('subfile1.txt', 'subcontents1'),
            d.file('subfile2.txt', 'subcontents2')
          ]),
          d.file('file1.txt', 'contents1'),
          d.file('file2.txt', 'contents2')
        ]).validate();
      },
          onError: expectAsync1((error) {
            errors++;
            controller.add(error.toString());
            if (errors == 3) controller.close();
          }, count: 3));

      expect(
          controller.stream.toList(),
          completion(allOf([
            contains(
                'File not found: "${p.join('dir', 'subdir', 'subfile1.txt')}".'),
            contains('File not found: "${p.join('dir', 'file2.txt')}".'),
            contains(
                startsWith('File "${p.join('dir', 'subdir', 'subfile2.txt')}" '
                    'should contain:')),
          ])));
    });
  });

  group("load()", () {
    test("loads a file", () {
      var dir = d.dir('dir',
          [d.file('name.txt', 'contents'), d.file('other.txt', 'wrong')]);
      expect(utf8.decodeStream(dir.load('name.txt')),
          completion(equals('contents')));
    });

    test("loads a deeply-nested file", () {
      var dir = d.dir('dir', [
        d.dir('subdir',
            [d.file('name.txt', 'subcontents'), d.file('other.txt', 'wrong')]),
        d.dir('otherdir', [d.file('other.txt', 'wrong')]),
        d.file('name.txt', 'contents')
      ]);

      expect(utf8.decodeStream(dir.load('subdir/name.txt')),
          completion(equals('subcontents')));
    });

    test("fails to load a nested directory", () {
      var dir = d.dir('dir', [
        d.dir('subdir', [
          d.dir('subsubdir', [d.file('name.txt', 'subcontents')])
        ]),
        d.file('name.txt', 'contents')
      ]);

      expect(
          dir.load('subdir/subsubdir').toList(),
          throwsA(toString(equals('Couldn\'t find a file descriptor named '
              '"subsubdir" within "dir/subdir".'))));
    });

    test("fails to load an absolute path", () {
      var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
      expect(() => dir.load('/name.txt'), throwsArgumentError);
    });

    test("fails to load '..'", () {
      var dir = d.dir('dir', [d.file('name.txt', 'contents')]);
      expect(() => dir.load('..'), throwsArgumentError);
    });

    test("fails to load a file that doesn't exist", () {
      var dir = d.dir('dir', [
        d.dir('subdir', [d.file('name.txt', 'contents')])
      ]);

      expect(
          dir.load('subdir/not-name.txt').toList(),
          throwsA(toString(equals('Couldn\'t find a file descriptor named '
              '"not-name.txt" within "dir/subdir".'))));
    });

    test("fails to load a file that exists multiple times", () {
      var dir = d.dir('dir', [
        d.dir('subdir',
            [d.file('name.txt', 'contents'), d.file('name.txt', 'contents')])
      ]);

      expect(
          dir.load('subdir/name.txt').toList(),
          throwsA(toString(equals('Found multiple file descriptors named '
              '"name.txt" within "dir/subdir".'))));
    });

    test("loads a file next to a subdirectory with the same name", () {
      var dir = d.dir('dir', [
        d.file('name', 'contents'),
        d.dir('name', [d.file('subfile', 'contents')])
      ]);

      expect(
          utf8.decodeStream(dir.load('name')), completion(equals('contents')));
    });
  });

  group("describe()", () {
    bool oldAscii;
    setUpAll(() {
      oldAscii = term_glyph.ascii;
      term_glyph.ascii = true;
    });

    tearDownAll(() {
      term_glyph.ascii = oldAscii;
    });

    test("lists the contents of the directory", () {
      var dir = d.dir('dir',
          [d.file('file1.txt', 'contents1'), d.file('file2.txt', 'contents2')]);

      expect(
          dir.describe(),
          equals("dir\n"
              "+-- file1.txt\n"
              "'-- file2.txt"));
    });

    test("lists the contents of nested directories", () {
      var dir = d.dir('dir', [
        d.file('file1.txt', 'contents1'),
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents1'),
          d.file('subfile2.txt', 'subcontents2'),
          d.dir('subsubdir', [d.file('subsubfile.txt', 'subsubcontents')])
        ]),
        d.file('file2.txt', 'contents2')
      ]);

      expect(
          dir.describe(),
          equals("dir\n"
              "+-- file1.txt\n"
              "+-- subdir\n"
              "|   +-- subfile1.txt\n"
              "|   +-- subfile2.txt\n"
              "|   '-- subsubdir\n"
              "|       '-- subsubfile.txt\n"
              "'-- file2.txt"));
    });

    test("with no contents returns the directory name", () {
      expect(d.dir('dir').describe(), equals('dir'));
    });
  });

  group("fromFilesystem()", () {
    test("creates a descriptor based on the physical filesystem", () async {
      var dir = d.dir('dir', [
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents1'),
          d.file('subfile2.txt', 'subcontents2')
        ]),
        d.file('file1.txt', 'contents1'),
        d.file('file2.txt', 'contents2')
      ]);

      await dir.create();
      var descriptor =
          d.DirectoryDescriptor.fromFilesystem("dir", p.join(d.sandbox, 'dir'));
      await descriptor.create(p.join(d.sandbox, 'dir2'));
      await dir.validate(p.join(d.sandbox, 'dir2'));
    });

    test("ignores hidden files", () async {
      await d.dir('dir', [
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents1'),
          d.file('.hidden', 'subcontents2')
        ]),
        d.file('file1.txt', 'contents1'),
        d.file('.DS_Store', 'contents2')
      ]).create();

      var descriptor = d.DirectoryDescriptor.fromFilesystem(
          "dir2", p.join(d.sandbox, 'dir'));
      await descriptor.create();

      await d.dir('dir2', [
        d.dir('subdir',
            [d.file('subfile1.txt', 'subcontents1'), d.nothing('.hidden')]),
        d.file('file1.txt', 'contents1'),
        d.nothing('.DS_Store')
      ]).validate();
    });
  });

  test("io refers to the directory within the sandbox", () {
    expect(d.file('dir').io.path, equals(p.join(d.sandbox, 'dir')));
  });
}
