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

library test.method_location;

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

part 'method_mirror_location_other.dart';

// We only check for a suffix of the uri because the test might be run from
// any number of absolute paths.
expectLocation(Mirror mirror, String uriSuffix, int line, int column) {
  MethodMirror methodMirror;
  if (mirror is ClosureMirror) {
    methodMirror = mirror.function;
  } else {
    methodMirror = mirror as MethodMirror;
  }
  Expect.isTrue(methodMirror is MethodMirror);
  final location = methodMirror.location;
  final 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");
}

class ClassInMainFile {

  ClassInMainFile();

  method() {}
}

void topLevelInMainFile() {}
  spaceIdentedInMainFile() {}
	tabIdentedInMainFile() {}

class HasImplicitConstructor {}

typedef bool Predicate(num n);

main() {
  localFunction(x) {
    return x;
  }

  String mainSuffix = 'method_mirror_location_test.dart';
  String otherSuffix = 'method_mirror_location_other.dart';

  // This file.
  expectLocation(reflectClass(ClassInMainFile).declarations[#ClassInMainFile],
      mainSuffix, 31, 3);
  expectLocation(
      reflectClass(ClassInMainFile).declarations[#method], mainSuffix, 33, 3);
  expectLocation(reflect(topLevelInMainFile), mainSuffix, 36, 1);
  expectLocation(reflect(spaceIdentedInMainFile), mainSuffix, 37, 3);
  expectLocation(reflect(tabIdentedInMainFile), mainSuffix, 38, 2);
  expectLocation(reflect(localFunction), mainSuffix, 45, 3);

  // Another part.
  expectLocation(reflectClass(ClassInOtherFile).declarations[#ClassInOtherFile],
      otherSuffix, 8, 3);
  expectLocation(
      reflectClass(ClassInOtherFile).declarations[#method], otherSuffix, 10, 3);
  expectLocation(reflect(topLevelInOtherFile), otherSuffix, 13, 1);
  expectLocation(reflect(spaceIdentedInOtherFile), otherSuffix, 15, 3);
  expectLocation(reflect(tabIdentedInOtherFile), otherSuffix, 17, 2);

  // Synthetic methods.
  Expect.isNull(reflectClass(HasImplicitConstructor)
      .declarations[#HasImplicitConstructor]
      .location);
  Expect.isNull(
      (reflectType(Predicate) as TypedefMirror).referent.callMethod.location);
}
