// Copyright (c) 2016, 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:analyzer/file_system/file_system.dart';
import 'package:analyzer/source/file_source.dart';
import 'package:analyzer/src/generated/java_engine_io.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(FileSourceTest);
  });
}

@reflectiveTest
class FileSourceTest with ResourceProviderMixin {
  void test_equals_false_differentFiles() {
    File file1 = getFile("/does/not/exist1.dart");
    File file2 = getFile("/does/not/exist2.dart");
    FileSource source1 = FileSource(file1);
    FileSource source2 = FileSource(file2);
    expect(source1 == source2, isFalse);
  }

  void test_equals_false_null() {
    File file = getFile("/does/not/exist1.dart");
    FileSource source1 = FileSource(file);
    expect(source1, isNotNull);
  }

  void test_equals_true() {
    File file1 = getFile("/does/not/exist.dart");
    File file2 = getFile("/does/not/exist.dart");
    FileSource source1 = FileSource(file1);
    FileSource source2 = FileSource(file2);
    expect(source1 == source2, isTrue);
  }

  void test_getFullName() {
    File file = getFile("/does/not/exist.dart");
    FileSource source = FileSource(file);
    expect(source.fullName, file.path);
  }

  void test_getShortName() {
    File file = getFile("/does/not/exist.dart");
    FileSource source = FileSource(file);
    expect(source.shortName, "exist.dart");
  }

  void test_hashCode() {
    File file1 = getFile("/does/not/exist.dart");
    File file2 = getFile("/does/not/exist.dart");
    FileSource source1 = FileSource(file1);
    FileSource source2 = FileSource(file2);
    expect(source2.hashCode, source1.hashCode);
  }

  void test_issue14500() {
    // see https://code.google.com/p/dart/issues/detail?id=14500
    FileSource source = FileSource(getFile("/some/packages/foo:bar.dart"));
    expect(source, isNotNull);
    expect(source.exists(), isFalse);
  }

  void test_resolveRelative_file_fileName() {
    if (OSUtilities.isWindows()) {
      // On Windows, the URI that is produced includes a drive letter,
      // which I believe is not consistent across all machines that might run
      // this test.
      return;
    }
    File file = getFile("/a/b/test.dart");
    FileSource source = FileSource(file);
    expect(source, isNotNull);
    Uri relative = resolveRelativeUri(source.uri, Uri.parse("lib.dart"));
    expect(relative, isNotNull);
    expect(relative.toString(), "file:///a/b/lib.dart");
  }

  void test_resolveRelative_file_filePath() {
    if (OSUtilities.isWindows()) {
      // On Windows, the URI that is produced includes a drive letter,
      // which I believe is not consistent across all machines that might run
      // this test.
      return;
    }
    File file = getFile("/a/b/test.dart");
    FileSource source = FileSource(file);
    expect(source, isNotNull);
    Uri relative = resolveRelativeUri(source.uri, Uri.parse("c/lib.dart"));
    expect(relative, isNotNull);
    expect(relative.toString(), "file:///a/b/c/lib.dart");
  }

  void test_resolveRelative_file_filePathWithParent() {
    if (OSUtilities.isWindows()) {
      // On Windows, the URI that is produced includes a drive letter, which I
      // believe is not consistent across all machines that might run this test.
      return;
    }
    File file = getFile("/a/b/test.dart");
    FileSource source = FileSource(file);
    expect(source, isNotNull);
    Uri relative = resolveRelativeUri(source.uri, Uri.parse("../c/lib.dart"));
    expect(relative, isNotNull);
    expect(relative.toString(), "file:///a/c/lib.dart");
  }

  void test_system() {
    File file = getFile("/does/not/exist.dart");
    FileSource source = FileSource(file, Uri.parse("dart:core"));
    expect(source, isNotNull);
    expect(source.fullName, file.path);
    expect(source.uri.toString(), 'dart:core');
  }
}
