<!DOCTYPE html>
<html>

<!--
Copyright 2022 The IREE Authors

Licensed under the Apache License v2.0 with LLVM Exceptions.
See https://llvm.org/LICENSE.txt for license information.
SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-->

<head>
  <meta charset="utf-8" />
  <title>IREE Tests</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="/experimental/web/testing/ghost.svg" type="image/svg+xml">

  <style>
    .test-output {
      font-family: monospace;
      white-space: pre;
      overflow-x: scroll;
    }

    .stderr {
      color: red;
    }
  </style>

  <!-- https://getbootstrap.com/ for some webpage styling-->
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</head>

<body class="bg-dark bg-opacity-10">
  <div class="container p-2 mx-2">
    <div style="font-family: monospace;">
      Test name: <span id="test-name"></span>
      <br>
      Test output:
    </div>
    <div id="test-output" class="test-output border border-dark shadow-sm p-3 mb-3 bg-body rounded"></div>
  </div>

  <script>
    const testNameElement = document.getElementById("test-name");
    const testOutputElement = document.getElementById("test-output");

    const searchParams = new URLSearchParams(window.location.search);
    const testName = searchParams.get("testName");
    // Load test script from URL params. This is sketchy, so keep this test
    // page local. If hosting the tests somewhere, prefer to populate the list
    // of test sources statically.
    const sourceFile = searchParams.get("sourceFile");
    const workingDirectory = searchParams.get("workingDirectory");

    document.title = "IREE Tests - " + testName;
    testNameElement.innerText = testName;

    function parseListFromString(inputString) {
      // Remove opening and closing brackets.
      let listString = inputString.replace(/^\[/, '').replace(/\]$/,'');
      if (listString == "") { return []; }
      // Remove spaces after commas.
      listString = listString.replace(/\s*,\s*/g, ",");
      // Split into an array.
      return listString.split(',');
    }

    const args = parseListFromString(searchParams.get("args") || "");
    const requiredFiles = parseListFromString(searchParams.get("requiredFiles") || "");

    function handleMessageFromWorker(messageEvent) {
      const {messageType, payload} = messageEvent.data;

      if (messageType == "testResult") {
        // TODO(scotttodd): handle result (check in UI, pass/fail #s for suites)
        console.log("test result:", payload);
      } else if (messageType == "print") {
        const div = document.createElement("div");
        div.textContent = payload;
        testOutputElement.appendChild(div);
      } else if (messageType == "printErr") {
        const div = document.createElement("div");
        div.textContent = payload;
        div.classList.add("stderr");
        testOutputElement.appendChild(div);
      }
    }

    const testWorker = new Worker('test_worker.js', {name: 'IREE Test Worker'});
    testWorker.onmessage = handleMessageFromWorker;
    testWorker.postMessage({
      "messageType": "runTest",
      "payload": {
        "name": testName,
        "sourceFile": sourceFile,
        "workingDirectory": workingDirectory,
        "requiredFiles": requiredFiles,
        "args": args,
      },
    });
  </script>
</body>

</html>
