Add some basic CPDF_PSEngine tests.

Fix some nits in CPDF_PSEngine.

BUG=pdfium:1164

Change-Id: Ie34c6889503b5b6ddc13a280db0bf7191c17a37c
Reviewed-on: https://pdfium-review.googlesource.com/c/45387
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/page/cpdf_psengine.cpp b/core/fpdfapi/page/cpdf_psengine.cpp
index 7fa8cd3..b1e32f8 100644
--- a/core/fpdfapi/page/cpdf_psengine.cpp
+++ b/core/fpdfapi/page/cpdf_psengine.cpp
@@ -173,9 +173,9 @@
     m_Operators.push_back(pdfium::MakeUnique<CPDF_PSOP>(FX_atof(word)));
 }
 
-CPDF_PSEngine::CPDF_PSEngine() : m_StackCount(0) {}
+CPDF_PSEngine::CPDF_PSEngine() = default;
 
-CPDF_PSEngine::~CPDF_PSEngine() {}
+CPDF_PSEngine::~CPDF_PSEngine() = default;
 
 void CPDF_PSEngine::Push(float v) {
   if (m_StackCount < kPSEngineStackSize)
diff --git a/core/fpdfapi/page/cpdf_psengine.h b/core/fpdfapi/page/cpdf_psengine.h
index 9cb1e1a..7e8e109 100644
--- a/core/fpdfapi/page/cpdf_psengine.h
+++ b/core/fpdfapi/page/cpdf_psengine.h
@@ -122,7 +122,7 @@
  private:
   static constexpr uint32_t kPSEngineStackSize = 100;
 
-  uint32_t m_StackCount;
+  uint32_t m_StackCount = 0;
   CPDF_PSProc m_MainProc;
   float m_Stack[kPSEngineStackSize];
 };
diff --git a/core/fpdfapi/page/cpdf_psengine_unittest.cpp b/core/fpdfapi/page/cpdf_psengine_unittest.cpp
index f966c3a..b853ff5 100644
--- a/core/fpdfapi/page/cpdf_psengine_unittest.cpp
+++ b/core/fpdfapi/page/cpdf_psengine_unittest.cpp
@@ -5,6 +5,29 @@
 #include "core/fpdfapi/page/cpdf_psengine.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace {
+
+float DoOperator1(CPDF_PSEngine* engine, float v1, PDF_PSOP op) {
+  EXPECT_EQ(0u, engine->GetStackSize());
+  engine->Push(v1);
+  engine->DoOperator(op);
+  float ret = engine->Pop();
+  EXPECT_EQ(0u, engine->GetStackSize());
+  return ret;
+}
+
+float DoOperator2(CPDF_PSEngine* engine, float v1, float v2, PDF_PSOP op) {
+  EXPECT_EQ(0u, engine->GetStackSize());
+  engine->Push(v1);
+  engine->Push(v2);
+  engine->DoOperator(op);
+  float ret = engine->Pop();
+  EXPECT_EQ(0u, engine->GetStackSize());
+  return ret;
+}
+
+}  // namespace
+
 TEST(CPDF_PSProc, AddOperator) {
   static const struct {
     const char* name;
@@ -54,3 +77,16 @@
     }
   }
 }
+
+TEST(CPDF_PSEngine, Basic) {
+  CPDF_PSEngine engine;
+
+  EXPECT_FLOAT_EQ(300.0f, DoOperator2(&engine, 100, 200, PSOP_ADD));
+  EXPECT_FLOAT_EQ(-50.0f, DoOperator2(&engine, 100, 150, PSOP_SUB));
+  EXPECT_FLOAT_EQ(600.0f, DoOperator2(&engine, 5, 120, PSOP_MUL));
+  EXPECT_FLOAT_EQ(1.5f, DoOperator2(&engine, 15, 10, PSOP_DIV));
+  EXPECT_FLOAT_EQ(1.0f, DoOperator2(&engine, 15, 10, PSOP_IDIV));
+  EXPECT_FLOAT_EQ(5.0f, DoOperator2(&engine, 15, 10, PSOP_MOD));
+  EXPECT_FLOAT_EQ(5.0f, DoOperator1(&engine, -5, PSOP_NEG));
+  EXPECT_FLOAT_EQ(5.0f, DoOperator1(&engine, -5, PSOP_ABS));
+}