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

#include "testing/gtest/include/gtest/gtest.h"
#include "testing/js_embedder_test.h"

namespace {

const double kExpected0 = 6.0;
const double kExpected1 = 7.0;
const double kExpected2 = 8.0;

const wchar_t kScript0[] = L"fred = 6";
const wchar_t kScript1[] = L"fred = 7";
const wchar_t kScript2[] = L"fred = 8";

}  // namespace

class FXJSV8EmbedderTest : public JSEmbedderTest {
 public:
  void ExecuteInCurrentContext(const WideString& script) {
    FXJSErr error;
    int sts = engine()->Execute(script, &error);
    EXPECT_EQ(0, sts);
  }
  void CheckAssignmentInCurrentContext(double expected) {
    v8::Local<v8::Object> This = engine()->GetThisObj();
    v8::Local<v8::Value> fred = engine()->GetObjectProperty(This, L"fred");
    EXPECT_TRUE(fred->IsNumber());
    EXPECT_EQ(expected, engine()->ToDouble(fred));
  }
};

TEST_F(FXJSV8EmbedderTest, Getters) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  ExecuteInCurrentContext(WideString(kScript1));
  CheckAssignmentInCurrentContext(kExpected1);
}

TEST_F(FXJSV8EmbedderTest, MultipleEngines) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());

  CFXJS_Engine engine1(isolate());
  engine1.InitializeEngine();

  CFXJS_Engine engine2(isolate());
  engine2.InitializeEngine();

  v8::Local<v8::Context> context1 = engine1.GetV8Context();
  v8::Local<v8::Context> context2 = engine2.GetV8Context();

  v8::Context::Scope context_scope(GetV8Context());
  ExecuteInCurrentContext(WideString(kScript0));
  CheckAssignmentInCurrentContext(kExpected0);

  {
    v8::Context::Scope context_scope1(context1);
    ExecuteInCurrentContext(WideString(kScript1));
    CheckAssignmentInCurrentContext(kExpected1);
  }
  {
    v8::Context::Scope context_scope2(context2);
    ExecuteInCurrentContext(WideString(kScript2));
    CheckAssignmentInCurrentContext(kExpected2);
  }

  CheckAssignmentInCurrentContext(kExpected0);

  {
    v8::Context::Scope context_scope1(context1);
    CheckAssignmentInCurrentContext(kExpected1);
    {
      v8::Context::Scope context_scope2(context2);
      CheckAssignmentInCurrentContext(kExpected2);
    }
    CheckAssignmentInCurrentContext(kExpected1);
  }
  {
    v8::Context::Scope context_scope2(context2);
    CheckAssignmentInCurrentContext(kExpected2);
    {
      v8::Context::Scope context_scope1(context1);
      CheckAssignmentInCurrentContext(kExpected1);
    }
    CheckAssignmentInCurrentContext(kExpected2);
  }

  CheckAssignmentInCurrentContext(kExpected0);

  engine1.ReleaseEngine();
  engine2.ReleaseEngine();
}

TEST_F(FXJSV8EmbedderTest, EmptyLocal) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  v8::Local<v8::Value> empty;
  EXPECT_FALSE(engine()->ToBoolean(empty));
  EXPECT_EQ(0, engine()->ToInt32(empty));
  EXPECT_EQ(0.0, engine()->ToDouble(empty));
  EXPECT_EQ(L"", engine()->ToWideString(empty));
  EXPECT_TRUE(engine()->ToObject(empty).IsEmpty());
  EXPECT_TRUE(engine()->ToArray(empty).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewNull) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto nullz = engine()->NewNull();
  EXPECT_FALSE(engine()->ToBoolean(nullz));
  EXPECT_EQ(0, engine()->ToInt32(nullz));
  EXPECT_EQ(0.0, engine()->ToDouble(nullz));
  EXPECT_EQ(L"null", engine()->ToWideString(nullz));
  EXPECT_TRUE(engine()->ToObject(nullz).IsEmpty());
  EXPECT_TRUE(engine()->ToArray(nullz).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewUndefined) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto undef = engine()->NewUndefined();
  EXPECT_FALSE(engine()->ToBoolean(undef));
  EXPECT_EQ(0, engine()->ToInt32(undef));
  EXPECT_TRUE(std::isnan(engine()->ToDouble(undef)));
  EXPECT_EQ(L"undefined", engine()->ToWideString(undef));
  EXPECT_TRUE(engine()->ToObject(undef).IsEmpty());
  EXPECT_TRUE(engine()->ToArray(undef).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewBoolean) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto boolz = engine()->NewBoolean(true);
  EXPECT_TRUE(engine()->ToBoolean(boolz));
  EXPECT_EQ(1, engine()->ToInt32(boolz));
  EXPECT_EQ(1.0, engine()->ToDouble(boolz));
  EXPECT_EQ(L"true", engine()->ToWideString(boolz));
  EXPECT_TRUE(engine()->ToObject(boolz).IsEmpty());
  EXPECT_TRUE(engine()->ToArray(boolz).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewNumber) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto num = engine()->NewNumber(42.1);
  EXPECT_TRUE(engine()->ToBoolean(num));
  EXPECT_EQ(42, engine()->ToInt32(num));
  EXPECT_EQ(42.1, engine()->ToDouble(num));
  EXPECT_EQ(L"42.1", engine()->ToWideString(num));
  EXPECT_TRUE(engine()->ToObject(num).IsEmpty());
  EXPECT_TRUE(engine()->ToArray(num).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewString) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto str = engine()->NewString(L"123");
  EXPECT_TRUE(engine()->ToBoolean(str));
  EXPECT_EQ(123, engine()->ToInt32(str));
  EXPECT_EQ(123, engine()->ToDouble(str));
  EXPECT_EQ(L"123", engine()->ToWideString(str));
  EXPECT_TRUE(engine()->ToObject(str).IsEmpty());
  EXPECT_TRUE(engine()->ToArray(str).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewDate) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto date = engine()->NewDate(1111111111);
  EXPECT_TRUE(engine()->ToBoolean(date));
  EXPECT_EQ(1111111111, engine()->ToInt32(date));
  EXPECT_EQ(1111111111.0, engine()->ToDouble(date));
  EXPECT_NE(L"", engine()->ToWideString(date));  // exact format varies.
  EXPECT_TRUE(engine()->ToObject(date)->IsObject());
  EXPECT_TRUE(engine()->ToArray(date).IsEmpty());
}

