// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_DEVELOPER_SHELL_JOSH_LIB_JS_TESTING_UTILS_H_
#define SRC_DEVELOPER_SHELL_JOSH_LIB_JS_TESTING_UTILS_H_

#include <zircon/status.h>
#include <zircon/types.h>

#include "src/developer/shell/josh/lib/runtime.h"
#include "third_party/quickjs/quickjs.h"

namespace shell {

// A class that supports running a test inside a quickjs context.
class JsTest : public ::testing::Test {
 protected:
  void SetUp() override {
    rt_ = std::make_unique<Runtime>();
    ASSERT_NE(nullptr, rt_.get()) << "Cannot allocate JS runtime";

    ctx_ = std::make_unique<Context>(rt_.get());
    ASSERT_NE(nullptr, ctx_.get()) << "Cannot allocate JS context";
    if (!ctx_->InitStd()) {
      ctx_->DumpError();
      FAIL();
    }
  }

  // Initializes shell-specific modules, including fidl, zx, and fdio.
  // |fidl_path| points to where you look for FIDL JSON IR.
  // |js_lib_path| points to where you look for system JS libs.
  void InitBuiltins(const std::string& fidl_path, const std::string& js_lib_path) {
    if (!ctx_->InitBuiltins(fidl_path, js_lib_path)) {
      ctx_->DumpError();
      FAIL();
    }
  }

  bool Eval(std::string command) {
    JSValue result = JS_Eval(ctx_->Get(), command.c_str(), command.length(), "batch", 0);
    if (JS_IsException(result)) {
      ctx_->DumpError();
      return false;
    }
    return true;
  }

  std::unique_ptr<Context> ctx_;
  std::unique_ptr<Runtime> rt_;
};

}  // namespace shell

#endif  // SRC_DEVELOPER_SHELL_JOSH_LIB_JS_TESTING_UTILS_H_
