Commit 70723acc for tesseract

commit 70723acce95f715327189bbbfdd6172c6863f4c6
Author: Stefan Weil <sw@weilnetz.de>
Date:   Mon Nov 2 10:55:08 2026 +0100

    Register plumbing_dimensions_test with Autotools and tidy tests

    The new regression suite was only picked up by CMake's test glob. Autotools
    lists each test executable explicitly, so the six tests neither built nor ran
    under make check, and the source was omitted from dist archives. Add the
    corresponding check_PROGRAMS and _SOURCES/_CPPFLAGS/_LDADD entries alongside
    plumbing_test.

    While at it:
    - rename RejectsParallelOutputSumBeyondIntRange to
      RejectsParallelOutputSumOverflow (the individual child output counts are
      within int range; it is their sum that overflows),
    - make ReadChildren's setup unmask-able by asserting serialization and file
      open in the test bodies (ASSERT_* cannot live in the bool-returning helper,
      so it was split into a plain SerializeChildren and inline TFile reads),
      so a failed DeSerialize can only mean the parent rejected the children, and
    - drop the no-op writer.OpenWrite check (TFile::OpenWrite returns void).

    Verified under both CMake (Debug) and Autotools (make): plumbing_dimensions_test
    6/6 pass, plumbing_test 5/5 pass.

    Assisted-by: OpenCode / qwen3.8-27b-thinking (Alibaba Cloud)
    Signed-off-by: Stefan Weil <sw@weilnetz.de>

diff --git a/Makefile.am b/Makefile.am
index 63613275..d40ba1e6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1214,6 +1214,7 @@ if ENABLE_TRAINING
 check_PROGRAMS += pango_font_info_test
 endif # ENABLE_TRAINING
 check_PROGRAMS += paragraphs_test
+check_PROGRAMS += plumbing_dimensions_test
 check_PROGRAMS += plumbing_test
 if !DISABLED_LEGACY_ENGINE
 check_PROGRAMS += params_model_test
@@ -1493,6 +1494,10 @@ paragraphs_test_SOURCES = unittest/paragraphs_test.cc
 paragraphs_test_CPPFLAGS = $(unittest_CPPFLAGS)
 paragraphs_test_LDADD = $(TESS_LIBS)

+plumbing_dimensions_test_SOURCES = unittest/plumbing_dimensions_test.cc
+plumbing_dimensions_test_CPPFLAGS = $(unittest_CPPFLAGS)
+plumbing_dimensions_test_LDADD = $(TESS_LIBS)
+
 plumbing_test_SOURCES = unittest/plumbing_test.cc
 plumbing_test_CPPFLAGS = $(unittest_CPPFLAGS)
 plumbing_test_LDADD = $(TESS_LIBS)
diff --git a/unittest/plumbing_dimensions_test.cc b/unittest/plumbing_dimensions_test.cc
index 01893ea3..070f06d2 100644
--- a/unittest/plumbing_dimensions_test.cc
+++ b/unittest/plumbing_dimensions_test.cc
@@ -21,47 +21,58 @@
 namespace tesseract {
 namespace {

-// Each child is valid independently. The parent must check their dimensions.
-bool ReadChildren(Plumbing *parent, const Network &first,
-                  const Network &second) {
-  std::vector<char> data;
+// Serializes the two children into *data.
+bool SerializeChildren(std::vector<char> *data, const Network &first,
+                       const Network &second) {
   TFile writer;
-  writer.OpenWrite(&data);
+  writer.OpenWrite(data);
   const uint32_t count = 2;
-  EXPECT_TRUE(writer.Serialize(&count));
-  EXPECT_TRUE(first.Serialize(&writer));
-  EXPECT_TRUE(second.Serialize(&writer));
-  TFile reader;
-  EXPECT_TRUE(reader.Open(data.data(), data.size()));
-  return parent->DeSerialize(&reader);
+  return writer.Serialize(&count) && first.Serialize(&writer) &&
+         second.Serialize(&writer);
 }

 TEST(PlumbingDimensionsTest, RejectsSeriesDimensionMismatch) {
   Reconfig first("first", 2, 3, 1);
   Reconfig second("second", 3, 1, 1);
   Series parent("series");
-  EXPECT_FALSE(ReadChildren(&parent, first, second));
+  std::vector<char> data;
+  ASSERT_TRUE(SerializeChildren(&data, first, second));
+  TFile reader;
+  ASSERT_TRUE(reader.Open(data.data(), data.size()));
+  EXPECT_FALSE(parent.DeSerialize(&reader));
 }

 TEST(PlumbingDimensionsTest, RejectsParallelDimensionMismatch) {
   Reconfig first("first", 2, 1, 1);
   Reconfig second("second", 3, 1, 1);
   Parallel parent("parallel", NT_PARALLEL);
-  EXPECT_FALSE(ReadChildren(&parent, first, second));
+  std::vector<char> data;
+  ASSERT_TRUE(SerializeChildren(&data, first, second));
+  TFile reader;
+  ASSERT_TRUE(reader.Open(data.data(), data.size()));
+  EXPECT_FALSE(parent.DeSerialize(&reader));
 }

-TEST(PlumbingDimensionsTest, RejectsParallelOutputSumBeyondIntRange) {
+TEST(PlumbingDimensionsTest, RejectsParallelOutputSumOverflow) {
   Reconfig first("first", 1, std::numeric_limits<int>::max(), 1);
   Reconfig second("second", 1, 1, 1);
   Parallel parent("parallel", NT_PARALLEL);
-  EXPECT_FALSE(ReadChildren(&parent, first, second));
+  std::vector<char> data;
+  ASSERT_TRUE(SerializeChildren(&data, first, second));
+  TFile reader;
+  ASSERT_TRUE(reader.Open(data.data(), data.size()));
+  EXPECT_FALSE(parent.DeSerialize(&reader));
 }

 TEST(PlumbingDimensionsTest, AcceptsParallelOutputSumAtIntLimit) {
   Reconfig first("first", 1, std::numeric_limits<int>::max() - 1, 1);
   Reconfig second("second", 1, 1, 1);
   Parallel parent("parallel", NT_PARALLEL);
-  ASSERT_TRUE(ReadChildren(&parent, first, second));
+  std::vector<char> data;
+  ASSERT_TRUE(SerializeChildren(&data, first, second));
+  TFile reader;
+  ASSERT_TRUE(reader.Open(data.data(), data.size()));
+  ASSERT_TRUE(parent.DeSerialize(&reader));
   EXPECT_EQ(1, parent.NumInputs());
   EXPECT_EQ(std::numeric_limits<int>::max(), parent.NumOutputs());
   EXPECT_EQ(2U, parent.stack().size());
@@ -71,7 +82,11 @@ TEST(PlumbingDimensionsTest, AcceptsMatchingSeriesDimensions) {
   Reconfig first("first", 2, 3, 1);
   Reconfig second("second", 6, 2, 1);
   Series parent("series");
-  ASSERT_TRUE(ReadChildren(&parent, first, second));
+  std::vector<char> data;
+  ASSERT_TRUE(SerializeChildren(&data, first, second));
+  TFile reader;
+  ASSERT_TRUE(reader.Open(data.data(), data.size()));
+  ASSERT_TRUE(parent.DeSerialize(&reader));
   EXPECT_EQ(2, parent.NumInputs());
   EXPECT_EQ(12, parent.NumOutputs());
   EXPECT_EQ(2U, parent.stack().size());