createMock(\DOMNodeList::class); $nodeListMock ->expects($this->atLeastOnce()) ->method('item') ->with(0) ->will($this->returnValue((object) ['nodeValue' => $nodeValue])); $nodeMock = $this->createMock(\DOMElement::class); $nodeMock ->expects($this->atLeastOnce()) ->method('getAttribute') ->will($this->returnValueMap([ [CellValueFormatter::XML_ATTRIBUTE_TYPE, CellValueFormatter::CELL_TYPE_NUMERIC], [CellValueFormatter::XML_ATTRIBUTE_STYLE_ID, 123], ])); $nodeMock ->expects($this->atLeastOnce()) ->method('getElementsByTagName') ->with(CellValueFormatter::XML_NODE_VALUE) ->will($this->returnValue($nodeListMock)); /** @var StyleManager|\PHPUnit_Framework_MockObject_MockObject $styleManagerMock */ $styleManagerMock = $this->createMock(StyleManager::class); $styleManagerMock ->expects($this->once()) ->method('shouldFormatNumericValueAsDate') ->with(123) ->will($this->returnValue(true)); $formatter = new CellValueFormatter(null, $styleManagerMock, false, $shouldUse1904Dates, new Escaper\XLSX()); try { $result = $formatter->extractAndFormatNodeValue($nodeMock); if ($expectedDateAsString === null) { $this->fail('An exception should have been thrown'); } else { $this->assertInstanceOf(\DateTime::class, $result); $this->assertSame($expectedDateAsString, $result->format('Y-m-d H:i:s')); } } catch (InvalidValueException $exception) { // do nothing } } /** * @return array */ public function dataProviderForTestFormatNumericCellValueWithNumbers() { // Some test values exceed PHP_INT_MAX on 32-bit PHP. They are // therefore converted to as doubles automatically by PHP. $expectedBigNumberType = (PHP_INT_SIZE < 8 ? 'double' : 'integer'); return [ [42, 42, 'integer'], [42.5, 42.5, 'double'], [-42, -42, 'integer'], [-42.5, -42.5, 'double'], ['42', 42, 'integer'], ['42.5', 42.5, 'double'], [865640023012945, 865640023012945, $expectedBigNumberType], ['865640023012945', 865640023012945, $expectedBigNumberType], [865640023012945.5, 865640023012945.5, 'double'], ['865640023012945.5', 865640023012945.5, 'double'], [PHP_INT_MAX, PHP_INT_MAX, 'integer'], [~PHP_INT_MAX + 1, ~PHP_INT_MAX + 1, 'integer'], // ~PHP_INT_MAX === PHP_INT_MIN, PHP_INT_MIN being PHP7+ [PHP_INT_MAX + 1, PHP_INT_MAX + 1, 'double'], ]; } /** * @dataProvider dataProviderForTestFormatNumericCellValueWithNumbers * * @param int|float|string $value * @param int|float $expectedFormattedValue * @param string $expectedType * @return void */ public function testFormatNumericCellValueWithNumbers($value, $expectedFormattedValue, $expectedType) { /** @var StyleManager|\PHPUnit_Framework_MockObject_MockObject $styleManagerMock */ $styleManagerMock = $this->createMock(StyleManager::class); $styleManagerMock ->expects($this->once()) ->method('shouldFormatNumericValueAsDate') ->will($this->returnValue(false)); $formatter = new CellValueFormatter(null, $styleManagerMock, false, false, new Escaper\XLSX()); $formattedValue = \ReflectionHelper::callMethodOnObject($formatter, 'formatNumericCellValue', $value, 0); $this->assertEquals($expectedFormattedValue, $formattedValue); $this->assertEquals($expectedType, gettype($formattedValue)); } /** * @return array */ public function dataProviderForTestFormatStringCellValue() { return [ ['A', 'A'], [' A ', ' A '], ["\n\tA\n\t", "\n\tA\n\t"], [' ', ' '], ]; } /** * @dataProvider dataProviderForTestFormatStringCellValue * * @param string $value * @param string $expectedFormattedValue * @return void */ public function testFormatInlineStringCellValue($value, $expectedFormattedValue) { $nodeListMock = $this->createMock(\DOMNodeList::class); $nodeListMock ->expects($this->atLeastOnce()) ->method('count') ->willReturn(1); $nodeListMock ->expects($this->atLeastOnce()) ->method('item') ->with(0) ->willReturn((object) ['nodeValue' => $value]); $nodeMock = $this->createMock(\DOMElement::class); $nodeMock ->expects($this->atLeastOnce()) ->method('getElementsByTagName') ->with(CellValueFormatter::XML_NODE_INLINE_STRING_VALUE) ->willReturn($nodeListMock); $formatter = new CellValueFormatter(null, null, false, false, new Escaper\XLSX()); $formattedValue = \ReflectionHelper::callMethodOnObject($formatter, 'formatInlineStringCellValue', $nodeMock); $this->assertEquals($expectedFormattedValue, $formattedValue); } }