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

// Test starting isolate with static functions (and toplevel ones, for sanity).

library static_function_test;
import 'dart:isolate';
import 'dart:async';
import 'static_function_lib.dart' as lib;
import '../../pkg/unittest/lib/unittest.dart';

void function(SendPort port) { port.send("TOP"); }
void _function(SendPort port) { port.send("_TOP"); }

// A closure created at top-level (not inside a method), but not by a top-level
// function declaration.
var staticClosure = (SendPort port) { port.send("WHAT?"); };

// An unnamed closure created inside a function.
get dynamicClosure => (SendPort port) { port.send("WHAT??"); };

// A named closure created inside a function.
get namedDynamicClosure {
  void foo(SendPort port) { port.send("WHAT FOO??"); };
  return foo;
}

class C {
  // Unnamed closure created during object initialization, but not inside
  // a method or constructor.
  final Function instanceClosure = (SendPort port) { port.send("C WHAT?"); };
  // Unnamed closure created during object initializer list evaluation.
  final Function constructorInitializerClosure;
  // Unnamed closure created inside constructor body.
  Function constructorBodyClosure;
  // Named closure created inside constructor body.
  Function namedConstructorBodyClosure;

  C() : constructorInitializerClosure =
            ((SendPort port) { port.send("Init?"); }) {
    constructorBodyClosure = (SendPort port) {
      port.send("bodyClosure?");
    };
    void foo(SendPort port) {
      port.send("namedBodyClosure?");
    }
    namedConstructorBodyClosure = foo;
  }

  static void function(SendPort port) { port.send("YES"); }
  static void _function(SendPort port) { port.send("PRIVATE"); }
  void instanceMethod(SendPort port) { port.send("INSTANCE WHAT?"); }
}

class _C {
  static void function(SendPort port) { port.send("_YES"); }
  static void _function(SendPort port) { port.send("_PRIVATE"); }
}

void spawnTest(name, function, response) {
  test(name, () {
    ReceivePort r = new ReceivePort();
      Isolate.spawn(function, r.sendPort);
      r.listen(expectAsync1((v) {
        expect(v, response);
        r.close();
      }));
  });
}

void throwsTest(name, function) {
  test("throws on $name", () {
    expect(() { Isolate.spawn(function, null); }, throws);
  });
}

void main() {
  // Sanity check.
  spawnTest("function", function, "TOP");
  spawnTest("_function", _function, "_TOP");
  spawnTest("lib.function", lib.function, "LIBTOP");
  spawnTest("lib._function", lib.privateFunction, "_LIBTOP");

  // Local static functions.
  spawnTest("class.function", C.function, "YES");
  spawnTest("class._function", C._function, "PRIVATE");
  spawnTest("_class._function", _C.function, "_YES");
  spawnTest("_class._function", _C._function, "_PRIVATE");

  // Imported static functions.
  spawnTest("lib.class.function", lib.C.function, "LIB");
  spawnTest("lib.class._function", lib.C.privateFunction, "LIBPRIVATE");
  spawnTest("lib._class._function", lib.privateClassFunction, "_LIB");
  spawnTest("lib._class._function", lib.privateClassAndFunction, "_LIBPRIVATE");

  // Negative tests
  throwsTest("static closure", staticClosure);
  throwsTest("dynamic closure", dynamicClosure);
  throwsTest("named dynamic closure", namedDynamicClosure);
  throwsTest("instance closure", new C().instanceClosure);
  throwsTest("initializer closure", new C().constructorInitializerClosure);
  throwsTest("constructor closure", new C().constructorBodyClosure);
  throwsTest("named constructor closure", new C().namedConstructorBodyClosure);
  throwsTest("instance method", new C().instanceMethod);
}
