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

/// @assertion void addOnExitListener(
///                    SendPort responsePort, {
///                    Object response
///            })
/// ...
///   Adding the same port more than once will only cause it to receive one
/// message, using the last response value that was added.
///
/// @description Check that isolate sends single event on responsePort,
/// which is supplied several times to addOnExitListener() of the same isolate.
/// Different values for parameter response are specified. Check that only last
/// used value is used.
///
/// @author a.semenov@unipro.ru

import "dart:isolate";
import "dart:async";
import "dart:math";
import "../../../Utils/expect.dart";
import "IsolateUtil.dart";

Future test(List<Object?> values) async {
  ErrorServer server = await ErrorServer.spawn(errorsAreFatal:false);
  ReceivePort onExit = new ReceivePort();
  List events = [];
  onExit.listen(
    (data) {
      events.add(data);
    }
  );
  for (Object? value in values) {
    server.isolate.addOnExitListener(onExit.sendPort, response:value);
  }
  server.requestStop();
  await new Future.delayed(TWO_SECONDS); // wait for duplicate events
  onExit.close();
  Expect.listEquals([values.last], events);
}

main() {
  asyncStart();
  List<Object?> values = [
    null, true, false, "string", 10, 1.1, double.nan, double.infinity
  ];
  Random random = new Random();
  Future.wait([
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random))),
    test(new List.from(values..shuffle(random)))
  ]).then((_) => asyncEnd());
}
