From a47b7be0492edd567892657e8cd79a6c41a40d41 Mon Sep 17 00:00:00 2001
From: Mathieu Westphal <mathieu.westphal@kitware.com>
Date: Mon, 24 Feb 2025 12:13:59 +0100
Subject: [PATCH] Tests: Adding a vtkProbeFilter test for oriented images

---
 Filters/Core/Testing/Cxx/TestProbeFilter.cxx | 74 +++++++++++++++++---
 1 file changed, 66 insertions(+), 8 deletions(-)

diff --git a/Filters/Core/Testing/Cxx/TestProbeFilter.cxx b/Filters/Core/Testing/Cxx/TestProbeFilter.cxx
index 0cfbc0560a6..d1b72049755 100644
--- a/Filters/Core/Testing/Cxx/TestProbeFilter.cxx
+++ b/Filters/Core/Testing/Cxx/TestProbeFilter.cxx
@@ -4,18 +4,20 @@
 #include "vtkArrayCalculator.h"
 #include "vtkDataArray.h"
 #include "vtkDataSet.h"
+#include "vtkImageData.h"
 #include "vtkLineSource.h"
 #include "vtkNew.h"
 #include "vtkPointData.h"
 #include "vtkProbeFilter.h"
+#include "vtkRTAnalyticSource.h"
 
 // Gets the number of points the probe filter counted as valid.
 // The parameter should be the output of the probe filter
-int GetNumberOfValidPoints(vtkDataSet* pd)
+vtkIdType GetNumberOfValidPoints(vtkDataSet* pd)
 {
   vtkDataArray* data = pd->GetPointData()->GetScalars("vtkValidPointMask");
-  int numValid = 0;
-  for (int i = 0; i < data->GetNumberOfTuples(); ++i)
+  vtkIdType numValid = 0;
+  for (vtkIdType i = 0; i < data->GetNumberOfTuples(); ++i)
   {
     if (data->GetVariantValue(i).ToDouble() == 1)
     {
@@ -25,8 +27,27 @@ int GetNumberOfValidPoints(vtkDataSet* pd)
   return numValid;
 }
 
+bool TestProbeFilterWithProvidedData(
+  vtkDataSet* input, vtkDataSet* source, vtkIdType expectedNValidPoints)
+{
+  vtkNew<vtkProbeFilter> probe;
+  probe->SetInputData(input);
+  probe->SetSourceData(source);
+  probe->Update();
+
+  vtkIdType nValidPoints = GetNumberOfValidPoints(probe->GetOutput());
+  if (nValidPoints != expectedNValidPoints)
+  {
+    std::cerr << "Unexpected number of valid points, got " << nValidPoints << " instead of "
+              << expectedNValidPoints << std::endl;
+    return false;
+  }
+
+  return true;
+}
+
 // Tests the CompteThreshold and Threshold parameters on the vtkProbeFilter
-int TestProbeFilterThreshold()
+bool TestProbeFilterThreshold()
 {
   vtkNew<vtkLineSource> line1;
   line1->SetPoint1(-1, 0, 0);
@@ -51,7 +72,7 @@ int TestProbeFilterThreshold()
   int validDefault = GetNumberOfValidPoints(probe->GetOutput());
   if (validDefault != 2)
   {
-    return 1;
+    return false;
   }
   // turn off computing tolerance and set it to 11 times what is was.
   // 11 is magic number to get all the points within line1 selected.
@@ -63,19 +84,56 @@ int TestProbeFilterThreshold()
 
   if (validNext != 11)
   {
-    return 1;
+    return false;
   }
   // threshold is still set high, but we tell it to ignore it
   probe->SetComputeTolerance(true);
   probe->Update();
 
   int validIgnore = GetNumberOfValidPoints(probe->GetOutput());
-  return (validIgnore == 2) ? 0 : 1;
+  return (validIgnore == 2) ? true : false;
+}
+
+// Test probing one image into another
+bool TestProbeFilterWithImages()
+{
+  // Create Pipeline
+  vtkNew<vtkRTAnalyticSource> wavelet;
+  wavelet->SetWholeExtent(0, 16, 0, 16, 0, 16);
+  wavelet->SetCenter(8, 8, 8);
+  wavelet->Update();
+
+  vtkNew<vtkImageData> img;
+  img->SetExtent(1, 15, 1, 15, 1, 15);
+  img->SetOrigin(1, 1, 1);
+
+  return TestProbeFilterWithProvidedData(img, wavelet->GetOutput(), 3375);
+}
+
+// Test probing one image into an oriented one
+bool TestProbeFilterWithOrientedImages()
+{
+  // Create Pipeline
+  vtkNew<vtkRTAnalyticSource> wavelet;
+  wavelet->SetWholeExtent(0, 16, 0, 16, 0, 16);
+  wavelet->SetCenter(8, 8, 8);
+  wavelet->Update();
+
+  vtkNew<vtkImageData> img;
+  img->SetExtent(1, 15, 1, 15, 1, 15);
+  img->SetOrigin(1, 1, 1);
+  img->SetDirectionMatrix(0.7, -0.7, 0, 0.7, 0.7, 0, 0, 0, 1);
+
+  return TestProbeFilterWithProvidedData(img, wavelet->GetOutput(), 1575);
 }
 
 // Currently only tests the ComputeThreshold and Threshold.  Other tests
 // should be added
 int TestProbeFilter(int, char*[])
 {
-  return TestProbeFilterThreshold();
+  bool status = true;
+  status &= TestProbeFilterThreshold();
+  status &= TestProbeFilterWithImages();
+  status &= TestProbeFilterWithOrientedImages();
+  return status ? EXIT_SUCCESS : EXIT_FAILURE;
 }
-- 
GitLab