// 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.
library test.class_location;

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

part 'class_mirror_location_other.dart';

class ClassInMainFile {}
  class SpaceIndentedInMainFile {}
	class TabIndentedInMainFile {}

abstract class AbstractClass {}
typedef bool Predicate(num n);

class M {}
class S {}
class MA extends S with M {}
class MA2 = S with M;

const metadata = 'metadata';

@metadata
class WithMetadata {}

enum Enum { RED, GREEN, BLUE }

@metadata
enum AnnotatedEnum { SALT, PEPPER }

// 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) {
  final location = mirror.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");
}

main() {
  String mainSuffix = 'class_mirror_location_test.dart';
  String otherSuffix = 'class_mirror_location_other.dart';

  // This file.
  expectLocation(reflectClass(ClassInMainFile), mainSuffix, 12, 1);
  expectLocation(reflectClass(SpaceIndentedInMainFile), mainSuffix, 13, 3);
  expectLocation(reflectClass(TabIndentedInMainFile), mainSuffix, 14, 2);
  expectLocation(reflectClass(AbstractClass), mainSuffix, 16, 1);
  expectLocation(reflectType(Predicate), mainSuffix, 17, 1);
  expectLocation(reflectClass(MA), mainSuffix, 21, 1);
  expectLocation(reflectClass(MA2), mainSuffix, 22, 1);
  expectLocation(reflectClass(WithMetadata), mainSuffix, 26, 1);
  expectLocation(reflectClass(Enum), mainSuffix, 29, 1);
  expectLocation(reflectClass(AnnotatedEnum), mainSuffix, 31, 1);

  // Another part.
  expectLocation(reflectClass(ClassInOtherFile), otherSuffix, 7, 1);
  expectLocation(reflectClass(SpaceIndentedInOtherFile), otherSuffix, 9, 3);
  expectLocation(reflectClass(TabIndentedInOtherFile), otherSuffix, 11, 2);

  // Synthetic classes.
  Expect.isNull(reflectClass(MA).superclass!.location);
  Expect.isNull((reflect(main) as ClosureMirror).type.location);
}
