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

library lock_file_test;

import 'dart:io';

import 'package:pathos/path.dart' as path;
import 'package:scheduled_test/scheduled_test.dart';

import '../lib/src/entrypoint.dart';
import '../lib/src/io.dart';
import '../lib/src/system_cache.dart';
import 'descriptor.dart' as d;
import 'test_pub.dart';

var root;
var entrypoint;

main() {
  initConfig();

  group('not in a git repo', () {
    setUp(() {
      d.appDir([]).create();
      scheduleEntrypoint();
    });


    integration('lists files recursively', () {
      d.dir(appPath, [
        d.file('file1.txt', 'contents'),
        d.file('file2.txt', 'contents'),
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents'),
          d.file('subfile2.txt', 'subcontents')
        ])
      ]).create();

      schedule(() {
        expect(entrypoint.packageFiles(), completion(unorderedEquals([
          path.join(root, 'pubspec.yaml'),
          path.join(root, 'file1.txt'),
          path.join(root, 'file2.txt'),
          path.join(root, 'subdir', 'subfile1.txt'),
          path.join(root, 'subdir', 'subfile2.txt')
        ])));
      });
    });

    commonTests();
  });

  group('with git', () {
    setUp(() {
      ensureGit();
      d.git(appPath, [d.appPubspec([])]).create();
      scheduleEntrypoint();
    });

    integration("includes files that are or aren't checked in", () {
      d.dir(appPath, [
        d.file('file1.txt', 'contents'),
        d.file('file2.txt', 'contents'),
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents'),
          d.file('subfile2.txt', 'subcontents')
        ])
      ]).create();

      schedule(() {
        expect(entrypoint.packageFiles(), completion(unorderedEquals([
          path.join(root, 'pubspec.yaml'),
          path.join(root, 'file1.txt'),
          path.join(root, 'file2.txt'),
          path.join(root, 'subdir', 'subfile1.txt'),
          path.join(root, 'subdir', 'subfile2.txt')
        ])));
      });
    });

    integration("ignores files that are gitignored", () {
      d.dir(appPath, [
        d.file('.gitignore', '*.txt'),
        d.file('file1.txt', 'contents'),
        d.file('file2.text', 'contents'),
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents'),
          d.file('subfile2.text', 'subcontents')
        ])
      ]).create();

      schedule(() {
        expect(entrypoint.packageFiles(), completion(unorderedEquals([
          path.join(root, 'pubspec.yaml'),
          path.join(root, '.gitignore'),
          path.join(root, 'file2.text'),
          path.join(root, 'subdir', 'subfile2.text')
        ])));
      });
    });

    commonTests();
  });
}

void scheduleEntrypoint() {
  schedule(() {
    root = path.join(sandboxDir, appPath);
    entrypoint = new Entrypoint(root, new SystemCache.withSources(root));
  }, 'initializing entrypoint');

  currentSchedule.onComplete.schedule(() {
    entrypoint = null;
  }, 'nulling entrypoint');
}

void commonTests() {
  integration('ignores broken symlinks', () {
    // Windows requires us to symlink to a directory that actually exists.
    d.dir(appPath, [d.dir('target')]).create();
    scheduleSymlink(path.join(appPath, 'target'), path.join(appPath, 'link'));
    schedule(() => deleteEntry(path.join(sandboxDir, appPath, 'target')));

    schedule(() {
      expect(entrypoint.packageFiles(),
          completion(equals([path.join(root, 'pubspec.yaml')])));
    });
  });

  integration('ignores pubspec.lock files', () {
    d.dir(appPath, [
      d.file('pubspec.lock'),
      d.dir('subdir', [d.file('pubspec.lock')])
    ]).create();

    schedule(() {
      expect(entrypoint.packageFiles(),
          completion(equals([path.join(root, 'pubspec.yaml')])));
    });
  });

  integration('ignores packages directories', () {
    d.dir(appPath, [
      d.dir('packages', [d.file('file.txt', 'contents')]),
      d.dir('subdir', [
        d.dir('packages', [d.file('subfile.txt', 'subcontents')]),
      ])
    ]).create();

    schedule(() {
      expect(entrypoint.packageFiles(),
          completion(equals([path.join(root, 'pubspec.yaml')])));
    });
  });

  integration('allows pubspec.lock directories', () {
    d.dir(appPath, [
      d.dir('pubspec.lock', [
        d.file('file.txt', 'contents'),
      ])
    ]).create();

    schedule(() {
      expect(entrypoint.packageFiles(), completion(unorderedEquals([
        path.join(root, 'pubspec.yaml'),
        path.join(root, 'pubspec.lock', 'file.txt')
      ])));
    });
  });

  group('and "beneath"', () {
    integration('only lists files beneath the given root', () {
      d.dir(appPath, [
        d.file('file1.txt', 'contents'),
        d.file('file2.txt', 'contents'),
        d.dir('subdir', [
          d.file('subfile1.txt', 'subcontents'),
          d.file('subfile2.txt', 'subcontents'),
          d.dir('subsubdir', [
            d.file('subsubfile1.txt', 'subsubcontents'),
            d.file('subsubfile2.txt', 'subsubcontents'),
          ])
        ])
      ]).create();

      schedule(() {
        expect(entrypoint.packageFiles(beneath: path.join(root, 'subdir')),
            completion(unorderedEquals([
          path.join(root, 'subdir', 'subfile1.txt'),
          path.join(root, 'subdir', 'subfile2.txt'),
          path.join(root, 'subdir', 'subsubdir', 'subsubfile1.txt'),
          path.join(root, 'subdir', 'subsubdir', 'subsubfile2.txt')
        ])));
      });
    });

    integration("doesn't care if the root is blacklisted", () {
      d.dir(appPath, [
        d.file('file1.txt', 'contents'),
        d.file('file2.txt', 'contents'),
        d.dir('packages', [
          d.file('subfile1.txt', 'subcontents'),
          d.file('subfile2.txt', 'subcontents'),
          d.dir('subsubdir', [
            d.file('subsubfile1.txt', 'subsubcontents'),
            d.file('subsubfile2.txt', 'subsubcontents')
          ])
        ])
      ]).create();

      schedule(() {
        expect(entrypoint.packageFiles(beneath: path.join(root, 'packages')),
            completion(unorderedEquals([
          path.join(root, 'packages', 'subfile1.txt'),
          path.join(root, 'packages', 'subfile2.txt'),
          path.join(root, 'packages', 'subsubdir', 'subsubfile1.txt'),
          path.join(root, 'packages', 'subsubdir', 'subsubfile2.txt')
        ])));
      });
    });
  });
}
