diff --git a/tests/PathOpsTestCommon.cpp b/tests/PathOpsTestCommon.cpp
index 4356b42..dd9b347 100644
--- a/tests/PathOpsTestCommon.cpp
+++ b/tests/PathOpsTestCommon.cpp
@@ -5,7 +5,11 @@
  * found in the LICENSE file.
  */
 #include "PathOpsTestCommon.h"
+#include "SkPathOpsBounds.h"
 #include "SkPathOpsCubic.h"
+#include "SkPathOpsLine.h"
+#include "SkPathOpsQuad.h"
+#include "SkPathOpsTriangle.h"
 
 void CubicToQuads(const SkDCubic& cubic, double precision, SkTArray<SkDQuad, true>& quads) {
     SkTArray<double, true> ts;
@@ -24,3 +28,82 @@
         tStart = tEnd;
     }
 }
+
+static bool SkDoubleIsNaN(double x) {
+    return x != x;
+}
+
+bool ValidBounds(const SkPathOpsBounds& bounds) {
+    if (SkScalarIsNaN(bounds.fLeft)) {
+        return false;
+    }
+    if (SkScalarIsNaN(bounds.fTop)) {
+        return false;
+    }
+    if (SkScalarIsNaN(bounds.fRight)) {
+        return false;
+    }
+    return !SkScalarIsNaN(bounds.fBottom);
+}
+
+bool ValidCubic(const SkDCubic& cubic) {
+    for (int index = 0; index < 4; ++index) {
+        if (!ValidPoint(cubic[index])) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ValidLine(const SkDLine& line) {
+    for (int index = 0; index < 2; ++index) {
+        if (!ValidPoint(line[index])) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ValidPoint(const SkDPoint& pt) {
+    if (SkDoubleIsNaN(pt.fX)) {
+        return false;
+    }
+    return !SkDoubleIsNaN(pt.fY);  
+}
+
+bool ValidPoints(const SkPoint* pts, int count) {
+    for (int index = 0; index < count; ++index) {
+        if (SkScalarIsNaN(pts[index].fX)) {
+            return false;
+        }
+        if (SkScalarIsNaN(pts[index].fY)) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ValidQuad(const SkDQuad& quad) {
+    for (int index = 0; index < 3; ++index) {
+        if (!ValidPoint(quad[index])) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ValidTriangle(const SkDTriangle& triangle) {
+    for (int index = 0; index < 3; ++index) {
+        if (!ValidPoint(triangle.fPts[index])) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool ValidVector(const SkDVector& v) {
+    if (SkDoubleIsNaN(v.fX)) {
+        return false;
+    }
+    return !SkDoubleIsNaN(v.fY);  
+}
