compatibilityMode = Functions::getCompatibilityMode(); } protected function tearDown(): void { Functions::setCompatibilityMode($this->compatibilityMode); $this->sheet = null; if ($this->spreadsheet !== null) { $this->spreadsheet->disconnectWorksheets(); $this->spreadsheet = null; } } protected static function setOpenOffice(): void { Functions::setCompatibilityMode(Functions::COMPATIBILITY_OPENOFFICE); } protected static function setGnumeric(): void { Functions::setCompatibilityMode(Functions::COMPATIBILITY_GNUMERIC); } protected function mightHaveException(mixed $expectedResult): void { if ($expectedResult === 'exception') { $this->expectException(CalcException::class); } } protected function setCell(string $cell, mixed $value): void { if ($value !== null) { if (is_string($value) && is_numeric($value)) { $this->getSheet()->getCell($cell)->setValueExplicit($value, DataType::TYPE_STRING); } else { $this->getSheet()->getCell($cell)->setValue($value); } } } protected function getSpreadsheet(): Spreadsheet { if ($this->spreadsheet !== null) { return $this->spreadsheet; } $this->spreadsheet = new Spreadsheet(); return $this->spreadsheet; } protected function getSheet(): Worksheet { if ($this->sheet !== null) { return $this->sheet; } $this->sheet = $this->getSpreadsheet()->getActiveSheet(); return $this->sheet; } /** * Adjust result if it is close enough to expected by ratio * rather than offset. */ protected function adjustResult(mixed &$result, mixed $expectedResult): void { if (is_numeric($result) && is_numeric($expectedResult)) { if ($expectedResult != 0) { $frac = $result / $expectedResult; if ($frac > 0.999999 && $frac < 1.000001) { $result = $expectedResult; } } } } /** @param mixed[] $args */ public function runTestCase(string $functionName, mixed $expectedResult, array $args): void { $this->mightHaveException($expectedResult); $sheet = $this->getSheet(); $formula = "=$functionName("; $row = 0; $col = 'A'; $comma = ''; foreach ($args as $arg) { ++$row; $cell = "$col$row"; $this->setCell($cell, $arg); $formula .= "$comma$cell"; $comma = ','; } $formula .= ')'; $sheet->getCell('B1')->setValue($formula); $result = $sheet->getCell('B1')->getCalculatedValue(); self::assertEqualsWithDelta($expectedResult, $result, 1.0e-7); } }