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()]); } 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/Element/TableTest.php b/tests/PhpWordTests/Writer/HTML/Element/TableTest.php index cd0bafaab0..285db16d14 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; @@ -161,7 +162,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]); } @@ -197,7 +200,7 @@ public function testWriteTableCellVAlign(): void $cell3Query = $xpath->query('//table/tr/td[3]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); - + self::assertInstanceOf(DOMNode::class, $cell3Query->item(0)); $cell3Style = $cell3Query->item(0)->attributes->getNamedItem('style'); self::assertNull($cell3Style); } @@ -230,6 +233,7 @@ public function testWriteTableCellVMerge(): void $cell3Query = $xpath->query('//table/tr[3]/td[1]'); self::assertNotFalse($cell3Query); self::assertCount(1, $cell3Query); + self::assertInstanceOf(DOMNode::class, $cell3Query->item(0)); self::assertNull($cell3Query->item(0)->attributes->getNamedItem('rowspan')); } } diff --git a/tests/PhpWordTests/Writer/HTML/ElementTest.php b/tests/PhpWordTests/Writer/HTML/ElementTest.php index 3b2580381f..7134871566 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; @@ -77,8 +78,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,14 +106,20 @@ 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); - 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); - - 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')); + $query = $xpath->query('/html/body/div/table/tr[1]/td'); + self::assertNotFalse($query); + 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::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')); } /** @@ -135,9 +146,18 @@ 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); - 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[1]/td'); + self::assertNotFalse($query); + self::assertCount(2, $query); + + $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::assertCount(1, $query); } /** @@ -167,14 +187,29 @@ 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); - 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); - 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[1]/td'); + self::assertNotFalse($query); + 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[1]'); + self::assertNotFalse($query); + self::assertCount(1, $query); + 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); + self::assertCount(3, $query); } public function testWriteTitleTextRun(): void @@ -240,7 +275,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/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/Helper.php b/tests/PhpWordTests/Writer/HTML/Helper.php index 37f640d28a..a14b61b6d4 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($item2, 'attributes')) { + 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($item3, 'textContent')) { + self::fail('Unexpected incorrect object'); + } else { + $returnVal = $item3->textContent; + } + } } } else { - $returnVal = $item2->textContent; + if (!property_exists($item2, 'textContent')) { + 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($item2, 'attributes')) { + self::fail('Unexpected incorrect object'); } else { $returnValue = $item2->attributes->getNamedItem($namedItem); } 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]); }