Passed
Pull Request — master (#4115)
by Owen
15:19
created

TruncTest::testTooMuchPrecision()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 21
c 1
b 0
f 0
dl 0
loc 30
rs 9.584
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\MathTrig;
6
7
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
8
9
class TruncTest extends AllSetupTeardown
10
{
11
    /**
12
     * @dataProvider providerTRUNC
13
     */
14
    public function testTRUNC(mixed $expectedResult, string $formula): void
15
    {
16
        $this->mightHaveException($expectedResult);
17
        $sheet = $this->getSheet();
18
        $sheet->setCellValue('A2', 1.3);
19
        $sheet->setCellValue('A3', 2.7);
20
        $sheet->setCellValue('A4', -3.8);
21
        $sheet->setCellValue('A5', -5.2);
22
        $sheet->getCell('A1')->setValue("=TRUNC($formula)");
23
        $result = $sheet->getCell('A1')->getCalculatedValue();
24
        self::assertEqualsWithDelta($expectedResult, $result, 1E-12);
25
    }
26
27
    public static function providerTRUNC(): array
28
    {
29
        return require 'tests/data/Calculation/MathTrig/TRUNC.php';
30
    }
31
32
    /**
33
     * @dataProvider providerTruncArray
34
     */
35
    public function testTruncArray(array $expectedResult, string $argument1, string $argument2): void
36
    {
37
        $calculation = Calculation::getInstance();
38
39
        $formula = "=TRUNC({$argument1}, {$argument2})";
40
        $result = $calculation->_calculateFormulaValue($formula);
41
        self::assertEqualsWithDelta($expectedResult, $result, 1.0e-14);
42
    }
43
44
    public static function providerTruncArray(): array
45
    {
46
        return [
47
            'matrix' => [[[3.14, 3.141], [3.14159, 3.14159265]], '3.1415926536', '{2, 3; 5, 8}'],
48
        ];
49
    }
50
51
    public function testTooMuchPrecision(): void
52
    {
53
        // This test is pretty screwy. Possibly shouldn't even attempt it.
54
        // At any rate, these results seem to indicate that PHP
55
        // maximum precision is PHP_FLOAT_DIG - 1 digits, not PHP_FLOAT_DIG.
56
        // If that changes, at least one of these tests will have to change.
57
        $sheet = $this->getSheet();
58
        $sheet->getCell('E1')->setValue(10.0 ** (PHP_FLOAT_DIG - 3) + 1.2);
59
        $sheet->getCell('E2')->setValue('=TRUNC(E1,1)');
60
        $result = $sheet->getCell('E2')->getCalculatedValue();
61
        $expectedResult = '1' . str_repeat('0', PHP_FLOAT_DIG - 4) . '1.2';
62
        self::assertSame($expectedResult, (string) $result);
63
64
        $sheet->getCell('F1')->setValue(10.0 ** (PHP_FLOAT_DIG - 2) + 1.2);
65
        $sheet->getCell('F2')->setValue('=TRUNC(F1,1)');
66
        $result = $sheet->getCell('F2')->getCalculatedValue();
67
        $expectedResult = '1' . str_repeat('0', PHP_FLOAT_DIG - 3) . '1';
68
        self::assertSame($expectedResult, (string) $result);
69
70
        $sheet->getCell('G1')->setValue(10.0 ** (PHP_FLOAT_DIG - 1) + 1.2);
71
        $sheet->getCell('G2')->setValue('=TRUNC(G1,1)');
72
        $result = $sheet->getCell('G2')->getCalculatedValue();
73
        $expectedResult = '1.0E+' . (PHP_FLOAT_DIG - 1);
74
        self::assertSame($expectedResult, (string) $result);
75
76
        $sheet->getCell('H1')->setValue(10.0 ** PHP_FLOAT_DIG + 1.2);
77
        $sheet->getCell('H2')->setValue('=TRUNC(H1,1)');
78
        $result = $sheet->getCell('H2')->getCalculatedValue();
79
        $expectedResult = '1.0E+' . PHP_FLOAT_DIG;
80
        self::assertSame($expectedResult, (string) $result);
81
    }
82
}
83