Skip to content

Commit f430b16

Browse files
committed
Improve tests
1 parent eb2cd36 commit f430b16

File tree

3 files changed

+112
-7
lines changed

3 files changed

+112
-7
lines changed

src/Column/DateTimeColumn.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ public function dbTypecast(mixed $value): string|ExpressionInterface|null
2727

2828
return match ($this->getType()) {
2929
ColumnType::TIMESTAMP, ColumnType::DATETIME, ColumnType::DATETIMETZ => new Expression("TIMESTAMP '$value'"),
30-
ColumnType::TIME, ColumnType::TIMETZ => new Expression("INTERVAL '$value' DAY(0) TO SECOND"),
30+
ColumnType::TIME, ColumnType::TIMETZ => new Expression(
31+
"INTERVAL '$value' DAY(0) TO SECOND" . (($size = $this->getSize()) !== null ? "($size)" : '')
32+
),
3133
ColumnType::DATE => new Expression("DATE '$value'"),
3234
default => $value,
3335
};
@@ -47,7 +49,6 @@ public function phpTypecast(mixed $value): DateTimeImmutable|null
4749

4850
protected function getFormat(): string
4951
{
50-
/** @psalm-suppress RedundantPropertyInitializationCheck */
5152
return $this->format ??= match ($this->getType()) {
5253
ColumnType::TIME, ColumnType::TIMETZ => '0 H:i:s' . $this->getMillisecondsFormat(),
5354
default => parent::getFormat(),
@@ -56,7 +57,6 @@ protected function getFormat(): string
5657

5758
protected function shouldConvertTimezone(): bool
5859
{
59-
/** @psalm-suppress RedundantPropertyInitializationCheck */
6060
return $this->shouldConvertTimezone ??= !empty($this->dbTimezone) && match ($this->getType()) {
6161
ColumnType::DATETIMETZ,
6262
ColumnType::DATE => false,

tests/ColumnTest.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -225,20 +225,20 @@ public function testColumnInstance(): void
225225
$this->assertInstanceOf(JsonColumn::class, $tableSchema->getColumn('json_col'));
226226
}
227227

228-
/** @dataProvider \Yiisoft\Db\Oracle\Tests\Provider\ColumnProvider::predefinedTypes */
229-
public function testPredefinedType(string $className, string $type, string $phpType): void
228+
#[DataProviderExternal(ColumnProvider::class, 'predefinedTypes')]
229+
public function testPredefinedType(string $className, string $type, string $phpType)
230230
{
231231
parent::testPredefinedType($className, $type, $phpType);
232232
}
233233

234234
#[DataProviderExternal(ColumnProvider::class, 'dbTypecastColumns')]
235-
public function testDbTypecastColumns(ColumnInterface $column, array $values): void
235+
public function testDbTypecastColumns(ColumnInterface $column, array $values)
236236
{
237237
parent::testDbTypecastColumns($column, $values);
238238
}
239239

240240
#[DataProviderExternal(ColumnProvider::class, 'phpTypecastColumns')]
241-
public function testPhpTypecastColumns(ColumnInterface $column, array $values): void
241+
public function testPhpTypecastColumns(ColumnInterface $column, array $values)
242242
{
243243
parent::testPhpTypecastColumns($column, $values);
244244
}

tests/Provider/ColumnProvider.php

+105
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@
44

55
namespace Yiisoft\Db\Oracle\Tests\Provider;
66

7+
use DateTime;
8+
use DateTimeImmutable;
9+
use Yiisoft\Db\Constant\ColumnType;
710
use Yiisoft\Db\Expression\Expression;
811
use Yiisoft\Db\Oracle\Column\BinaryColumn;
912
use Yiisoft\Db\Oracle\Column\BooleanColumn;
13+
use Yiisoft\Db\Oracle\Column\DateTimeColumn;
1014
use Yiisoft\Db\Oracle\Column\JsonColumn;
15+
use Yiisoft\Db\Tests\Support\Stringable;
1116

1217
class ColumnProvider extends \Yiisoft\Db\Tests\Provider\ColumnProvider
1318
{
@@ -16,6 +21,7 @@ public static function predefinedTypes(): array
1621
$values = parent::predefinedTypes();
1722
$values['binary'][0] = BinaryColumn::class;
1823
$values['boolean'][0] = BooleanColumn::class;
24+
$values['datetime'][0] = DateTimeColumn::class;
1925
$values['json'][0] = JsonColumn::class;
2026

2127
return $values;
@@ -41,8 +47,101 @@ public static function dbTypecastColumns(): array
4147
[$expression = new Expression('expression'), $expression],
4248
],
4349
];
50+
$values['timestamp'][0] = new DateTimeColumn(ColumnType::TIMESTAMP, size: 0);
51+
$values['timestamp6'][0] = new DateTimeColumn(ColumnType::TIMESTAMP, size: 6);
52+
$values['datetime'][0] = new DateTimeColumn(size: 0);
53+
$values['datetime6'][0] = new DateTimeColumn(size: 6);
54+
$values['datetimetz'][0] = new DateTimeColumn(ColumnType::DATETIMETZ, size: 0);
55+
$values['datetimetz6'][0] = new DateTimeColumn(ColumnType::DATETIMETZ, size: 6);
56+
$values['time'][0] = new DateTimeColumn(ColumnType::TIME, size: 0);
57+
$values['time6'][0] = new DateTimeColumn(ColumnType::TIME, size: 6);
58+
$values['timetz'][0] = new DateTimeColumn(ColumnType::TIMETZ, size: 0);
59+
$values['timetz6'][0] = new DateTimeColumn(ColumnType::TIMETZ, size: 6);
60+
$values['date'][0] = new DateTimeColumn(ColumnType::DATE);
4461
$values['json'][0] = new JsonColumn();
4562

63+
$values['timetz'] = [
64+
new DateTimeColumn(ColumnType::TIMETZ, size: 0),
65+
[
66+
[null, null],
67+
[null, ''],
68+
[new Expression("INTERVAL '0 00:00:00' DAY(0) TO SECOND(0)"), '2025-04-19'],
69+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), '14:11:35'],
70+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), '14:11:35.123456'],
71+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), '14:11:35 +02:00'],
72+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), '14:11:35.123456 +02:00'],
73+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), '2025-04-19 14:11:35'],
74+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), '2025-04-19 14:11:35.123456'],
75+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), '2025-04-19 14:11:35 +02:00'],
76+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), '2025-04-19 14:11:35.123456 +02:00'],
77+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), '1745071895'],
78+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), '1745071895.123'],
79+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), 1745071895],
80+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), 1745071895.123],
81+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), 51095],
82+
[new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), 51095.123456],
83+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), new DateTimeImmutable('14:11:35 +02:00')],
84+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), new DateTime('14:11:35 +02:00')],
85+
[new Expression("INTERVAL '0 12:11:35' DAY(0) TO SECOND(0)"), new Stringable('14:11:35 +02:00')],
86+
[$expression = new Expression("INTERVAL '0 14:11:35' DAY(0) TO SECOND(0)"), $expression],
87+
],
88+
];
89+
$values['timetz6'] = [
90+
new DateTimeColumn(ColumnType::TIMETZ, size: 6),
91+
[
92+
[null, null],
93+
[null, ''],
94+
[new Expression("INTERVAL '0 00:00:00.000000' DAY(0) TO SECOND(6)"), '2025-04-19'],
95+
[new Expression("INTERVAL '0 14:11:35.000000' DAY(0) TO SECOND(6)"), '14:11:35'],
96+
[new Expression("INTERVAL '0 14:11:35.123456' DAY(0) TO SECOND(6)"), '14:11:35.123456'],
97+
[new Expression("INTERVAL '0 12:11:35.000000' DAY(0) TO SECOND(6)"), '14:11:35 +02:00'],
98+
[new Expression("INTERVAL '0 12:11:35.123456' DAY(0) TO SECOND(6)"), '14:11:35.123456 +02:00'],
99+
[new Expression("INTERVAL '0 14:11:35.000000' DAY(0) TO SECOND(6)"), '2025-04-19 14:11:35'],
100+
[new Expression("INTERVAL '0 14:11:35.123456' DAY(0) TO SECOND(6)"), '2025-04-19 14:11:35.123456'],
101+
[new Expression("INTERVAL '0 12:11:35.000000' DAY(0) TO SECOND(6)"), '2025-04-19 14:11:35 +02:00'],
102+
[new Expression("INTERVAL '0 12:11:35.123456' DAY(0) TO SECOND(6)"), '2025-04-19 14:11:35.123456 +02:00'],
103+
[new Expression("INTERVAL '0 14:11:35.000000' DAY(0) TO SECOND(6)"), '1745071895'],
104+
[new Expression("INTERVAL '0 14:11:35.123000' DAY(0) TO SECOND(6)"), '1745071895.123'],
105+
[new Expression("INTERVAL '0 14:11:35.000000' DAY(0) TO SECOND(6)"), 1745071895],
106+
[new Expression("INTERVAL '0 14:11:35.123000' DAY(0) TO SECOND(6)"), 1745071895.123],
107+
[new Expression("INTERVAL '0 14:11:35.000000' DAY(0) TO SECOND(6)"), 51095],
108+
[new Expression("INTERVAL '0 14:11:35.123456' DAY(0) TO SECOND(6)"), 51095.123456],
109+
[new Expression("INTERVAL '0 12:11:35.123456' DAY(0) TO SECOND(6)"), new DateTimeImmutable('14:11:35.123456 +02:00')],
110+
[new Expression("INTERVAL '0 12:11:35.123456' DAY(0) TO SECOND(6)"), new DateTime('14:11:35.123456 +02:00')],
111+
[new Expression("INTERVAL '0 12:11:35.123456' DAY(0) TO SECOND(6)"), new Stringable('14:11:35.123456 +02:00')],
112+
[$expression = new Expression("INTERVAL '0 14:11:35.123456' DAY(0) TO SECOND(6)"), $expression],
113+
],
114+
];
115+
116+
foreach (['timestamp', 'timestamp6', 'datetime', 'datetime6', 'datetimetz', 'datetimetz6'] as $key) {
117+
foreach ($values[$key][1] as &$value) {
118+
if (is_string($value[0])) {
119+
$value[0] = new Expression("TIMESTAMP '$value[0]'");
120+
}
121+
}
122+
unset($value);
123+
}
124+
125+
foreach ($values['time'][1] as &$value) {
126+
if (is_string($value[0])) {
127+
$value[0] = new Expression("INTERVAL '0 $value[0]' DAY(0) TO SECOND(0)");
128+
}
129+
}
130+
unset($value);
131+
132+
foreach ($values['time6'][1] as &$value) {
133+
if (is_string($value[0])) {
134+
$value[0] = new Expression("INTERVAL '0 $value[0]' DAY(0) TO SECOND(6)");
135+
}
136+
}
137+
unset($value);
138+
139+
foreach ($values['date'][1] as &$value) {
140+
if (is_string($value[0])) {
141+
$value[0] = new Expression("DATE '$value[0]'");
142+
}
143+
}
144+
46145
return $values;
47146
}
48147

@@ -51,6 +150,12 @@ public static function phpTypecastColumns(): array
51150
$values = parent::phpTypecastColumns();
52151
$values['binary'][0] = new BinaryColumn();
53152
$values['boolean'][0] = new BooleanColumn();
153+
$values['timestamp'][0] = new DateTimeColumn(ColumnType::TIMESTAMP);
154+
$values['datetime'][0] = new DateTimeColumn();
155+
$values['datetimetz'][0] = new DateTimeColumn(ColumnType::DATETIMETZ);
156+
$values['time'][0] = new DateTimeColumn(ColumnType::TIME);
157+
$values['timetz'][0] = new DateTimeColumn(ColumnType::TIMETZ);
158+
$values['date'][0] = new DateTimeColumn(ColumnType::DATE);
54159
$values['json'][0] = new JsonColumn();
55160

56161
return $values;

0 commit comments

Comments
 (0)