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

// @dart = 2.9

import 'package:front_end/src/api_prototype/file_system.dart';
import 'package:front_end/src/scheme_based_file_system.dart';

import 'package:test/test.dart';

main() {
  test('lookup of registered schemes is handled', () {
    var fs1 = new MockFileSystem('scheme1');
    var fs2 = new MockFileSystem('scheme2');
    var fileSystem =
        new SchemeBasedFileSystem({'scheme1': fs1, 'scheme2': fs2});

    MockFileSystemEntity e1 =
        fileSystem.entityForUri(Uri.parse('scheme1:a.dart'));
    MockFileSystemEntity e2 =
        fileSystem.entityForUri(Uri.parse('scheme2:a.dart'));
    expect(e1.fileSystem, fs1);
    expect(e2.fileSystem, fs2);
  });

  test('lookup of an unregistered scheme will throw', () {
    var fileSystem =
        new SchemeBasedFileSystem({'scheme1': new MockFileSystem('scheme1')});
    expect(() => fileSystem.entityForUri(Uri.parse('scheme2:a.dart')),
        throwsA((e) => e is FileSystemException));
  });
}

class MockFileSystem implements FileSystem {
  String scheme;
  MockFileSystem(this.scheme);

  @override
  FileSystemEntity entityForUri(Uri uri) {
    if (uri.scheme != scheme) throw "unsupported";
    return new MockFileSystemEntity(uri, this);
  }
}

class MockFileSystemEntity implements FileSystemEntity {
  final Uri uri;
  final FileSystem fileSystem;
  MockFileSystemEntity(this.uri, this.fileSystem);

  noSuchMethod(m) => super.noSuchMethod(m);
}
