diff --git a/core/fxge/dib/cstretchengine_unittest.cpp b/core/fxge/dib/cstretchengine_unittest.cpp
index c3e3b8d..fec9eb0 100644
--- a/core/fxge/dib/cstretchengine_unittest.cpp
+++ b/core/fxge/dib/cstretchengine_unittest.cpp
@@ -14,6 +14,42 @@
 #include "core/fxge/dib/fx_dib.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace {
+
+uint32_t PixelWeightSum(const CStretchEngine::PixelWeight* weights) {
+  uint32_t sum = 0;
+  for (int j = weights->m_SrcStart; j <= weights->m_SrcEnd; ++j) {
+    sum += weights->GetWeightForPosition(j);
+  }
+  return sum;
+}
+
+void ExecuteOneStretchTest(uint32_t dest_width,
+                           uint32_t src_width,
+                           const FXDIB_ResampleOptions& options) {
+  constexpr uint32_t kExpectedSum = 65536;  // kFixedPointOne not exposed yet.
+  CStretchEngine::WeightTable table;
+  table.CalculateWeights(dest_width, 0, dest_width, src_width, 0, src_width,
+                         options);
+  for (uint32_t i = 0; i < dest_width; ++i) {
+    EXPECT_EQ(kExpectedSum, PixelWeightSum(table.GetPixelWeight(i)))
+        << "for { " << src_width << ", " << dest_width << " } at " << i;
+  }
+}
+
+void ExecuteStretchTests(const FXDIB_ResampleOptions& options) {
+  // Can't test everything, few random values chosen.
+  constexpr uint32_t kDestWidths[] = {1, 2, 337, 512, 808, 2550};
+  constexpr uint32_t kSrcWidths[] = {1, 2, 187, 256, 809, 1110};
+  for (uint32_t src_width : kSrcWidths) {
+    for (uint32_t dest_width : kDestWidths) {
+      ExecuteOneStretchTest(dest_width, src_width, options);
+    }
+  }
+}
+
+}  // namespace
+
 TEST(CStretchEngine, OverflowInCtor) {
   FX_RECT clip_rect;
   RetainPtr<CPDF_Dictionary> dict_obj = pdfium::MakeRetain<CPDF_Dictionary>();
@@ -30,3 +66,29 @@
   EXPECT_FALSE(engine.GetResampleOptionsForTest().bNoSmoothing);
   EXPECT_FALSE(engine.GetResampleOptionsForTest().bLossy);
 }
+
+// See https://crbug.com/pdfium/1688
+TEST(CStretchEngine, DISABLED_WeightRounding) {
+  FXDIB_ResampleOptions options;
+  ExecuteStretchTests(options);
+}
+
+TEST(CStretchEngine, WeightRoundingNoSmoothing) {
+  FXDIB_ResampleOptions options;
+  options.bNoSmoothing = true;
+  ExecuteStretchTests(options);
+}
+
+// See https://crbug.com/pdfium/1688
+TEST(CStretchEngine, DISABLED_WeightRoundingBilinear) {
+  FXDIB_ResampleOptions options;
+  options.bInterpolateBilinear = true;
+  ExecuteStretchTests(options);
+}
+
+TEST(CStretchEngine, WeightRoundingNoSmoothingBilinear) {
+  FXDIB_ResampleOptions options;
+  options.bNoSmoothing = true;
+  options.bInterpolateBilinear = true;
+  ExecuteStretchTests(options);
+}
