diff --git a/src/XBase/DataConverter/Field/VisualFoxpro/DateTimeConverter.php b/src/XBase/DataConverter/Field/VisualFoxpro/DateTimeConverter.php index 9989c3d..2a9d140 100644 --- a/src/XBase/DataConverter/Field/VisualFoxpro/DateTimeConverter.php +++ b/src/XBase/DataConverter/Field/VisualFoxpro/DateTimeConverter.php @@ -18,11 +18,15 @@ public static function getType(): string public function fromBinaryString(string $value): ?\DateTimeInterface { + if (empty($value)) { + return null; + } + $buf = unpack('i*', $value); $intDate = $buf[1]; $intTime = $buf[2]; - if (0 == $intDate && 0 == $intTime) { + if (0 === $intDate && 0 === $intTime) { return null; } diff --git a/tests/Record/DataConverter/Field/VisualFoxpro/DateTimeConverterTest.php b/tests/Record/DataConverter/Field/VisualFoxpro/DateTimeConverterTest.php new file mode 100644 index 0000000..7f2cf5a --- /dev/null +++ b/tests/Record/DataConverter/Field/VisualFoxpro/DateTimeConverterTest.php @@ -0,0 +1,73 @@ + + * + * @coversDefaultClass \XBase\DataConverter\Field\VisualFoxpro\DateTimeConverter + */ +class DateTimeConverterTest extends TestCase +{ + /** + * @covers ::fromBinaryString + * @dataProvider dataFromBinaryString + */ + public function testFromBinaryString(string $base64Value, string $expectedDateSting): void + { + $table = $this->createMock(Table::class); + $column = $this->createMock(ColumnInterface::class); + + $converter = new DateTimeConverter($table, $column); + $dt = $converter->fromBinaryString(base64_decode($base64Value)); + self::assertInstanceOf(\DateTimeInterface::class, $dt); + self::assertSame($expectedDateSting, $dt->format(DATE_ATOM)); + } + + /** + * @covers ::toBinaryString + * @dataProvider dataFromBinaryString + */ + public function testToBinaryString(string $base64Value, string $dateSting): void + { + $table = $this->createMock(Table::class); + $column = $this->createMock(ColumnInterface::class); + + $converter = new DateTimeConverter($table, $column); + $string = $converter->toBinaryString(\DateTime::createFromFormat(DATE_ATOM, $dateSting)); + self::assertSame($base64Value, base64_encode($string)); + } + + public function dataFromBinaryString() + { + yield ['AUskAMjcNwA=', '1800-01-01T01:01:01+00:00']; + yield ['jD0lAAAAAAA=', '1970-01-01T00:00:00+00:00']; + yield ['FIUlAKA/XQQ=', '2020-02-20T20:20:20+00:00']; + } + + /** + * Must return null. + * + * @covers ::fromBinaryString + * @dataProvider dataFromBinaryStringNull + */ + public function testFromBinaryStringNull(string $base64Value): void + { + $table = $this->createMock(Table::class); + $column = $this->createMock(ColumnInterface::class); + + $converter = new DateTimeConverter($table, $column); + self::assertNull($converter->fromBinaryString(base64_decode($base64Value))); + } + + public function dataFromBinaryStringNull() + { + yield ['AAAAAAAAAAA=']; + yield ['']; + } +} diff --git a/tests/Writable/DBase3TableTest.php b/tests/Writable/DBase3TableTest.php index ec1503e..28d605d 100644 --- a/tests/Writable/DBase3TableTest.php +++ b/tests/Writable/DBase3TableTest.php @@ -37,4 +37,4 @@ public function testAppendRecord(): void self::assertSame('test name', $record->get('name')); self::assertSame($newBio, $record->get('bio')); } -} \ No newline at end of file +}