De-duplicate some code in cfxjse_formcalc_context_embeddertest.cpp

Split off from https://pdfium-review.googlesource.com/c/pdfium/+/75950
since this can happen independently of any implementation.

Change-Id: I063e4c2e0d5139e59db2a458b68da2aa11403df0
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/76010
Reviewed-by: Daniel Hosseinian <dhoss@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp b/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp
index 545c3d8..ddd0eda 100644
--- a/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context_embeddertest.cpp
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "fxjs/fxv8.h"
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cfxjse_value.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -15,8 +16,62 @@
   ~CFXJSE_FormCalcContextEmbedderTest() override = default;
 
  protected:
-  bool ExecuteExpectNull(ByteStringView input) {
-    return Execute(input) && GetValue()->IsNull(isolate());
+  void ExecuteExpectError(ByteStringView input) {
+    EXPECT_FALSE(Execute(input)) << "Program: " << input;
+  }
+
+  void ExecuteExpectNull(ByteStringView input) {
+    EXPECT_TRUE(Execute(input)) << "Program: " << input;
+
+    CFXJSE_Value* value = GetValue();
+    EXPECT_TRUE(value->IsNull(isolate())) << "Program: " << input;
+  }
+
+  void ExecuteExpectBool(ByteStringView input, bool expected) {
+    EXPECT_TRUE(Execute(input)) << "Program: " << input;
+
+    CFXJSE_Value* value = GetValue();
+    // Yes, bools might be integers, somehow.
+    EXPECT_TRUE(value->IsBoolean(isolate()) || value->IsInteger(isolate()))
+        << "Program: " << input;
+    EXPECT_EQ(expected, value->ToBoolean(isolate())) << "Program: " << input;
+  }
+
+  void ExecuteExpectInt32(ByteStringView input, int32_t expected) {
+    EXPECT_TRUE(Execute(input)) << "Program: " << input;
+
+    CFXJSE_Value* value = GetValue();
+    EXPECT_TRUE(value->IsInteger(isolate())) << "Program: " << input;
+    EXPECT_EQ(expected, value->ToInteger(isolate())) << "Program: " << input;
+  }
+
+  void ExecuteExpectFloat(ByteStringView input, float expected) {
+    EXPECT_TRUE(Execute(input)) << "Program: " << input;
+
+    CFXJSE_Value* value = GetValue();
+    EXPECT_TRUE(value->IsNumber(isolate())) << "Program: " << input;
+    EXPECT_FLOAT_EQ(expected, value->ToFloat(isolate()))
+        << "Program: " << input;
+  }
+
+  void ExecuteExpectFloatNear(ByteStringView input,
+                              float expected,
+                              float precision) {
+    EXPECT_TRUE(Execute(input)) << "Program: " << input;
+
+    CFXJSE_Value* value = GetValue();
+    EXPECT_TRUE(value->IsNumber(isolate())) << "Program: " << input;
+    EXPECT_NEAR(expected, value->ToFloat(isolate()), precision)
+        << "Program: " << input;
+  }
+
+  void ExecuteExpectString(ByteStringView input, const char* expected) {
+    EXPECT_TRUE(Execute(input)) << "Program: " << input;
+
+    CFXJSE_Value* value = GetValue();
+    EXPECT_TRUE(value->IsString(isolate())) << "Program: " << input;
+    EXPECT_STREQ(expected, value->ToString(isolate()).c_str())
+        << "Program: " << input;
   }
 };
 
@@ -33,13 +88,7 @@
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, TranslateNumber) {
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
-
-  const char input[] = "123";
-  EXPECT_TRUE(Execute(input));
-
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsInteger(isolate()));
-  EXPECT_EQ(123, value->ToInteger(isolate())) << "Program: " << input;
+  ExecuteExpectInt32("123", 123);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Numeric) {
@@ -73,14 +122,8 @@
                 "endif",
                 0}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Strings) {
@@ -94,15 +137,8 @@
       {"concat(\"The total is \", 2, \" dollars and \", 57, \" cents.\")",
        "The total is 2 dollars and 57 cents."}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Booleans) {
@@ -135,14 +171,8 @@
                {"12 >= 12", true},
                {"\"true\" < \"false\"", false}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate())) << "Program: " << tests[i].program;
