Skip to content

Commit 440381f

Browse files
committed
issue 78 tests
1 parent 85fe93d commit 440381f

File tree

4 files changed

+88
-20
lines changed

4 files changed

+88
-20
lines changed

src/XBase/Record.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,18 @@ public function getDateTime($columnName)
269269
return $longdate + ($inttime / 1000);
270270
}
271271

272+
/**
273+
* Get DATE(D) or DATETIME(T) data as object of \DateTime class
274+
*/
275+
public function getDateTimeObject(string $columnName): \DateTime
276+
{
277+
$column = $this->getColumn($columnName);
278+
if (!in_array($column->getType(), [self::DBFFIELD_TYPE_DATE, self::DBFFIELD_TYPE_DATETIME])) {
279+
trigger_error($column->getName().' is not a Date or DateTime column', E_USER_ERROR);
280+
}
281+
return new \DateTime($this->forceGetString($columnName));
282+
}
283+
272284
/**
273285
* @param string $columnName
274286
*
@@ -447,7 +459,7 @@ public function setString($columnObj, $value)
447459
if ($columnObj->getType() == self::DBFFIELD_TYPE_CHAR) {
448460
$this->forceSetString($columnObj, $value);
449461
} else {
450-
if ($columnObj->getType() == self::DBFFIELD_TYPE_DATETIME || $columnObj->getType() == self::DBFFIELD_TYPE_DATE) {
462+
if (($columnObj->getType() == self::DBFFIELD_TYPE_DATETIME || $columnObj->getType() == self::DBFFIELD_TYPE_DATE) && is_string($value)) {
451463
$value = strtotime($value);
452464
}
453465

@@ -541,7 +553,8 @@ public function setDate($columnObj, $value)
541553
}
542554

543555
if ($value instanceof \DateTimeInterface) {
544-
$value = $value->format('U');
556+
$this->forceSetString($columnObj, $value->format('Ymd'));
557+
return false;
545558
}
546559

547560
if (strlen($value) == 0) {
@@ -564,6 +577,10 @@ public function setDateTime($columnObj, $value)
564577
trigger_error($columnObj->getName().' is not a DateTime column', E_USER_ERROR);
565578
}
566579

580+
if ($value instanceof \DateTimeInterface) {
581+
$value = $value->format('U');
582+
}
583+
567584
if (strlen($value) == 0) {
568585
$this->forceSetString($columnObj, '');
569586
return false;

src/XBase/Table.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ protected function readHeader()
120120
}
121121

122122
/* some checking */
123+
clearstatcache();
123124
if ($this->headerLength > filesize($this->tableName)) {
124125
throw new TableException(sprintf('File %s is not DBF', $this->tableName));
125126
}

tests/Resources/socios.dbf

10.9 KB
Binary file not shown.

tests/WritableTableTest.php

Lines changed: 68 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace XBase\Tests;
44