TEST_F(FXJSV8EmbedderTest, NewArray) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto array = engine()->NewArray();
  EXPECT_EQ(0u, engine()->GetArrayLength(array));
  EXPECT_FALSE(engine()->GetArrayElement(array, 2).IsEmpty());
  EXPECT_TRUE(engine()->GetArrayElement(array, 2)->IsUndefined());
  EXPECT_EQ(0u, engine()->GetArrayLength(array));

  engine()->PutArrayElement(array, 3, engine()->NewNumber(12));
  EXPECT_FALSE(engine()->GetArrayElement(array, 2).IsEmpty());
  EXPECT_TRUE(engine()->GetArrayElement(array, 2)->IsUndefined());
  EXPECT_FALSE(engine()->GetArrayElement(array, 3).IsEmpty());
  EXPECT_TRUE(engine()->GetArrayElement(array, 3)->IsNumber());
  EXPECT_EQ(4u, engine()->GetArrayLength(array));

  EXPECT_TRUE(engine()->ToBoolean(array));
  EXPECT_EQ(0, engine()->ToInt32(array));
  double d = engine()->ToDouble(array);
  EXPECT_NE(d, d);  // i.e. NaN.
  EXPECT_EQ(L",,,12", engine()->ToWideString(array));
  EXPECT_TRUE(engine()->ToObject(array)->IsObject());
  EXPECT_TRUE(engine()->ToArray(array)->IsArray());
}

TEST_F(FXJSV8EmbedderTest, NewObject) {
  v8::Isolate::Scope isolate_scope(isolate());
  v8::HandleScope handle_scope(isolate());
  v8::Context::Scope context_scope(GetV8Context());

  auto object = engine()->NewObject();
  ASSERT_FALSE(object.IsEmpty());
  EXPECT_EQ(0u, engine()->GetObjectPropertyNames(object).size());
  EXPECT_FALSE(engine()->GetObjectProperty(object, L"clams").IsEmpty());
  EXPECT_TRUE(engine()->GetObjectProperty(object, L"clams")->IsUndefined());
  EXPECT_EQ(0u, engine()->GetObjectPropertyNames(object).size());

  engine()->PutObjectProperty(object, L"clams", engine()->NewNumber(12));
  EXPECT_FALSE(engine()->GetObjectProperty(object, L"clams").IsEmpty());
  EXPECT_TRUE(engine()->GetObjectProperty(object, L"clams")->IsNumber());
  EXPECT_EQ(1u, engine()->GetObjectPropertyNames(object).size());
  EXPECT_EQ(L"clams", engine()->GetObjectPropertyNames(object)[0]);

  EXPECT_TRUE(engine()->ToBoolean(object));
  EXPECT_EQ(0, engine()->ToInt32(object));
  double d = engine()->ToDouble(object);
  EXPECT_NE(d, d);  // i.e. NaN.
  EXPECT_EQ(L"[object Object]", engine()->ToWideString(object));
  EXPECT_TRUE(engine()->ToObject(object)->IsObject());
  EXPECT_TRUE(engine()->ToArray(object).IsEmpty());
}