-    EXPECT_EQ(tests[i].result, value->ToBoolean(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectBool(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Abs) {
@@ -153,14 +183,8 @@
     float result;
   } tests[] = {{"Abs(1.03)", 1.03f}, {"Abs(-1.03)", 1.03f}, {"Abs(0)", 0.0f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Avg) {
@@ -171,14 +195,8 @@
     float result;
   } tests[] = {{"Avg(0, 32, 16)", 16.0f}, {"Avg(2.5, 17, null)", 9.75f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Ceil) {
@@ -189,14 +207,8 @@
     int result;
   } tests[] = {{"Ceil(2.5875)", 3}, {"Ceil(-5.9)", -5}, {"Ceil(\"abc\")", 0}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Count) {
@@ -207,14 +219,8 @@
     int result;
   } tests[] = {{"Count(\"Tony\", \"Blue\", 41)", 3}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Floor) {
@@ -227,14 +233,8 @@
                {"Floor(5.999965342)", 5},
                {"Floor(3.2 * 15)", 48}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Max) {
@@ -247,14 +247,8 @@
                {"Max(\"abc\", 15, \"Tony Blue\")", 15},
                {"Max(\"abc\")", 0}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Min) {
@@ -269,14 +263,8 @@
                // {"Min(\"abc\", 15, \"Tony Blue\")", 15},
                {"Min(\"abc\")", 0}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Mod) {
@@ -287,14 +275,8 @@
     int result;
   } tests[] = {{"Mod(64, -3)", 1}, {"Mod(-13, 3)", -1}, {"Mod(\"abc\", 2)", 0}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Round) {
@@ -308,14 +290,8 @@
                {"Round(8.9897, \"abc\")", 9.0f},
                {"Round(FV(400, 0.10/12, 30*12), 2)", 904195.17f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate())) << "Program: " << tests[i].program;
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Sum) {
@@ -328,14 +304,8 @@
                {"Sum(-2, 4, -6, 8)", 4},
                {"Sum(4, 16, \"abc\", 19)", 39}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 // TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_Date) {
@@ -347,7 +317,7 @@
 
 //   EXPECT_TRUE(Execute("Date()"));
 
-//   CFXJSE_Value* value = GetValue();
+//   v8::Local<v8::Value> value = GetValue();
 //   EXPECT_TRUE(value->IsNumber());
 //   EXPECT_EQ(days, value->ToInteger());
 // }
@@ -367,14 +337,8 @@
       {"Date2Num(\"1/3/00\", \"D/M/YY\") - Date2Num(\"1/2/00\", \"D/M/YY\")",
        29}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DateFmt) {
@@ -390,15 +354,8 @@
       // {"DateFmt(4, \"fr_FR\")", "EEE D' MMMM YYYY"}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, IsoDate2Num) {
@@ -413,14 +370,8 @@
                {"IsoDate2Num(\"19960315T20:20:20\")", 35138},
                {"IsoDate2Num(\"2000-03-01\") - IsoDate2Num(\"20000201\")", 29}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_IsoTime2Num) {
@@ -431,14 +382,8 @@
     int result;
   } tests[] = {{"IsoTime2Num(\"00:00:00Z\")", 1}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, LocalDateFmt) {
@@ -452,15 +397,8 @@
                {"LocalDateFmt(3, \"de_CH\")", "t. MMMM jjjj"},
                {"LocalDateFmt(4, \"fr_FR\")", "EEEE j MMMM aaaa"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_LocalTimeFmt) {
@@ -474,15 +412,8 @@
                {"LocalTimeFmt(3, \"de_CH\")", "HH:mm:ss z"},
                {"LocalTimeFmt(4, \"fr_FR\")", "HH' h 'mm z"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Num2Date) {
@@ -499,15 +430,8 @@
       //  "Jan 1, 1902"}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate())) << "Program: " << tests[i].program;
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_Num2GMTime) {
@@ -523,15 +447,8 @@
                {"Num2GMTime(43993001, TimeFmt(4, \"de_DE\"), \"de_DE\")",
                 "12.13 Uhr GMT"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 // TODO(dsinclair): Broken on Mac ...
@@ -543,15 +460,8 @@
     const char* result;
   } tests[] = {{"Num2Time(1, \"HH:MM:SS\")", "00:00:00"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 // TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_Time) {
@@ -562,7 +472,7 @@
 
 //   EXPECT_TRUE(Execute("Time()"));
 
-//   CFXJSE_Value* value = GetValue();
+//   v8::Local<v8::Value> value = GetValue();
 //   EXPECT_TRUE(value->IsInteger());
 //   EXPECT_EQ(tp.tv_sec * 1000L + tp.tv_usec / 1000, value->ToInteger())
 //       << "Program: Time()";
@@ -578,14 +488,8 @@
       // {"Time2Num(\"00:00:00 GMT\", \"HH:MM:SS Z\")", 1},
       {"Time2Num(\"13:13:13 GMT\", \"HH:MM:SS Z\", \"fr_FR\")", 47593001}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, TimeFmt) {
@@ -601,15 +505,8 @@
       // {"TimeFmt(4, \"de_DE\")", "H.MM' Uhr 'Z"}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Apr) {
@@ -621,14 +518,8 @@
   } tests[] = {{"Apr(35000, 269.50, 360)", 0.08515404566f},
                {"Apr(210000 * 0.75, 850 + 110, 25 * 26)", 0.07161332404f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_NEAR(tests[i].result, value->ToFloat(isolate()), 0.000001)
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloatNear(tests[i].program, tests[i].result, 0.000001);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, CTerm) {
@@ -643,14 +534,8 @@
       // {"CTerm(0.0275 + 0.0025, 1000000, 55000 * 0.10)", 176.02226044975f}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, FV) {
@@ -662,14 +547,8 @@
   } tests[] = {{"FV(400, 0.10 / 12, 30 * 12)", 904195.16991842445f},
                {"FV(1000, 0.075 / 4, 10 * 4)", 58791.96145535981f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, IPmt) {
@@ -682,14 +561,8 @@
                {"IPmt(160000, 0.0475, 980, 24, 12)", 7103.80833569485f},
                {"IPmt(15000, 0.065, 65.50, 15, 1)", 0.0f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, NPV) {
@@ -702,14 +575,8 @@
                {"NPV(0.10, 500, 1500, 4000, 10000)", 11529.60863329007f},
                {"NPV(0.0275 / 12, 50, 60, 40, 100, 25)", 273.14193838457f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate())) << "Program: " << tests[i].program;
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Pmt) {
@@ -721,14 +588,8 @@
   } tests[] = {// {"Pmt(150000, 0.0475 / 12, 25 * 12)", 855.17604207164f},
                {"Pmt(25000, 0.085, 12)", 3403.82145169876f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, PPmt) {
@@ -743,14 +604,8 @@
       // {"PPmt(15000, 0.065, 65.50, 15, 1)", 0.0f}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, PV) {
@@ -764,14 +619,8 @@
       // {"PV(1000, 0.075 / 4, 10 * 4)", 58791.96145535981f}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Rate) {
@@ -783,14 +632,8 @@
   } tests[] = {{"Rate(12000, 8000, 5)", 0.0844717712f},
                {"Rate(10000, 0.25 * 5000, 4 * 12)", 0.04427378243f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_NEAR(tests[i].result, value->ToFloat(isolate()), 0.000001)
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloatNear(tests[i].program, tests[i].result, 0.000001);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Term) {
@@ -802,14 +645,8 @@
   } tests[] = {// {"Term(475, .05, 1500)", 3.00477517728f},
                {"Term(2500, 0.0275 + 0.0025, 5000)", 1.97128786369f}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Choose) {
@@ -824,24 +661,13 @@
       {"Choose(20/3, \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\")",
        "F"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Exists) {
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
-
-  EXPECT_TRUE(Execute("Exists(\"hello world\")"));
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsInteger(isolate()));
-  EXPECT_FALSE(value->ToBoolean(isolate()));
+  ExecuteExpectBool("Exists(\"hello world\")", false);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, HasValue) {
@@ -852,14 +678,8 @@
     bool result;
   } tests[] = {{"HasValue(2)", true}, {"HasValue(\" \")", false}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate())) << "Program: " << tests[i].program;
-    EXPECT_EQ(tests[i].result, value->ToBoolean(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectBool(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Oneof) {
@@ -877,14 +697,8 @@
       {"Oneof(3, null, null)", false},
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate())) << "Program: " << tests[i].program;
-    EXPECT_EQ(tests[i].result, value->ToBoolean(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectBool(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Within) {
@@ -897,14 +711,8 @@
                {"Within(1.5, 0, 2)", true},
                {"Within(-1, 0, 2)", false}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate())) << "Program: " << tests[i].program;
-    EXPECT_EQ(tests[i].result, value->ToBoolean(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectBool(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Eval) {
@@ -915,14 +723,8 @@
     int result;
   } tests[] = {{"eval(\"10*3+5*4\")", 50}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_Null) {
@@ -934,21 +736,10 @@
   } tests[] = {{"Null()", "null"},
                {"Concat(\"ABC\", Null(), \"DEF\")", "ABCDEF"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
-
-  EXPECT_TRUE(Execute("Null() + 5"));
-
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsInteger(isolate()));
-  EXPECT_EQ(5, value->ToInteger(isolate()));
+  ExecuteExpectInt32("Null() + 5", 5);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Ref) {
@@ -959,15 +750,8 @@
     const char* result;
   } tests[] = {{"Ref(\"10*3+5*4\")", "10*3+5*4"}, {"Ref(\"hello\")", "hello"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, UnitType) {
@@ -983,15 +767,8 @@
                {"UnitType(\"2.zero cm\")", "in"},
                {"UnitType(\"kilometers\")", "in"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, UnitValue) {
@@ -1007,14 +784,8 @@
       // {"UnitType(\"5.08cm\", \"kilograms\")", 2.0f}
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsNumber(isolate()));
-    EXPECT_FLOAT_EQ(tests[i].result, value->ToFloat(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectFloat(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, At) {
@@ -1027,14 +798,8 @@
                {"At(\"ABCDEFGH\", \"F\")", 6},
                {"At(23412931298471, 29)", 5}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectInt32(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Concat) {
@@ -1049,15 +814,8 @@
                 "You owe One Thousand One Hundred Fifty-four Dollars And "
                 "Sixty-seven Cents."}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Decode) {
@@ -1093,14 +851,8 @@
       {R"(Decode("?%"))", "?"},
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Encode) {
@@ -1129,15 +881,8 @@
 #endif  // !defined(OS_WIN)
   };
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_Format) {
@@ -1149,15 +894,8 @@
   } tests[] = {{"Format(\"MMM D, YYYY\", \"20020901\")", "Sep 1, 2002"},
                {"Format(\"$9,999,999.99\", 1234567.89)", "$1,234,567.89"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Left) {
@@ -1169,15 +907,8 @@
   } tests[] = {{"Left(\"ABCDEFGH\", 3)", "ABC"},
                {"Left(\"Tony Blue\", 5)", "Tony "}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Len) {
@@ -1189,14 +920,8 @@
   } tests[] = {
       {"Len(\"ABCDEFGH\")", 8}, {"Len(4)", 1}, {"Len(Str(4.532, 6, 4))", 6}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsInteger(isolate()));
-    EXPECT_EQ(tests[i].result, value->ToInteger(isolate()))
-        << "Program: " << tests[i].program;
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectBool(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Lower) {
@@ -1209,15 +934,8 @@
                {"Lower(\"21 Main St.\")", "21 main st."},
                {"Lower(15)", "15"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 // This is testing for an OOB read, so will likely only fail under ASAN.
@@ -1239,15 +957,8 @@
   } tests[] = {{"Ltrim(\"   ABCD\")", "ABCD"},
                {"Ltrim(Rtrim(\"    Tony Blue    \"))", "Tony Blue"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, DISABLED_Parse) {
@@ -1258,20 +969,11 @@
     const char* result;
   } tests[] = {{"Parse(\"MMM D, YYYY\", \"Sep 1, 2002\")", "2002-09-01"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
-
-  EXPECT_TRUE(Execute("Parse(\"$9,999,999.99\", \"$1,234,567.89\")"));
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsNumber(isolate()));
-  EXPECT_FLOAT_EQ(1234567.89f, value->ToFloat(isolate()));
+  ExecuteExpectFloat("Parse(\"$9,999,999.99\", \"$1,234,567.89\")",
+                     1234567.89f);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Replace) {
@@ -1284,15 +986,8 @@
                {"Replace(\"ABCDEFGH\", \"D\")", "ABCEFGH"},
                {"Replace(\"ABCDEFGH\", \"d\")", "ABCDEFGH"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Right) {
@@ -1304,15 +999,8 @@
   } tests[] = {{"Right(\"ABCDEFGH\", 3)", "FGH"},
                {"Right(\"Tony Blue\", 5)", " Blue"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Rtrim) {
@@ -1324,15 +1012,8 @@
   } tests[] = {{"Rtrim(\"ABCD   \")", "ABCD"},
                {"Rtrim(\"Tony Blue      \t\")", "Tony Blue"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Space) {
@@ -1344,15 +1025,8 @@
   } tests[] = {{"Space(5)", "     "},
                {"Concat(\"Tony\", Space(1), \"Blue\")", "Tony Blue"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Str) {
@@ -1366,15 +1040,8 @@
                {"Str(234.458, 4)", " 234"},
                {"Str(31.2345, 4, 2)", "****"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Stuff) {
@@ -1388,34 +1055,27 @@
                {"Stuff(\"members-list@myweb.com\", 0, 0, \"cc:\")",
                 "cc:members-list@myweb.com"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Substr) {
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
 
   // Test wrong number of parameters.
-  EXPECT_FALSE(Execute("Substr()"));
-  EXPECT_FALSE(Execute("Substr(1)"));
-  EXPECT_FALSE(Execute("Substr(1, 2)"));
-  EXPECT_FALSE(Execute("Substr(1, 2, 3, 4)"));
+  ExecuteExpectError("Substr()");
+  ExecuteExpectError("Substr(1)");
+  ExecuteExpectError("Substr(1, 2)");
+  ExecuteExpectError("Substr(1, 2, 3, 4)");
 
   // Test null input.
-  EXPECT_TRUE(ExecuteExpectNull("Substr(null, 0, 4)"));
-  EXPECT_TRUE(ExecuteExpectNull("Substr(\"ABCDEFG\", null, 4)"));
-  EXPECT_TRUE(ExecuteExpectNull("Substr(\"ABCDEFG\", 0, null)"));
-  EXPECT_TRUE(ExecuteExpectNull("Substr(null, null, 4)"));
-  EXPECT_TRUE(ExecuteExpectNull("Substr(null, 0, null)"));
-  EXPECT_TRUE(ExecuteExpectNull("Substr(\"ABCDEFG\", null, null)"));
-  EXPECT_TRUE(ExecuteExpectNull("Substr(null, null, null)"));
+  ExecuteExpectNull("Substr(null, 0, 4)");
+  ExecuteExpectNull("Substr(\"ABCDEFG\", null, 4)");
+  ExecuteExpectNull("Substr(\"ABCDEFG\", 0, null)");
+  ExecuteExpectNull("Substr(null, null, 4)");
+  ExecuteExpectNull("Substr(null, 0, null)");
+  ExecuteExpectNull("Substr(\"ABCDEFG\", null, null)");
+  ExecuteExpectNull("Substr(null, null, null)");
 
   struct {
     const char* program;
@@ -1435,20 +1095,12 @@
                              {"Substr(3214, 2, 1)", "2"},
                              {"Substr(\"21 Waterloo St.\", 4, 5)", "Water"}};
 
-  for (const auto& test : kTests) {
-    EXPECT_TRUE(Execute(test.program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(test.result, value->ToString(isolate()).c_str())
-        << "Program: " << test.program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(kTests); ++i)
+    ExecuteExpectString(kTests[i].program, kTests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Uuid) {
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
-
   EXPECT_TRUE(Execute("Uuid()"));
 
   CFXJSE_Value* value = GetValue();
@@ -1465,15 +1117,8 @@
                {"Upper(\"21 Main St.\")", "21 MAIN ST."},
                {"Upper(15)", "15"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, WordNum) {
@@ -1491,15 +1136,8 @@
        "One Thousand One Hundred Fifty-four Dollars And Sixty-seven Cents"},
       {"WordNum(43, 2)", "Forty-three Dollars And Zero Cents"}};
 
-  for (size_t i = 0; i < pdfium::size(tests); ++i) {
-    EXPECT_TRUE(Execute(tests[i].program));
-
-    CFXJSE_Value* value = GetValue();
-    EXPECT_TRUE(value->IsString(isolate()));
-    EXPECT_STREQ(tests[i].result, value->ToString(isolate()).c_str())
-        << "Program: " << tests[i].program << " Result: '"
-        << value->ToString(isolate()) << "'";
-  }
+  for (size_t i = 0; i < pdfium::size(tests); ++i)
+    ExecuteExpectString(tests[i].program, tests[i].result);
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, Get) {
@@ -1533,11 +1171,7 @@
   ASSERT_TRUE(OpenDocument("simple_xfa.pdf"));
 
   const char test[] = {"$form.form1.TextField11.getAttribute(\"h\")"};
-  EXPECT_TRUE(Execute(test));
-
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsString(isolate()));
-  EXPECT_STREQ("12.7mm", value->ToString(isolate()).c_str());
+  ExecuteExpectString(test, "12.7mm");
 }
 
 TEST_F(CFXJSE_FormCalcContextEmbedderTest, GetXFAEventChange) {
@@ -1550,11 +1184,7 @@
   context->SetEventParam(&params);
 
   const char test[] = {"xfa.event.change"};
-  EXPECT_TRUE(Execute(test));
-
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsString(isolate()));
-  EXPECT_STREQ("changed", value->ToString(isolate()).c_str());
+  ExecuteExpectString(test, "changed");
   context->SetEventParam(nullptr);
 }
 
@@ -1650,16 +1280,9 @@
 
   CFXJSE_Engine* context = GetScriptContext();
   context->SetEventParam(&params);
-
-  EXPECT_TRUE(Execute("xfa.event.cancelAction"));
-
-  CFXJSE_Value* value = GetValue();
-  EXPECT_TRUE(value->IsBoolean(isolate()));
-  EXPECT_FALSE(value->ToBoolean(isolate()));
-
+  ExecuteExpectBool("xfa.event.cancelAction", false);
   EXPECT_TRUE(Execute("xfa.event.cancelAction = \"true\""));
   EXPECT_TRUE(params.m_bCancelAction);
-
   context->SetEventParam(nullptr);
 }