55
use PHPUnit\Framework\TestCase;
6+
use XBase\Enum\TableType;
67
use XBase\Record;
78
use XBase\Table;
89
use XBase\WritableTable;
@@ -11,13 +12,18 @@ class WritableTableTest extends TestCase
1112
{
1213
const FILEPATH = __DIR__.'/Resources/cbr_072019b1.dbf';
1314

14-
public function testSet()
15+
private function duplicateFile(string $file): string
1516
{
16-
$info = pathinfo(self::FILEPATH);
17+
$info = pathinfo($file);
1718
$newName = uniqid($info['filename']);
1819
$copyTo = "{$info['dirname']}/$newName.{$info['extension']}";
19-
self::assertTrue(copy(self::FILEPATH, $copyTo));
20+
self::assertTrue(copy($file, $copyTo));
21+
return $copyTo;
22+
}
2023

24+
public function testSet()
25+
{
26+
$copyTo = $this->duplicateFile(self::FILEPATH);
2127
try {
2228
$table = new WritableTable($copyTo, null, 'cp866');
2329
$table->openWrite();
@@ -42,11 +48,7 @@ public function testSet()
4248
*/
4349
public function testAppendRecord()
4450
{
45-
$info = pathinfo(self::FILEPATH);
46-
$newName = uniqid($info['filename']);
47-
$copyTo = "{$info['dirname']}/$newName.{$info['extension']}";
48-
self::assertTrue(copy(self::FILEPATH, $copyTo));
49-
51+
$copyTo = $this->duplicateFile(self::FILEPATH);
5052
try {
5153
$table = new WritableTable($copyTo, null, 'cp866');
5254
$table->openWrite();
@@ -65,6 +67,10 @@ public function testAppendRecord()
6567
$table->writeRecord();
6668
$table->close();
6769

70+
clearstatcache();
71+
$expectedSize = $table->headerLength + ($table->recordCount * $table->recordByteLength); // Last byte must be 0x1A
72+
self::assertSame($expectedSize, filesize($copyTo));
73+
6874
$table = new Table($copyTo, null, 'cp866');
6975
self::assertEquals(11, $table->getRecordCount());
7076
$record = $table->pickRecord(10);
@@ -85,11 +91,7 @@ public function testAppendRecord()
8591

8692
public function testDeleteRecord()
8793
{
88-
$info = pathinfo(self::FILEPATH);
89-
$newName = uniqid($info['filename']);
90-
$copyTo = "{$info['dirname']}/$newName.{$info['extension']}";
91-
self::assertTrue(copy(self::FILEPATH, $copyTo));
92-
94+
$copyTo = $this->duplicateFile(self::FILEPATH);
9395
try {
9496
$table = new WritableTable($copyTo, null, 'cp866');
9597
$table->openWrite();
@@ -110,11 +112,7 @@ public function testDeleteRecord()
110112

111113
public function testDeletePackRecord()
112114
{
113-
$info = pathinfo(self::FILEPATH);
114-
$newName = uniqid($info['filename']);
115-
$copyTo = "{$info['dirname']}/$newName.{$info['extension']}";
116-
self::assertTrue(copy(self::FILEPATH, $copyTo));
117-
115+
$copyTo = $this->duplicateFile(self::FILEPATH);
118116
try {
119117
$table = new WritableTable($copyTo, null, 'cp866');
120118
$table->openWrite();
@@ -130,4 +128,56 @@ public function testDeletePackRecord()
130128
unlink($copyTo);
131129
}
132130
}
131+
132+
public function testIssue78()
133+
{
134+
$fecnacim = date("m/d/Y", 86400);
135+
$fecingreso = date("m/d/Y", 86400 * 2);
136+
137+
$copyTo = $this->duplicateFile(__DIR__.'/Resources/socios.dbf');
138+
try {
139+
$table = new WritableTable($copyTo);
140+
self::assertEquals(3, $table->getRecordCount());
141+
$table->openWrite();
142+
// fill new newRecord
143+
$newRecord = $table->appendRecord();
144+
$newRecord->segsocial = '000000000000';
145+
$newRecord->socio = 'socio';
146+
$newRecord->apellido = 'apellido';
147+
$newRecord->nombre = 'nombre';
148+
$newRecord->fecnacim = $fecnacim;
149+
$newRecord->fecingreso = $fecingreso;
150+
$newRecord->sexo = 'M';
151+
$newRecord->apartado = '600';
152+
$newRecord->telefonor = '12345678';
153+
$newRecord->email = '[email protected]';
154+
$newRecord->venciced = \DateTime::createFromFormat("U", -777859200);
155+
$newRecord->nriesgo = "B";
156+
//save
157+
$table->writeRecord();
158+
$table->pack();
159+
$table->close();
160+
unset($newRecord);
161+
162+
$table = new Table($copyTo);
163+
self::assertEquals(4, $table->getRecordCount());
164+
$record = $table->pickRecord(3);
165+
self::assertEquals('000000000000', $record->segsocial);
166+
self::assertSame('socio', $record->socio);
167+
self::assertSame('apellido', $record->apellido);
168+
self::assertSame('nombre', $record->nombre);
169+
self::assertSame(86400, $record->getDate('fecnacim'));
170+
self::assertSame($fecnacim, $record->getDateTimeObject('fecnacim')->format('m/d/Y'));
171+
self::assertSame($fecingreso, $record->getDateTimeObject('fecingreso')->format('m/d/Y'));
172+
self::assertSame('M', $record->sexo);
173+
self::assertSame('600', $record->apartado);
174+
self::assertSame('12345678', $record->telefonor);
175+
self::assertSame('[email protected]', $record->email);
176+
self::assertSame('1945-05-09', $record->getDateTimeObject('venciced')->format('Y-m-d'));
177+
self::assertSame("B", $record->nriesgo);
178+
$table->close();
179+
} finally {
180+
unlink($copyTo);
181+
}
182+
}
133183
}

0 commit comments

Comments
 (0)