// 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:io';
import 'dart:isolate';
import 'static_function_lib.dart' as lib;
import 'package:expect/async_helper.dart';
import 'package:expect/expect.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.
  late Function constructorBodyClosure;
  // Named closure created inside constructor body.
  late 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) {
  print(name);
  ReceivePort r = new ReceivePort();
  Isolate.spawn(function, r.sendPort);
  asyncStart();
  r.listen((v) {
    Expect.equals(v, response);
    r.close();
    asyncEnd();
  });
}

void functionFailTest(name, function) {
  print("throws on $name");
  asyncStart();
  Isolate.spawn(function, null).catchError((e) {
    /* do nothing */
    asyncEnd();
  });
}

void main([args, port]) {
  asyncStart();
  // 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");

  spawnTest("static closure", staticClosure, "WHAT?");
  spawnTest("dynamic closure", dynamicClosure, "WHAT??");
  spawnTest("named dynamic closure", namedDynamicClosure, "WHAT FOO??");
  spawnTest("instance closure", new C().instanceClosure, "C WHAT?");
  spawnTest(
    "initializer closure",
    new C().constructorInitializerClosure,
    "Init?",
  );
  spawnTest(
    "constructor closure",
    new C().constructorBodyClosure,
    "bodyClosure?",
  );
  spawnTest(
    "named constructor closure",
    new C().namedConstructorBodyClosure,
    "namedBodyClosure?",
  );
  spawnTest("instance method", new C().instanceMethod, "INSTANCE WHAT?");

  asyncEnd();
}
