// Copyright 2018 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 "xfa/fxfa/fm2js/cxfa_fmexpression.h"

#include <memory>
#include <utility>

#include "core/fxcrt/cfx_widetextbuf.h"
#include "core/fxcrt/fx_string.h"
#include "testing/fxgc_unittest.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "v8/include/cppgc/heap.h"
#include "xfa/fxfa/fm2js/cxfa_fmlexer.h"
#include "xfa/fxfa/fm2js/cxfa_fmtojavascriptdepth.h"

class FMExpressionTest : public FXGCUnitTest {};
class FMCallExpressionTest : public FXGCUnitTest {};
class FMStringExpressionTest : public FXGCUnitTest {};

TEST_F(FMCallExpressionTest, more_than_32_arguments) {
  // Use sign as it has 3 object parameters at positions 0, 5, and 6.
  auto* exp = cppgc::MakeGarbageCollected<CXFA_FMIdentifierExpression>(
      heap()->GetAllocationHandle(), L"sign");

  std::vector<cppgc::Member<CXFA_FMSimpleExpression>> args;
  for (size_t i = 0; i < 50; i++) {
    args.push_back(cppgc::MakeGarbageCollected<CXFA_FMNullExpression>(
        heap()->GetAllocationHandle()));
  }
  CXFA_FMToJavaScriptDepth::Reset();
  auto* callExp = cppgc::MakeGarbageCollected<CXFA_FMCallExpression>(
      heap()->GetAllocationHandle(), exp, std::move(args), true);

  CFX_WideTextBuf js;
  callExp->ToJavaScript(&js, ReturnType::kInfered);

  // Generate the result javascript string.
  WideString result = L"sign(";
  for (size_t i = 0; i < 50; i++) {
    if (i > 0)
      result += L", ";

    result += L"pfm_rt.get_";
    // Object positions for sign() method.
    if (i == 0 || i == 5 || i == 6)
      result += L"jsobj(null)";
    else
      result += L"val(null)";
  }
  result += L")";

  EXPECT_EQ(result.AsStringView(), js.AsStringView());
}

TEST_F(FMStringExpressionTest, Empty) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;
  auto* exp = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), L"");
  exp->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_EQ(L"", accumulator.AsStringView());
}

TEST_F(FMStringExpressionTest, Short) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;
  auto* exp = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), L"a");
  exp->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_EQ(L"a", accumulator.AsStringView());
}

TEST_F(FMStringExpressionTest, Medium) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;
  auto* exp = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), L".abcd.");
  exp->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_EQ(L"\"abcd\"", accumulator.AsStringView());
}

TEST_F(FMStringExpressionTest, Long) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;
  std::vector<WideStringView::UnsignedType> vec(140000, L'A');
  auto* exp = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), WideString(WideStringView(vec)));
  exp->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_EQ(140000u, accumulator.GetLength());
}

TEST_F(FMStringExpressionTest, Quoted) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;
  auto* exp = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), L".Simon says \"\"run\"\".");
  exp->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_EQ(L"\"Simon says \\\"run\\\"\"", accumulator.AsStringView());
}

TEST_F(FMExpressionTest, VarExpressionInitNull) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;

  auto* expr = cppgc::MakeGarbageCollected<CXFA_FMVarExpression>(
      heap()->GetAllocationHandle(), L"s", nullptr);
  expr->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_STREQ(
      LR"***(var s = "";
)***",
      accumulator.MakeString().c_str());
}

TEST_F(FMExpressionTest, VarExpressionInitBlank) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;

  auto* init = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), LR"("")");
  auto* expr = cppgc::MakeGarbageCollected<CXFA_FMVarExpression>(
      heap()->GetAllocationHandle(), L"s", init);
  expr->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_STREQ(
      LR"***(var s = "";
s = pfm_rt.var_filter(s);
)***",
      accumulator.MakeString().c_str());
}

TEST_F(FMExpressionTest, VarExpressionInitString) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;

  auto* init = cppgc::MakeGarbageCollected<CXFA_FMStringExpression>(
      heap()->GetAllocationHandle(), LR"("foo")");
  auto* expr = cppgc::MakeGarbageCollected<CXFA_FMVarExpression>(
      heap()->GetAllocationHandle(), L"s", init);
  expr->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_STREQ(
      LR"***(var s = "foo";
s = pfm_rt.var_filter(s);
)***",
      accumulator.MakeString().c_str());
}

TEST_F(FMExpressionTest, VarExpressionInitNumeric) {
  CXFA_FMToJavaScriptDepth::Reset();
  CFX_WideTextBuf accumulator;

  auto* init = cppgc::MakeGarbageCollected<CXFA_FMNumberExpression>(
      heap()->GetAllocationHandle(), L"112");
  auto* expr = cppgc::MakeGarbageCollected<CXFA_FMVarExpression>(
      heap()->GetAllocationHandle(), L"s", init);
  expr->ToJavaScript(&accumulator, ReturnType::kInfered);
  EXPECT_STREQ(
      LR"***(var s = 112;
s = pfm_rt.var_filter(s);
)***",
      accumulator.MakeString().c_str());
}
