// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Flags: --shared-string-table --harmony-struct --allow-natives-syntax

"use strict";

if (this.Worker) {

(function TestSharedStructPostMessage() {
  let workerScript =
      `onmessage = function(struct) {
         struct.struct_field.payload = 42;
         struct.string_field = "worker";
         postMessage("done");
       };
       postMessage("started");`;

  let worker = new Worker(workerScript, { type: 'string' });
  let started = worker.getMessage();
  assertEquals("started", started);

  let OuterStruct = new SharedStructType(['string_field', 'struct_field']);
  let InnerStruct = new SharedStructType(['payload']);
  let struct = new OuterStruct();
  struct.struct_field = new InnerStruct();
  struct.string_field = "main";
  assertEquals("main", struct.string_field);
  assertEquals(undefined, struct.struct_field.payload);
  worker.postMessage(struct);
  assertEquals("done", worker.getMessage());
  assertEquals("worker", struct.string_field);
  assertEquals(42, struct.struct_field.payload);

  worker.terminate();
})();

(function TestObjectAssign() {
  function f() {
    const Struct = new SharedStructType(['field'])
    const shared_struct = new Struct();
    const obj = {'field': 1};
    Object.assign(shared_struct, obj);
    postMessage(shared_struct.field);
  }

  const worker = new Worker(f, {'type': 'function'});
  assertEquals(1, worker.getMessage());

  worker.terminate();
})();
}
