// Copyright 2016 The Chromium Authors. 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:flutter_tools/src/dart/dependencies.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:test/test.dart';

import 'src/common.dart';
import 'src/context.dart';

void main() {
  group('DartDependencySetBuilder', () {
    final String dataPath = fs.path.join(
      getFlutterRoot(),
      'packages',
      'flutter_tools',
      'test',
      'data',
      'dart_dependencies_test',
    );

    testUsingContext('good', () {
      final String testPath = fs.path.join(dataPath, 'good');
      final String mainPath = fs.path.join(testPath, 'main.dart');
      final String packagesPath = fs.path.join(testPath, '.packages');
      final DartDependencySetBuilder builder =
          new DartDependencySetBuilder(mainPath, packagesPath);
      final Set<String> dependencies = builder.build();
      expect(dependencies.contains(canonicalizePath(mainPath)), isTrue);
      expect(dependencies.contains(canonicalizePath(fs.path.join(testPath, 'foo.dart'))), isTrue);
    });

    testUsingContext('syntax_error', () {
      final String testPath = fs.path.join(dataPath, 'syntax_error');
      final String mainPath = fs.path.join(testPath, 'main.dart');
      final String packagesPath = fs.path.join(testPath, '.packages');
      final DartDependencySetBuilder builder =
          new DartDependencySetBuilder(mainPath, packagesPath);
      try {
        builder.build();
        fail('expect an exception to be thrown.');
      } on DartDependencyException catch (error) {
        expect(error.toString(), contains('foo.dart: Expected a string literal'));
      }
    });

    testUsingContext('bad_path', () {
      final String testPath = fs.path.join(dataPath, 'bad_path');
      final String mainPath = fs.path.join(testPath, 'main.dart');
      final String packagesPath = fs.path.join(testPath, '.packages');
      final DartDependencySetBuilder builder =
          new DartDependencySetBuilder(mainPath, packagesPath);
      try {
        builder.build();
        fail('expect an exception to be thrown.');
      } on DartDependencyException catch (error) {
        expect(error.toString(), contains('amaze${fs.path.separator}and${fs.path.separator}astonish.dart'));
      }
    });

    testUsingContext('bad_package', () {
      final String testPath = fs.path.join(dataPath, 'bad_package');
      final String mainPath = fs.path.join(testPath, 'main.dart');
      final String packagesPath = fs.path.join(testPath, '.packages');
      final DartDependencySetBuilder builder =
          new DartDependencySetBuilder(mainPath, packagesPath);
      try {
        builder.build();
        fail('expect an exception to be thrown.');
      } on DartDependencyException catch (error) {
        expect(error.toString(), contains('rochambeau'));
        expect(error.toString(), contains('pubspec.yaml'));
      }
    });

    testUsingContext('does not change ASCII casing of path', () {
      final String testPath = fs.path.join(dataPath, 'asci_casing');
      final String mainPath = fs.path.join(testPath, 'main.dart');
      final String packagesPath = fs.path.join(testPath, '.packages');
      final DartDependencySetBuilder builder = new DartDependencySetBuilder(mainPath, packagesPath);
      final Set<String> deps = builder.build();
      expect(deps, contains(endsWith('This_Import_Has_fuNNy_casING.dart')));
    });

    testUsingContext('bad_import', () {
      final String testPath = fs.path.join(dataPath, 'bad_import');
      final String mainPath = fs.path.join(testPath, 'main.dart');
      final String packagesPath = fs.path.join(testPath, '.packages');
      final DartDependencySetBuilder builder =
          new DartDependencySetBuilder(mainPath, packagesPath);
      try {
        builder.build();
        fail('expect an exception to be thrown.');
      } on DartDependencyException catch (error) {
        expect(error.toString(), contains('Unable to parse URI'));
      }
    });
  });
}
