Passed
Pull Request — master (#4389)
by Owen
11:40
created

Bin2DecTest::providerUnhappyBIN2DEC()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Calculation\Functions\Engineering;
6
7
use PhpOffice\PhpSpreadsheet\Calculation\Calculation;
8
use PhpOffice\PhpSpreadsheet\Calculation\Engineering\ConvertBinary;
9
use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalculationException;
10
use PhpOffice\PhpSpreadsheet\Calculation\Functions;
11
use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;
12
use PhpOffice\PhpSpreadsheet\Spreadsheet;
13
use PhpOffice\PhpSpreadsheetTests\Calculation\Functions\FormulaArguments;
14
use PHPUnit\Framework\Attributes\DataProvider;
15
use PHPUnit\Framework\TestCase;
16
17
class Bin2DecTest extends TestCase
18
{
19
    private string $compatibilityMode;
20
21
    protected function setUp(): void
22
    {
23
        $this->compatibilityMode = Functions::getCompatibilityMode();
24
    }
25
26
    protected function tearDown(): void
27
    {
28
        Functions::setCompatibilityMode($this->compatibilityMode);
29
    }
30
31
    #[DataProvider('providerBIN2DEC')]
32
    public function testDirectCallToBIN2DEC(float|int|string $expectedResult, bool|int|string $arg1): void
33
    {
34
        $result = ConvertBinary::toDecimal($arg1);
35
        self::assertSame($expectedResult, $result);
36
    }
37
38
    #[DataProvider('providerBIN2DEC')]
39
    public function testBIN2DECAsFormula(mixed $expectedResult, mixed ...$args): void
40
    {
41
        $arguments = new FormulaArguments(...$args);
42
43
        $calculation = Calculation::getInstance();
44
        $formula = "=BIN2DEC({$arguments})";
45
46
        /** @var float|int|string */
47
        $result = $calculation->calculateFormula($formula);
48
        self::assertSame($expectedResult, $result);
49
    }
50
51
    #[DataProvider('providerBIN2DEC')]
52
    public function testBIN2DECInWorksheet(mixed $expectedResult, mixed ...$args): void
53
    {
54
        $arguments = new FormulaArguments(...$args);
55
56
        $spreadsheet = new Spreadsheet();
57
        $worksheet = $spreadsheet->getActiveSheet();
58
        $argumentCells = $arguments->populateWorksheet($worksheet);
59
        $formula = "=BIN2DEC({$argumentCells})";
60
61
        $result = $worksheet->setCellValue('A1', $formula)
62
            ->getCell('A1')
63
            ->getCalculatedValue();
64
        self::assertSame($expectedResult, $result);
65
66
        $spreadsheet->disconnectWorksheets();
67
    }
68
69
    public static function providerBIN2DEC(): array
70
    {
71
        return require 'tests/data/Calculation/Engineering/BIN2DEC.php';
72
    }
73
74
    #[DataProvider('providerUnhappyBIN2DEC')]
75
    public function testBIN2DECUnhappyPath(string $expectedException, mixed ...$args): void
76
    {
77
        $arguments = new FormulaArguments(...$args);
78
79
        $spreadsheet = new Spreadsheet();
80
        $worksheet = $spreadsheet->getActiveSheet();
81
        $argumentCells = $arguments->populateWorksheet($worksheet);
82
        $formula = "=BIN2DEC({$argumentCells})";
83
84
        $this->expectException(CalculationException::class);
85
        $this->expectExceptionMessage($expectedException);
86
        $worksheet->setCellValue('A1', $formula)
87
            ->getCell('A1')
88
            ->getCalculatedValue();
89
90
        $spreadsheet->disconnectWorksheets();
91
    }
92
93
    public static function providerUnhappyBIN2DEC(): array
94
    {
95
        return [
96
            ['Formula Error: Wrong number of arguments for BIN2DEC() function'],
97
        ];
98
    }
99
100
    #[DataProvider('providerBIN2DECOds')]
101
    public function testBIN2DECOds(float|int|string $expectedResult, bool $arg1): void
102
    {
103
        Functions::setCompatibilityMode(
104
            Functions::COMPATIBILITY_OPENOFFICE
105
        );
106
107
        $result = ConvertBinary::toDecimal($arg1);
108
        self::assertSame($expectedResult, $result);
109
    }
110
111
    public static function providerBIN2DECOds(): array
112
    {
113
        return require 'tests/data/Calculation/Engineering/BIN2DECOpenOffice.php';
114
    }
115
116
    public function testBIN2DECFractional(): void
117
    {
118
        $calculation = Calculation::getInstance();
119
        $formula = '=BIN2DEC(101.1)';
120
121
        Functions::setCompatibilityMode(
122
            Functions::COMPATIBILITY_GNUMERIC
123
        );
124
        /** @var float|int|string */
125
        $result = $calculation->calculateFormula($formula);
126
        self::assertSame(5, $result, 'Gnumeric');
127
128
        Functions::setCompatibilityMode(
129
            Functions::COMPATIBILITY_OPENOFFICE
130
        );
131
        /** @var float|int|string */
132
        $result = $calculation->calculateFormula($formula);
133
        self::assertSame(ExcelError::NAN(), $result, 'OpenOffice');
134
135
        Functions::setCompatibilityMode(
136
            Functions::COMPATIBILITY_EXCEL
137
        );
138
        /** @var float|int|string */
139
        $result = $calculation->calculateFormula($formula);
140
        self::assertSame(ExcelError::NAN(), $result, 'Excel');
141
    }
142
143
    #[DataProvider('providerBin2DecArray')]
144
    public function testBin2DecArray(array $expectedResult, string $value): void
145
    {
146
        $calculation = Calculation::getInstance();
147
148
        $formula = "=BIN2DEC({$value})";
149
        $result = $calculation->calculateFormula($formula);
150
        self::assertEquals($expectedResult, $result);
151
    }
152
153
    public static function providerBin2DecArray(): array
154
    {
155
        return [
156
            'row/column vector' => [
157
                [[4, 7, 63, 153, 204, 341]],
158
                '{"100", "111", "111111", "10011001", "11001100", "101010101"}',
159
            ],
160
        ];
161
    }
162
}
163