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

// VMOptions=--no-enable-fast-object-copy
// VMOptions=--enable-fast-object-copy

// Tests that sets of enums can be set through ports.
// https://github.com/dart-lang/sdk/issues/35626

library spawn_tests;

import "dart:isolate";
import "package:expect/expect.dart";

enum MyEnum { foo, bar, baz }

void sendSetOfEnums(SendPort port) {
  Set<MyEnum> remoteSet = Set()..add(MyEnum.bar);
  port.send(remoteSet);
}

void main() async {
  Set<MyEnum> localSet = Set()
    ..add(MyEnum.foo)
    ..add(MyEnum.bar);
  localSet.lookup(MyEnum.foo);

  final port = ReceivePort();
  await Isolate.spawn(sendSetOfEnums, port.sendPort);
  Set<MyEnum> remoteSet = await port.first;

  print(localSet);
  print(remoteSet);
  Expect.setEquals({MyEnum.bar}, localSet.intersection(remoteSet));
  Expect.setEquals({MyEnum.bar}, remoteSet.intersection(localSet));
}
