From dd5196232f9415e5472d23f07f1fb9130b080a73 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 21:28:37 -0500 Subject: [PATCH 01/17] Fix PHPStan "Offset 0 might not exist" --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 4 +++- tests/PhpWordTests/Writer/HTML/FontTest.php | 4 +++- tests/PhpWordTests/Writer/HTML/ParagraphTest.php | 12 +++++++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index cd0bafaab0..614af244e3 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -161,7 +161,9 @@ public function testWriteTableBorders(): void self::assertEmpty(Helper::getNamedItem($xpath, '/html/body/div/table[6]', 'style')); self::assertEquals('tstyle', Helper::getTextContent($xpath, '/html/body/div/table[6]', 'class')); $style = Helper::getTextContent($xpath, '/html/head/style'); - self::assertNotFalse(preg_match('/^[.]tstyle[^\\r\\n]*/m', $style, $matches)); + $prg = preg_match('/^[.]tstyle[^\\r\\n]*/m', $style, $matches); + self::assertNotEmpty($matches); + self::assertNotFalse($prg); self::assertEquals(".tstyle {table-layout: auto; $cssnone}", $matches[0]); } diff --git a/tests/PhpWordTests/Writer/HTML/FontTest.php b/tests/PhpWordTests/Writer/HTML/FontTest.php index 0a203b7237..5cc05895f6 100644 --- a/tests/PhpWordTests/Writer/HTML/FontTest.php +++ b/tests/PhpWordTests/Writer/HTML/FontTest.php @@ -274,7 +274,9 @@ public function testWhiteSpace(): void $xpath = new DOMXPath($dom); $style = Helper::getTextContent($xpath, '/html/head/style'); - self::assertNotFalse(preg_match('/^[*][^\\r\\n]*/m', $style, $matches)); + $prg = preg_match('/^[*][^\\r\\n]*/m', $style, $matches); + self::assertNotEmpty($matches); + self::assertNotFalse($prg); self::assertEquals('* {font-family: \'Arial\'; font-size: 12pt; color: #000000; white-space: pre-wrap;}', $matches[0]); $prg = preg_match('/^[.]style1[^\\r\\n]*/m', $style, $matches); self::assertNotEmpty($matches); diff --git a/tests/PhpWordTests/Writer/HTML/ParagraphTest.php b/tests/PhpWordTests/Writer/HTML/ParagraphTest.php index 2b2724dba8..25ffe3cca6 100644 --- a/tests/PhpWordTests/Writer/HTML/ParagraphTest.php +++ b/tests/PhpWordTests/Writer/HTML/ParagraphTest.php @@ -54,7 +54,9 @@ public function testParagraphStyles(): void self::assertEquals('indented', Helper::getTextContent($xpath, '/html/body/div/p[2]', 'class')); $style = Helper::getTextContent($xpath, '/html/head/style'); - self::assertNotFalse(preg_match('/^[.]indented[^\\r\\n]*/m', $style, $matches)); + $prg = preg_match('/^[.]indented[^\\r\\n]*/m', $style, $matches); + self::assertNotEmpty($matches); + self::assertNotFalse($prg); self::assertEquals('.indented {margin-left: 0.5in; margin-right: 0.6in;}', $matches[0]); } @@ -87,9 +89,13 @@ public function testParagraphAndFontStyles(): void self::assertEquals('font-family: \'Verdana\'; font-size: 12pt;', Helper::getTextContent($xpath, '/html/body/div/p[2]/span', 'style')); $style = Helper::getTextContent($xpath, '/html/head/style'); - self::assertNotFalse(preg_match('/^[.]indented[^\\r\\n]*/m', $style, $matches)); + $prg = preg_match('/^[.]indented[^\\r\\n]*/m', $style, $matches); + self::assertNotEmpty($matches); + self::assertNotFalse($prg); self::assertEquals('.indented {margin-left: 0.5in; margin-right: 0.6in;}', $matches[0]); - self::assertNotFalse(preg_match('/^[.]style1[^\\r\\n]*/m', $style, $matches)); + $prg = preg_match('/^[.]style1[^\\r\\n]*/m', $style, $matches); + self::assertNotEmpty($matches); + self::assertNotFalse($prg); self::assertEquals('.style1 {font-family: \'Courier New\', monospace; font-size: 10pt; white-space: pre-wrap;}', $matches[0]); } From 854d4543f18c2b64e6f2d3320e6f33816515ce54 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 21:33:08 -0500 Subject: [PATCH 02/17] Fix PHPStan Offset might not exist --- src/PhpWord/Reader/Word2007/AbstractPart.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpWord/Reader/Word2007/AbstractPart.php b/src/PhpWord/Reader/Word2007/AbstractPart.php index 9d49573d69..8fd881a665 100644 --- a/src/PhpWord/Reader/Word2007/AbstractPart.php +++ b/src/PhpWord/Reader/Word2007/AbstractPart.php @@ -368,7 +368,7 @@ private function readFormField(XMLReader $xmlReader, array $domNodes, $parent, $ } } $formField->setEntries($listEntries); - if (null !== $formField->getValue()) { + if (null !== $formField->getValue() && isset($listEntries[$formField->getValue()])) { $formField->setText($listEntries[$formField->getValue()]); } From dab30c7ce26c7472c28e0aba95fc46ff720c41c5 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 21:54:48 -0500 Subject: [PATCH 03/17] Fix PHPStan Cannot access property $length on DOMNodeList|false. --- .../Writer/HTML/Element/RubyTest.php | 8 +++-- .../PhpWordTests/Writer/HTML/ElementTest.php | 36 ++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/RubyTest.php b/tests/PhpWordTests/Writer/HTML/Element/RubyTest.php index 2ca556bc51..0d00b2bad7 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/RubyTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/RubyTest.php @@ -49,7 +49,9 @@ public function testWriteRubyHtml(): void $dom = Helper::getAsHTML($phpWord, '', '', ['ruby', 'rt', 'rp']); $xpath = new DOMXPath($dom); - self::assertEquals(1, $xpath->query('/html/body/div/ruby')->length); + $query = $xpath->query('/html/body/div/ruby'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); // ensure text is right $rubyElement = $dom->getElementsByTagName('ruby')->item(0); $rtElement = $dom->getElementsByTagName('rt')->item(0); @@ -84,7 +86,9 @@ public function testWriteRubyHtmlParagraphStyle(): void $dom = Helper::getAsHTML($phpWord, '', '', ['ruby', 'rt', 'rp']); $xpath = new DOMXPath($dom); - self::assertEquals(1, $xpath->query('/html/body/div/ruby')->length); + $query = $xpath->query('/html/body/div/ruby'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); // ensure text is right $rubyElement = $dom->getElementsByTagName('ruby')->item(0); $rtElement = $dom->getElementsByTagName('rt')->item(0); diff --git a/tests/PhpWordTests/Writer/HTML/ElementTest.php b/tests/PhpWordTests/Writer/HTML/ElementTest.php index 3b2580381f..c28b0969a2 100644 --- a/tests/PhpWordTests/Writer/HTML/ElementTest.php +++ b/tests/PhpWordTests/Writer/HTML/ElementTest.php @@ -77,8 +77,12 @@ public function testWriteTrackChanges(): void $dom = Helper::getAsHTML($phpWord); $xpath = new DOMXPath($dom); - self::assertEquals(1, $xpath->query('/html/body/div/p[1]/ins')->length); - self::assertEquals(1, $xpath->query('/html/body/div/p[2]/del')->length); + $query = $xpath->query('/html/body/div/p[1]/ins'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); + $query = $xpath->query('/html/body/div/p[2]/del'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); } /** @@ -101,9 +105,13 @@ public function testWriteColSpan(): void $dom = Helper::getAsHTML($phpWord); $xpath = new DOMXPath($dom); - self::assertEquals(1, $xpath->query('/html/body/div/table/tr[1]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[1]/td'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); self::assertEquals('2', $xpath->query('/html/body/div/table/tr/td[1]')->item(0)->attributes->getNamedItem('colspan')->textContent); - self::assertEquals(2, $xpath->query('/html/body/div/table/tr[2]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[2]/td'); + self::assertNotFalse($query); + self::assertEquals(2, $query->length); self::assertEquals('#6086B8', $xpath->query('/html/body/div/table/tr[1]/td')->item(0)->attributes->getNamedItem('bgcolor')->textContent); self::assertEquals('#ffffff', $xpath->query('/html/body/div/table/tr[1]/td')->item(0)->attributes->getNamedItem('color')->textContent); @@ -135,9 +143,13 @@ public function testWriteRowSpan(): void $dom = Helper::getAsHTML($phpWord); $xpath = new DOMXPath($dom); - self::assertEquals(2, $xpath->query('/html/body/div/table/tr[1]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[1]/td'); + self::assertNotFalse($query); + self::assertEquals(2, $query->length); self::assertEquals('3', $xpath->query('/html/body/div/table/tr[1]/td[1]')->item(0)->attributes->getNamedItem('rowspan')->textContent); - self::assertEquals(1, $xpath->query('/html/body/div/table/tr[2]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[2]/td'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); } /** @@ -167,14 +179,20 @@ public function testWriteRowSpanAndColSpan(): void $dom = Helper::getAsHTML($phpWord); $xpath = new DOMXPath($dom); - self::assertEquals(3, $xpath->query('/html/body/div/table/tr[1]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[1]/td'); + self::assertNotFalse($query); + self::assertEquals(3, $query->length); self::assertEquals('2', $xpath->query('/html/body/div/table/tr[1]/td[2]')->item(0)->attributes->getNamedItem('colspan')->textContent); self::assertEquals('3', $xpath->query('/html/body/div/table/tr[1]/td[3]')->item(0)->attributes->getNamedItem('rowspan')->textContent); - self::assertEquals(1, $xpath->query('/html/body/div/table/tr[2]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[2]/td'); + self::assertNotFalse($query); + self::assertEquals(1, $query->length); self::assertEquals('3', $xpath->query('/html/body/div/table/tr[2]/td[1]')->item(0)->attributes->getNamedItem('colspan')->textContent); - self::assertEquals(3, $xpath->query('/html/body/div/table/tr[3]/td')->length); + $query = $xpath->query('/html/body/div/table/tr[3]/td'); + self::assertNotFalse($query); + self::assertEquals(3, $query->length); } public function testWriteTitleTextRun(): void From d3f3f6554ca881a0ff20ad5bd444b3f34255b836 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:03:21 -0500 Subject: [PATCH 04/17] Should fix "undefined property" ->attributes. --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index 614af244e3..9796f2ce3d 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -199,7 +199,7 @@ public function testWriteTableCellVAlign(): void $cell3Query = $xpath->query('//table/tr/td[3]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - + self::assertObjectHasProperty('attributes', $cell3Query->item(0)); $cell3Style = $cell3Query->item(0)->attributes->getNamedItem('style'); self::assertNull($cell3Style); } @@ -232,6 +232,7 @@ public function testWriteTableCellVMerge(): void $cell3Query = $xpath->query('//table/tr[3]/td[1]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); + self::assertObjectHasProperty('attributes', $cell3Query->item(0)); self::assertNull($cell3Query->item(0)->attributes->getNamedItem('rowspan')); } } From 7ad4226469d6b30ae0fadacb5079e000c394c24e Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:23:05 -0500 Subject: [PATCH 05/17] Try again --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index 9796f2ce3d..6d304d1677 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -232,7 +232,7 @@ public function testWriteTableCellVMerge(): void $cell3Query = $xpath->query('//table/tr[3]/td[1]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - self::assertObjectHasProperty('attributes', $cell3Query->item(0)); + self::assertClassHasAttribute($cell3Query->item(0), 'attributes'); self::assertNull($cell3Query->item(0)->attributes->getNamedItem('rowspan')); } } From 4dccfee4abf7acee3e583e76db204c50f324332a Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:24:39 -0500 Subject: [PATCH 06/17] Again --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index 6d304d1677..168d7b87ed 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -232,7 +232,7 @@ public function testWriteTableCellVMerge(): void $cell3Query = $xpath->query('//table/tr[3]/td[1]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - self::assertClassHasAttribute($cell3Query->item(0), 'attributes'); + self::assertClassHasAttribute('attributes', $cell3Query->item(0)); self::assertNull($cell3Query->item(0)->attributes->getNamedItem('rowspan')); } } From 70f4256a21f01bf0cd6fd0bdcea7dc9374ad97f6 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:27:11 -0500 Subject: [PATCH 07/17] Update TableTest.php --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index 168d7b87ed..d59456e1a2 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -232,7 +232,7 @@ public function testWriteTableCellVMerge(): void $cell3Query = $xpath->query('//table/tr[3]/td[1]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - self::assertClassHasAttribute('attributes', $cell3Query->item(0)); + self::assertObjectHasAttribute('attributes', $cell3Query->item(0)); self::assertNull($cell3Query->item(0)->attributes->getNamedItem('rowspan')); } } From 1151f68a08cfa80d13cd4808dbfd6b41824572df Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:39:51 -0500 Subject: [PATCH 08/17] Try again? --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index d59456e1a2..94e2a8756d 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -232,7 +232,7 @@ public function testWriteTableCellVMerge(): void $cell3Query = $xpath->query('//table/tr[3]/td[1]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - self::assertObjectHasAttribute('attributes', $cell3Query->item(0)); + self::assertInstanceOf(DOMNode::class, $cell3Query->item(0)); self::assertNull($cell3Query->item(0)->attributes->getNamedItem('rowspan')); } } From 2c5bdcabc6e5e8d508d4e91ff86522f751d6bdac Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:41:58 -0500 Subject: [PATCH 09/17] Update TableTest.php --- tests/PhpWordTests/Writer/HTML/Element/TableTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index 94e2a8756d..5ee275aedd 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -18,6 +18,7 @@ namespace PhpOffice\PhpWordTests\Writer\HTML\Element; +use DOMNode; use DOMXPath; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\SimpleType\VerticalJc; From 376c990b37e92923b63cf06977a0e8fecd1392f6 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 22:52:49 -0500 Subject: [PATCH 10/17] Fixing more PHPStan Access to undefined property --- .../Writer/HTML/Element/TableTest.php | 2 +- .../PhpWordTests/Writer/HTML/ElementTest.php | 30 ++++++++++++------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index 5ee275aedd..285db16d14 100644 --- a/tests/PhpWordTests/Writer/HTML/Element/TableTest.php +++ b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php @@ -200,7 +200,7 @@ public function testWriteTableCellVAlign(): void $cell3Query = $xpath->query('//table/tr/td[3]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - self::assertObjectHasProperty('attributes', $cell3Query->item(0)); + self::assertInstanceOf(DOMNode::class, $cell3Query->item(0)); $cell3Style = $cell3Query->item(0)->attributes->getNamedItem('style'); self::assertNull($cell3Style); } diff --git a/tests/PhpWordTests/Writer/HTML/ElementTest.php b/tests/PhpWordTests/Writer/HTML/ElementTest.php index c28b0969a2..e30ab06caa 100644 --- a/tests/PhpWordTests/Writer/HTML/ElementTest.php +++ b/tests/PhpWordTests/Writer/HTML/ElementTest.php @@ -20,6 +20,7 @@ use DateTime; use DOMDocument; +use DOMNode; use DOMXPath; use PhpOffice\PhpWord\Element\Text as TextElement; use PhpOffice\PhpWord\Element\TextRun; @@ -107,16 +108,18 @@ public function testWriteColSpan(): void $query = $xpath->query('/html/body/div/table/tr[1]/td'); self::assertNotFalse($query); - self::assertEquals(1, $query->length); - self::assertEquals('2', $xpath->query('/html/body/div/table/tr/td[1]')->item(0)->attributes->getNamedItem('colspan')->textContent); + self::assertCount(1, $query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('2', $query->item(0)->attributes->getNamedItem('colspan')->textContent); + self::assertEquals('#6086B8', $query->item(0)->attributes->getNamedItem('bgcolor')->textContent); + self::assertEquals('#ffffff', $query->item(0)->attributes->getNamedItem('color')->textContent); + $query = $xpath->query('/html/body/div/table/tr[2]/td'); self::assertNotFalse($query); - self::assertEquals(2, $query->length); - - self::assertEquals('#6086B8', $xpath->query('/html/body/div/table/tr[1]/td')->item(0)->attributes->getNamedItem('bgcolor')->textContent); - self::assertEquals('#ffffff', $xpath->query('/html/body/div/table/tr[1]/td')->item(0)->attributes->getNamedItem('color')->textContent); - self::assertEquals('#ffffff', $xpath->query('/html/body/div/table/tr[2]/td')->item(0)->attributes->getNamedItem('bgcolor')->textContent); - self::assertNull($xpath->query('/html/body/div/table/tr[2]/td')->item(0)->attributes->getNamedItem('color')); + self::assertCount(2, $query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('#ffffff', $query->item(0)->attributes->getNamedItem('bgcolor')->textContent); + self::assertNull($query->item(0)->attributes->getNamedItem('color')); } /** @@ -145,8 +148,15 @@ public function testWriteRowSpan(): void $query = $xpath->query('/html/body/div/table/tr[1]/td'); self::assertNotFalse($query); - self::assertEquals(2, $query->length); - self::assertEquals('3', $xpath->query('/html/body/div/table/tr[1]/td[1]')->item(0)->attributes->getNamedItem('rowspan')->textContent); + self::assertCount(2, $query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('2', $query->item(0)->attributes->getNamedItem('colspan')->textContent); + + $query = $xpath->query('/html/body/div/table/tr[1]/td[1]'); + self::assertNotFalse($query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('3', $query->item(0)->attributes->getNamedItem('rowspan')->textContent); + $query = $xpath->query('/html/body/div/table/tr[2]/td'); self::assertNotFalse($query); self::assertEquals(1, $query->length); From f88586f9a3f9a5ba51673702bcdc569de15e36cd Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:05:58 -0500 Subject: [PATCH 11/17] Additional PHPStan fixes --- .../PhpWordTests/Writer/HTML/ElementTest.php | 33 +++++++++++++------ tests/PhpWordTests/Writer/HTML/Helper.php | 24 +++++++++++--- 2 files changed, 42 insertions(+), 15 deletions(-) diff --git a/tests/PhpWordTests/Writer/HTML/ElementTest.php b/tests/PhpWordTests/Writer/HTML/ElementTest.php index e30ab06caa..3ce6a2712a 100644 --- a/tests/PhpWordTests/Writer/HTML/ElementTest.php +++ b/tests/PhpWordTests/Writer/HTML/ElementTest.php @@ -149,8 +149,6 @@ public function testWriteRowSpan(): void $query = $xpath->query('/html/body/div/table/tr[1]/td'); self::assertNotFalse($query); self::assertCount(2, $query); - self::assertInstanceOf(DOMNode::class, $query->item(0)); - self::assertEquals('2', $query->item(0)->attributes->getNamedItem('colspan')->textContent); $query = $xpath->query('/html/body/div/table/tr[1]/td[1]'); self::assertNotFalse($query); @@ -159,7 +157,7 @@ public function testWriteRowSpan(): void $query = $xpath->query('/html/body/div/table/tr[2]/td'); self::assertNotFalse($query); - self::assertEquals(1, $query->length); + self::assertCount(1, $query); } /** @@ -191,18 +189,26 @@ public function testWriteRowSpanAndColSpan(): void $query = $xpath->query('/html/body/div/table/tr[1]/td'); self::assertNotFalse($query); - self::assertEquals(3, $query->length); - self::assertEquals('2', $xpath->query('/html/body/div/table/tr[1]/td[2]')->item(0)->attributes->getNamedItem('colspan')->textContent); - self::assertEquals('3', $xpath->query('/html/body/div/table/tr[1]/td[3]')->item(0)->attributes->getNamedItem('rowspan')->textContent); + self::assertCount(3, $query); + + $query = $xpath->query('/html/body/div/table/tr[1]/td[2]'); + self::assertNotFalse($query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('2', $query->item(0)->attributes->getNamedItem('colspan')->textContent); + + $query = $xpath->query('/html/body/div/table/tr[1]/td[3]'); + self::assertNotFalse($query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('3', $query->item(0)->attributes->getNamedItem('rowspan')->textContent); $query = $xpath->query('/html/body/div/table/tr[2]/td'); self::assertNotFalse($query); - self::assertEquals(1, $query->length); + self::assertCount(1, $query); self::assertEquals('3', $xpath->query('/html/body/div/table/tr[2]/td[1]')->item(0)->attributes->getNamedItem('colspan')->textContent); $query = $xpath->query('/html/body/div/table/tr[3]/td'); self::assertNotFalse($query); - self::assertEquals(3, $query->length); + self::assertCount(3, $query); } public function testWriteTitleTextRun(): void @@ -268,7 +274,14 @@ public function testWriteTableLayout(): void $dom = Helper::getAsHTML($phpWord); $xpath = new DOMXPath($dom); - self::assertEquals('table-layout: fixed;', $xpath->query('/html/body/div/table[1]')->item(0)->attributes->getNamedItem('style')->textContent); - self::assertEquals('table-layout: auto;', $xpath->query('/html/body/div/table[2]')->item(0)->attributes->getNamedItem('style')->textContent); + $query = $xpath->query('/html/body/div/table[1]'); + self::assertNotFalse($query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('table-layout: fixed;', $query->item(0)->attributes->getNamedItem('style')->textContent); + + $query = $xpath->query('/html/body/div/table[2]'); + self::assertNotFalse($query); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('table-layout: auto;', $query->item(0)->attributes->getNamedItem('style')->textContent); } } diff --git a/tests/PhpWordTests/Writer/HTML/Helper.php b/tests/PhpWordTests/Writer/HTML/Helper.php index 37f640d28a..f3e0a29d14 100644 --- a/tests/PhpWordTests/Writer/HTML/Helper.php +++ b/tests/PhpWordTests/Writer/HTML/Helper.php @@ -41,14 +41,26 @@ public static function getTextContent(DOMXPath $xpath, string $query, string $na if ($item2 === null) { self::fail('Unexpected null return requesting item'); } elseif ($namedItem !== '') { - $item3 = $item2->attributes->getNamedItem($namedItem); - if ($item3 === null) { - self::fail('Unexpected null return requesting namedItem'); + if (!property_exists('attributes', $item2)) { + self::fail('Unexpected incorrect object'); } else { - $returnVal = $item3->textContent; + $item3 = $item2->attributes->getNamedItem($namedItem); + if ($item3 === null) { + self::fail('Unexpected null return requesting namedItem'); + } else { + if (!property_exists('textContent', $item3)) { + self::fail('Unexpected incorrect object'); + } else { + $returnVal = $item3->textContent; + } + } } } else { - $returnVal = $item2->textContent; + if (!property_exists('textContent', $item2)) { + self::fail('Unexpected incorrect object'); + } else { + $returnVal = $item2->textContent; + } } } @@ -66,6 +78,8 @@ public static function getNamedItem(DOMXPath $xpath, string $query, string $name $item2 = $item->item($itemNumber); if ($item2 === null) { self::fail('Unexpected null return requesting item'); + } elseif (!property_exists('attributes', $item2)) { + self::fail('Unexpected incorrect object'); } else { $returnValue = $item2->attributes->getNamedItem($namedItem); } From 41439f28a41bb63c1bd82a80a3b8fffb544f8375 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:10:17 -0500 Subject: [PATCH 12/17] Again --- tests/PhpWordTests/Writer/HTML/ElementTest.php | 5 +++-- tests/PhpWordTests/Writer/HTML/Helper.php | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/PhpWordTests/Writer/HTML/ElementTest.php b/tests/PhpWordTests/Writer/HTML/ElementTest.php index 3ce6a2712a..7134871566 100644 --- a/tests/PhpWordTests/Writer/HTML/ElementTest.php +++ b/tests/PhpWordTests/Writer/HTML/ElementTest.php @@ -201,10 +201,11 @@ public function testWriteRowSpanAndColSpan(): void self::assertInstanceOf(DOMNode::class, $query->item(0)); self::assertEquals('3', $query->item(0)->attributes->getNamedItem('rowspan')->textContent); - $query = $xpath->query('/html/body/div/table/tr[2]/td'); + $query = $xpath->query('/html/body/div/table/tr[2]/td[1]'); self::assertNotFalse($query); self::assertCount(1, $query); - self::assertEquals('3', $xpath->query('/html/body/div/table/tr[2]/td[1]')->item(0)->attributes->getNamedItem('colspan')->textContent); + self::assertInstanceOf(DOMNode::class, $query->item(0)); + self::assertEquals('3', $query->item(0)->attributes->getNamedItem('colspan')->textContent); $query = $xpath->query('/html/body/div/table/tr[3]/td'); self::assertNotFalse($query); diff --git a/tests/PhpWordTests/Writer/HTML/Helper.php b/tests/PhpWordTests/Writer/HTML/Helper.php index f3e0a29d14..a14b61b6d4 100644 --- a/tests/PhpWordTests/Writer/HTML/Helper.php +++ b/tests/PhpWordTests/Writer/HTML/Helper.php @@ -41,14 +41,14 @@ public static function getTextContent(DOMXPath $xpath, string $query, string $na if ($item2 === null) { self::fail('Unexpected null return requesting item'); } elseif ($namedItem !== '') { - if (!property_exists('attributes', $item2)) { + if (!property_exists($item2, 'attributes')) { self::fail('Unexpected incorrect object'); } else { $item3 = $item2->attributes->getNamedItem($namedItem); if ($item3 === null) { self::fail('Unexpected null return requesting namedItem'); } else { - if (!property_exists('textContent', $item3)) { + if (!property_exists($item3, 'textContent')) { self::fail('Unexpected incorrect object'); } else { $returnVal = $item3->textContent; @@ -56,7 +56,7 @@ public static function getTextContent(DOMXPath $xpath, string $query, string $na } } } else { - if (!property_exists('textContent', $item2)) { + if (!property_exists($item2, 'textContent')) { self::fail('Unexpected incorrect object'); } else { $returnVal = $item2->textContent; @@ -78,7 +78,7 @@ public static function getNamedItem(DOMXPath $xpath, string $query, string $name $item2 = $item->item($itemNumber); if ($item2 === null) { self::fail('Unexpected null return requesting item'); - } elseif (!property_exists('attributes', $item2)) { + } elseif (!property_exists($item2, 'attributes')) { self::fail('Unexpected incorrect object'); } else { $returnValue = $item2->attributes->getNamedItem($namedItem); From a0c4f21328ad6cccca7b80271037bb503ed0ef50 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:14:00 -0500 Subject: [PATCH 13/17] Fix wrong return type --- tests/PhpWordTests/XmlDocument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PhpWordTests/XmlDocument.php b/tests/PhpWordTests/XmlDocument.php index 8c865932ba..82b7a0c900 100644 --- a/tests/PhpWordTests/XmlDocument.php +++ b/tests/PhpWordTests/XmlDocument.php @@ -141,7 +141,7 @@ public function getFileDom(string $file = ''): DOMDocument /** * Get node list. * - * @return DOMNodeList + * @return DOMNodeList|false */ public function getNodeList(string $path, string $file = ''): DOMNodeList { From c8e921040978a9157474e11a77942042d3850bd0 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:25:16 -0500 Subject: [PATCH 14/17] Again --- tests/PhpWordTests/XmlDocument.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/PhpWordTests/XmlDocument.php b/tests/PhpWordTests/XmlDocument.php index 82b7a0c900..73c6983773 100644 --- a/tests/PhpWordTests/XmlDocument.php +++ b/tests/PhpWordTests/XmlDocument.php @@ -141,7 +141,7 @@ public function getFileDom(string $file = ''): DOMDocument /** * Get node list. * - * @return DOMNodeList|false + * @return DOMNodeList */ public function getNodeList(string $path, string $file = ''): DOMNodeList { @@ -157,7 +157,13 @@ public function getNodeList(string $path, string $file = ''): DOMNodeList $this->xpath->registerNamespace('w14', 'http://schemas.microsoft.com/office/word/2010/wordml'); } - return $this->xpath->query($path); + $query = $this->xpath->query($path); + + if ($query === false) { + self::fail('Unexpected false return from xpath query'); + } + + return $query; } /** From 8c14461135cbee0fd12fe7b45181944aea9e8b8b Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:29:32 -0500 Subject: [PATCH 15/17] Again --- tests/PhpWordTests/XmlDocument.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/PhpWordTests/XmlDocument.php b/tests/PhpWordTests/XmlDocument.php index 73c6983773..f03133f1ac 100644 --- a/tests/PhpWordTests/XmlDocument.php +++ b/tests/PhpWordTests/XmlDocument.php @@ -20,6 +20,7 @@ use DOMDocument; use DOMElement; +use DOMNameSpaceNode; use DOMNode; use DOMNodeList; use DOMXPath; @@ -141,7 +142,7 @@ public function getFileDom(string $file = ''): DOMDocument /** * Get node list. * - * @return DOMNodeList + * @return DDOMNodeList|false */ public function getNodeList(string $path, string $file = ''): DOMNodeList { @@ -159,10 +160,6 @@ public function getNodeList(string $path, string $file = ''): DOMNodeList $query = $this->xpath->query($path); - if ($query === false) { - self::fail('Unexpected false return from xpath query'); - } - return $query; } @@ -171,7 +168,13 @@ public function getNodeList(string $path, string $file = ''): DOMNodeList */ public function getElement(string $path, string $file = ''): ?DOMElement { - return $this->getNodeList($path, $file)->item(0); + $element = $this->getNodeList($path, $file)->item(0); + + if ($element === false) { + return null; + } + + return $element; } /** From e260ede37fa13ca3d483a593070cd7405760e267 Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:32:24 -0500 Subject: [PATCH 16/17] Typeo --- tests/PhpWordTests/XmlDocument.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PhpWordTests/XmlDocument.php b/tests/PhpWordTests/XmlDocument.php index f03133f1ac..d0208a6e57 100644 --- a/tests/PhpWordTests/XmlDocument.php +++ b/tests/PhpWordTests/XmlDocument.php @@ -142,7 +142,7 @@ public function getFileDom(string $file = ''): DOMDocument /** * Get node list. * - * @return DDOMNodeList|false + * @return DOMNodeList|false */ public function getNodeList(string $path, string $file = ''): DOMNodeList { From 6fd849525d42be91f6d880f8733fed263756f7ff Mon Sep 17 00:00:00 2001 From: rasamassen Date: Mon, 20 Oct 2025 23:35:40 -0500 Subject: [PATCH 17/17] Undo; don't know how to fix this one --- tests/PhpWordTests/XmlDocument.php | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/tests/PhpWordTests/XmlDocument.php b/tests/PhpWordTests/XmlDocument.php index d0208a6e57..8c865932ba 100644 --- a/tests/PhpWordTests/XmlDocument.php +++ b/tests/PhpWordTests/XmlDocument.php @@ -20,7 +20,6 @@ use DOMDocument; use DOMElement; -use DOMNameSpaceNode; use DOMNode; use DOMNodeList; use DOMXPath; @@ -142,7 +141,7 @@ public function getFileDom(string $file = ''): DOMDocument /** * Get node list. * - * @return DOMNodeList|false + * @return DOMNodeList */ public function getNodeList(string $path, string $file = ''): DOMNodeList { @@ -158,9 +157,7 @@ public function getNodeList(string $path, string $file = ''): DOMNodeList $this->xpath->registerNamespace('w14', 'http://schemas.microsoft.com/office/word/2010/wordml'); } - $query = $this->xpath->query($path); - - return $query; + return $this->xpath->query($path); } /** @@ -168,13 +165,7 @@ public function getNodeList(string $path, string $file = ''): DOMNodeList */ public function getElement(string $path, string $file = ''): ?DOMElement { - $element = $this->getNodeList($path, $file)->item(0); - - if ($element === false) { - return null; - } - - return $element; + return $this->getNodeList($path, $file)->item(0); } /**