1 // Copyright 2017 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/fpdfapi/page/cpdf_psengine.h"
6 #include "testing/gtest/include/gtest/gtest.h"
7
TEST(CPDF_PSProc,AddOperator)8 TEST(CPDF_PSProc, AddOperator) {
9 static const struct {
10 const char* name;
11 PDF_PSOP op;
12 } kTestData[] = {
13 {"add", PSOP_ADD}, {"sub", PSOP_SUB},
14 {"mul", PSOP_MUL}, {"div", PSOP_DIV},
15 {"idiv", PSOP_IDIV}, {"mod", PSOP_MOD},
16 {"neg", PSOP_NEG}, {"abs", PSOP_ABS},
17 {"ceiling", PSOP_CEILING}, {"floor", PSOP_FLOOR},
18 {"round", PSOP_ROUND}, {"truncate", PSOP_TRUNCATE},
19 {"sqrt", PSOP_SQRT}, {"sin", PSOP_SIN},
20 {"cos", PSOP_COS}, {"atan", PSOP_ATAN},
21 {"exp", PSOP_EXP}, {"ln", PSOP_LN},
22 {"log", PSOP_LOG}, {"cvi", PSOP_CVI},
23 {"cvr", PSOP_CVR}, {"eq", PSOP_EQ},
24 {"ne", PSOP_NE}, {"gt", PSOP_GT},
25 {"ge", PSOP_GE}, {"lt", PSOP_LT},
26 {"le", PSOP_LE}, {"and", PSOP_AND},
27 {"or", PSOP_OR}, {"xor", PSOP_XOR},
28 {"not", PSOP_NOT}, {"bitshift", PSOP_BITSHIFT},
29 {"true", PSOP_TRUE}, {"false", PSOP_FALSE},
30 {"if", PSOP_IF}, {"ifelse", PSOP_IFELSE},
31 {"pop", PSOP_POP}, {"exch", PSOP_EXCH},
32 {"dup", PSOP_DUP}, {"copy", PSOP_COPY},
33 {"index", PSOP_INDEX}, {"roll", PSOP_ROLL},
34 {"55", PSOP_CONST}, {"123.4", PSOP_CONST},
35 {"-5", PSOP_CONST}, {"invalid", PSOP_CONST},
36 };
37
38 CPDF_PSProc proc;
39 EXPECT_EQ(0U, proc.num_operators());
40 for (size_t i = 0; i < FX_ArraySize(kTestData); ++i) {
41 ByteStringView word(kTestData[i].name);
42 proc.AddOperatorForTesting(word);
43 ASSERT_EQ(i + 1, proc.num_operators());
44 const std::unique_ptr<CPDF_PSOP>& new_psop = proc.last_operator();
45 ASSERT_TRUE(new_psop);
46 PDF_PSOP new_op = new_psop->GetOp();
47 EXPECT_EQ(kTestData[i].op, new_op);
48 if (new_op == PSOP_CONST) {
49 float fv = new_psop->GetFloatValue();
50 if (word == "invalid")
51 EXPECT_FLOAT_EQ(0, fv);
52 else
53 EXPECT_EQ(word, ByteString::FormatFloat(fv));
54 }
55 }
56 }
57