Failed Conditions
Pull Request — master (#4476)
by Blizzz
11:38
created

ExplicitDateTest::testExplicitDate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 26
rs 9.6333
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
6
7
use DateTime;
8
use PhpOffice\PhpSpreadsheet\IOFactory;
9
use PhpOffice\PhpSpreadsheet\Shared\Date;
10
use PhpOffice\PhpSpreadsheet\Spreadsheet;
11
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
12
13
class ExplicitDateTest extends \PHPUnit\Framework\TestCase
14
{
15
    private static string $testbook = 'tests/data/Reader/XLSX/explicitdate.xlsx';
16
17
    public function testPreliminaries(): void
18
    {
19
        $file = 'zip://';
20
        $file .= self::$testbook;
21
        $file .= '#xl/worksheets/sheet1.xml';
22
        $data = file_get_contents($file);
23
        if ($data === false) {
24
            self::fail('Unable to read file');
25
        } else {
26
            // confirm that file contains type "d" cells
27
            self::assertStringContainsString('<c r="A3" s="1" t="d"><v>2021-12-31T23:44:51.894</v></c>', $data);
28
            self::assertStringContainsString('<c r="B3" s="2" t="d"><v>2021-12-31</v></c>', $data);
29
            self::assertStringContainsString('<c r="C3" s="3" t="d"><v>23:44:51.894</v></c>', $data);
30
        }
31
    }
32
33
    public static function testExplicitDate(): void
34
    {
35
        $spreadsheet = IOFactory::load(self::$testbook);
36
        $sheet = $spreadsheet->getActiveSheet();
37
        // DateTime
38
        $value = $sheet->getCell('A3')->getValue();
39
        $formatted = $sheet->getCell('A3')->getFormattedValue();
40
        self::assertEqualsWithDelta(44561.98948, $value, 0.00001);
41
        self::assertSame('2021-12-31 23:44:52', $formatted);
42
        // Date only
43
        $value = $sheet->getCell('B3')->getValue();
44
        $formatted = $sheet->getCell('B3')->getFormattedValue();
45
        self::assertEquals(44561, $value);
46
        self::assertSame('2021-12-31', $formatted);
47
        // Time only, with seconds
48
        $value = $sheet->getCell('C3')->getValue();
49
        $formatted = $sheet->getCell('C3')->getFormattedValue();
50
        self::assertEqualsWithDelta(0.98948, $value, 0.00001);
51
        self::assertSame('23:44:52', $formatted);
52
        // Time only, full minute
53
        $value = $sheet->getCell('F3')->getValue();
54
        $formatted = $sheet->getCell('F3')->getFormattedValue();
55
        self::assertEqualsWithDelta(0.5673611, $value, 0.00001);
56
        self::assertSame('13:37', $formatted);
57
58
        $spreadsheet->disconnectWorksheets();
59
    }
60
61
    public function testThatDateTimesCanBePersistedAndReread(): void
62
    {
63
        $originalDateTime = new DateTime('2020-10-21T14:55:31');
64
65
        $dateTimeFromSpreadsheet = $this->getDateTimeFrom($this->excelSheetWithDateTime($originalDateTime));
66
        $dateTimeFromSpreadsheetAfterPersistAndReread = $this->getDateTimeFrom($this->persistAndReread($this->excelSheetWithDateTime($originalDateTime)));
67
68
        self::assertEquals($originalDateTime, $dateTimeFromSpreadsheet);
69
        self::assertEquals($originalDateTime, $dateTimeFromSpreadsheetAfterPersistAndReread);
70
    }
71
72
    private function excelSheetWithDateTime(DateTime $dateTime): Spreadsheet
73
    {
74
        $spreadsheet = new Spreadsheet();
75
        $spreadsheet->getActiveSheet()->setCellValue('A1', Date::dateTimeToExcel($dateTime));
76
77
        return $spreadsheet;
78
    }
79
80
    public function getDateTimeFrom(Spreadsheet $spreadsheet): DateTime
81
    {
82
        $value = $spreadsheet->getSheet(0)->getCell('A1')->getCalculatedValue();
83
        self::assertIsNumeric($value);
84
        $value = (float) $value;
85
86
        return Date::excelToDateTimeObject($value);
87
    }
88
89
    private function persistAndReread(Spreadsheet $spreadsheet): Spreadsheet
90
    {
91
        $tempPointer = tmpfile();
92
        $tempFileName = stream_get_meta_data($tempPointer)['uri'] ?? null;
93
        self::assertNotNull($tempFileName, 'Temp file not created');
94
        (new Xlsx($spreadsheet))->save($tempFileName);
95
96
        return (new \PhpOffice\PhpSpreadsheet\Reader\Xlsx())->load($tempFileName);
97
    }
98
}
99