// Copyright (c) 2018, 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:build_integration/file_system/single_root.dart';
import 'package:front_end/src/api_unstable/build_integration.dart';
import 'package:front_end/src/api_prototype/memory_file_system.dart';
import 'package:test/test.dart';

main() {
  var root = Uri.parse('org-dartlang-test:///');
  var fileSystem = SingleRootFileSystem(
      'single-root', root.resolve('A/B'), MemoryFileSystem(root));

  SingleRootFileSystemEntity entityOf(String uri) =>
      fileSystem.entityForUri(Uri.parse(uri)) as SingleRootFileSystemEntity;

  String effectiveUriOf(String uri) => '${entityOf(uri).delegate.uri}';

  test('root is normalized', () {
    expect(fileSystem.root.path, '/A/B/');
  });

  test('URIs with the marker scheme are converted', () {
    expect(effectiveUriOf('single-root:///a/b/1.dart'),
        'org-dartlang-test:///A/B/a/b/1.dart');
  });

  test('single-root expects absolute paths', () {
    expect(effectiveUriOf('single-root:///a/8.dart'),
        'org-dartlang-test:///A/B/a/8.dart');
    expect(effectiveUriOf('single-root:///../B/a/8.dart'),
        'org-dartlang-test:///A/B/B/a/8.dart');
  });

  test('URIs with other schemes are not supported', () {
    expect(() => entityOf('foo-root:///a/b/1.dart'),
        throwsA((e) => e is FileSystemException));

    // The scheme of the underlying file system is also not supported
    expect(() => entityOf('org-dartlang-test:///a/b/1.dart'),
        throwsA((e) => e is FileSystemException));
  });
}
