1/**
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <gtest/gtest.h>
17#include <algorithm>
18#include "macros.h"
19
20#include "assembler/assembly-program.h"
21#include "ir/astDump.h"
22#include "ir/expressions/literals/stringLiteral.h"
23
24#include "bytecode_optimizer/bytecodeopt_options.h"
25#include "compiler/compiler_logger.h"
26#include "mem/arena_allocator.h"
27#include "mem/pool_manager.h"
28#include "es2panda.h"
29#include "util/arktsconfig.h"
30#include "util/generateBin.h"
31#include "util/options.h"
32#include "libpandabase/mem/mem.h"
33#include "test/utils/panda_executable_path_getter.h"
34
35namespace {
36
37struct TestParams {
38    explicit TestParams(std::string_view testSrc, std::string testArgsList = std::string {},
39                        int testArgsCount = ARGS_COUNT_DEFAULT, std::string_view testFileName = FILE_NAME_DEFAULT)
40        : src {testSrc}, argsList {std::move(testArgsList)}, argsCount {testArgsCount}, fileName {testFileName}
41    {
42    }
43
44    // NOLINTBEGIN(misc-non-private-member-variables-in-classes)
45    std::string_view src;
46    std::string argsList;
47    int argsCount;
48    std::string_view fileName;
49
50    static constexpr int ARGS_COUNT_DEFAULT = 1;
51    static constexpr std::string_view FILE_NAME_DEFAULT = "dummy.sts";
52    // NOLINTEND(misc-non-private-member-variables-in-classes)
53};
54
55TestParams DumpJsonSimple()
56{
57    static constexpr std::string_view SRC =
58        "\
59        function main(args: String[]): int {\
60            let a: int = 2;\
61            let b: int = 3;\
62            return a + b;\
63        }";
64
65    return TestParams {SRC};
66}
67
68TestParams DumpJsonUTF16Char()
69{
70    static constexpr std::string_view SRC =
71        "\
72        function main(args: String[]): int {\
73            let a: char = c'\\uDBFF';\
74            let b: char = c'\\uDC00';\
75            console.log(a);\
76            console.log(b);\
77            return 0;\
78        }";
79
80    return TestParams {SRC};
81}
82
83TestParams DumpEtsSrcSimple()
84{
85    static constexpr std::string_view SRC =
86        "\
87        function main(args: String[]): int {\
88            let a: int = 2;\
89            let b: int = 3;\
90            return a + b;\
91        }";
92
93    auto es2pandaPath = test::utils::PandaExecutablePathGetter {}.Get();
94    auto argsList =
95        es2pandaPath +
96        "--extension=sts "
97        "--dump-ets-src-before-phases=\"plugins-after-parse:lambda-lowering:checker:plugins-after-check:generate-"
98        "ts-"
99        "declarations:op-assignment:tuple-lowering:union-property-access:plugins-after-lowering\"";
100
101    return TestParams {SRC, argsList};
102}
103
104}  // namespace
105
106class ASTDumperTest : public testing::TestWithParam<TestParams> {
107public:
108    ASTDumperTest()
109    {
110        constexpr auto COMPILER_SIZE = 268435456;
111
112        ark::mem::MemConfig::Initialize(0, 0, COMPILER_SIZE, 0, 0, 0);
113        ark::PoolManager::Initialize(ark::PoolType::MMAP);
114    }
115
116    ~ASTDumperTest() override
117    {
118        ark::PoolManager::Finalize();
119        ark::mem::MemConfig::Finalize();
120    };
121
122    static ark::pandasm::Program *GetProgram(std::string_view src, const char **argsList, int argsCount,
123                                             std::string_view fileName)
124    {
125        auto options = std::make_unique<ark::es2panda::util::Options>();
126        if (!options->Parse(argsCount, argsList)) {
127            std::cerr << options->ErrorMsg() << std::endl;
128            return nullptr;
129        }
130
131        ark::Logger::ComponentMask mask {};
132        mask.set(ark::Logger::Component::ES2PANDA);
133        ark::Logger::InitializeStdLogging(ark::Logger::LevelFromString(options->LogLevel()), mask);
134
135        ark::es2panda::Compiler compiler(options->Extension(), options->ThreadCount());
136        ark::es2panda::SourceFile input(fileName, src, options->ParseModule());
137
138        return compiler.Compile(input, *options);
139    }
140
141    NO_COPY_SEMANTIC(ASTDumperTest);
142    NO_MOVE_SEMANTIC(ASTDumperTest);
143};
144
145TEST_P(ASTDumperTest, CheckNoDump)
146{
147    auto param = GetParam();
148    if (param.argsList.empty()) {
149        param.argsList = test::utils::PandaExecutablePathGetter {}.Get();
150    }
151
152    auto argsListPtr = param.argsList.c_str();
153
154    auto program =
155        std::unique_ptr<ark::pandasm::Program> {GetProgram(param.src, &argsListPtr, param.argsCount, param.fileName)};
156    ASSERT(program);
157
158    auto dumpStr = program->JsonDump();
159    ASSERT(!dumpStr.empty());
160}
161
162INSTANTIATE_TEST_SUITE_P(ASTDumperTestParamList, ASTDumperTest,
163                         ::testing::Values(DumpJsonSimple(), DumpJsonUTF16Char(), DumpEtsSrcSimple()));
164