<!DOCTYPE html>
<!--
  Copyright 2023 The Cobalt Authors. All Rights Reserved.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<head>
  <title>Cobalt WASM Basic Test</title>
  <script src='black_box_js_test_utils.js'></script>
</head>

<body>
  <script>
const fail = msg => {
  if (msg) {
    console.error(msg);
  }
  notReached();
};
const timeoutId = setTimeout(fail, 3000);
const success = () => {
  clearTimeout(timeoutId);
  onEndTest();
};

const Module = {};

const noop = () => {};
const wasmImports = {
  emscripten_notify_memory_growth: () => {
    if (!Module.asm || !Module.asm.memory) {
      return;
    }
    Module.HEAPU8 = new Uint8Array(Module.asm.memory.buffer);
  },
  fd_close: noop,
  fd_seek: noop,
  fd_write: noop,
  proc_exit: noop,
};
const importObject = {
  env: wasmImports,
  wasi_snapshot_preview1: wasmImports,
};

const stringFromHeap = stringPointer => {
  const heap = Module.HEAPU8;
  let endPointer = stringPointer;
  // Find null terminating character.
  while (heap[endPointer]) ++endPointer;
  return (new TextDecoder('utf8')).decode(heap.subarray(stringPointer, endPointer));
}

fetch('wasm_basic_test.wasm')
    .then(response => response.arrayBuffer())
    .then(bufferSource => WebAssembly.instantiate(bufferSource, importObject))
    .then(({instance}) => {
      Module.asm = instance.exports;
      wasmImports.emscripten_notify_memory_growth();
      assertEqual(3, Module.asm.add(1, 2));
      // Include space for null terminating byte.
      const helloStringPointer = Module.asm.malloc(7);
      Module.asm.getHello(helloStringPointer);
      assertEqual("Hello.", stringFromHeap(helloStringPointer));
      Module.asm.free(helloStringPointer);
      success();
    })
    .catch(fail);

setupFinished();
  </script>
</body>
