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

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

topLevel() => 1;
topLevelLocal() => () => 2;

class C {
  static klass() => 3;
  static klassLocal() => () => 4;
  instance() => 5;
  instanceLocal() => () => 6;
}

main() {
  var f = topLevel;
  Expect.equals(1, f());
  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);

  f = topLevelLocal();
  Expect.equals(2, f());
  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);

  f = C.klass;
  Expect.equals(3, f());
  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);

  f = C.klassLocal();
  Expect.equals(4, f());
  Expect.isTrue((reflect(f) as ClosureMirror).function.isStatic);

  f = new C().instance;
  Expect.equals(5, f());
  Expect.isFalse((reflect(f) as ClosureMirror).function.isStatic);

  f = new C().instanceLocal();
  Expect.equals(6, f());
  Expect.isFalse((reflect(f) as ClosureMirror).function.isStatic);
}
