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

library test.declarations_location;

import "dart:mirrors";
import "package:expect/expect.dart";
import "library_without_declaration.dart";
import "library_with_annotated_declaration.dart";

const metadata = 'metadata';

class C<S, @metadata T> {
  var a;
  final b = 2;
  static var c;
  static final d = 4;
  @metadata
  var e;
  List<C> f;
}

// We only check for a suffix of the uri because the test might be run from
// any number of absolute paths.
expectLocation(
    DeclarationMirror mirror, String uriSuffix, int line, int column) {
  SourceLocation location = mirror.location;
  Uri uri = location.sourceUri;
  Expect.isTrue(
      uri.toString().endsWith(uriSuffix), "Expected suffix $uriSuffix in $uri");
  Expect.equals(line, location.line, "line");
  Expect.equals(column, location.column, "column");
}

main() {
  String mainSuffix = 'other_declarations_location_test.dart';

  // Fields.
  expectLocation(reflectClass(C).declarations[#a], mainSuffix, 15, 7);
  expectLocation(reflectClass(C).declarations[#b], mainSuffix, 16, 9);
  expectLocation(reflectClass(C).declarations[#c], mainSuffix, 17, 14);
  expectLocation(reflectClass(C).declarations[#d], mainSuffix, 18, 16);
  expectLocation(reflectClass(C).declarations[#e], mainSuffix, 20, 7);
  expectLocation(reflectClass(C).declarations[#f], mainSuffix, 21, 11);

  // Type variables.
  expectLocation(reflectClass(C).declarations[#S], mainSuffix, 14, 9);
  expectLocation(reflectClass(C).declarations[#T], mainSuffix, 14, 12);

  // Libraries.
  expectLocation(reflectClass(C).owner, mainSuffix, 5, 1);
  expectLocation(reflectClass(ClassInLibraryWithoutDeclaration).owner,
      "library_without_declaration.dart", 1, 1);
  expectLocation(reflectClass(ClassInLibraryWithAnnotatedDeclaration).owner,
      "library_with_annotated_declaration.dart", 5, 1);
}
