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

// Note: the following comment is used by test.dart to additionally compile the
// other isolate's code.
// OtherScripts=deferred_loaded_lib.dart

import 'dart:isolate';
import 'dart:async';
import "package:expect/expect.dart";
import 'package:async_helper/async_helper.dart';

import "deferred_loaded_lib.dart" deferred as lib;

// In this test case we send an object created from a deferred library
// that is loaded in the child isolate but not the parent isolate. The
// parent isolate does not know about the type of this object and throws
// an unhandled exception.
funcChild(args) {
  var replyPort = args[0];
  // Deferred load a library, create an object from that library and send
  // it over to the parent isolate which has not yet loaded that library.
  lib.loadLibrary().then((_) {
    replyPort.send(new lib.FromChildIsolate());
  });
}

void helperFunction() {
  var receivePort = new ReceivePort();
  asyncStart();

  // Spawn an isolate using spawnFunction.
  Isolate.spawn(funcChild, [receivePort.sendPort]).then(
    (isolate) {
      receivePort.listen(
        (msg) {
          // We don't expect to receive any valid messages.
          Expect.fail("We don't expect to receive any valid messages");
          receivePort.close();
          asyncEnd();
        },
        onError: (e) {
          // We don't expect to receive any error messages, per spec listen
          // does not receive an error object.
          Expect.fail("We don't expect to receive any error messages");
          receivePort.close();
          asyncEnd();
        }
      );
    }
  );
}

main() {
  helperFunction(); /// 01: runtime error
}
