Merge pull request #19552 from kamil-tekiela/Fix-default-values
[phpmyadmin.git] / tests / unit / TypesTest.php
blob9da55a21ec36f53069481c2003788b5ec7424d00
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin\Tests;
7 use PhpMyAdmin\Dbal\DatabaseInterface;
8 use PhpMyAdmin\TypeClass;
9 use PhpMyAdmin\Types;
10 use PHPUnit\Framework\Attributes\CoversClass;
11 use PHPUnit\Framework\Attributes\DataProvider;
13 #[CoversClass(Types::class)]
14 class TypesTest extends AbstractTestCase
16 protected Types $object;
18 /**
19 * Sets up the fixture, for example, opens a network connection.
20 * This method is called before a test is executed.
22 protected function setUp(): void
24 parent::setUp();
26 DatabaseInterface::$instance = $this->createDatabaseInterface();
27 $this->object = new Types(DatabaseInterface::getInstance());
30 /**
31 * Test for isUnaryOperator
33 public function testUnary(): void
35 self::assertTrue($this->object->isUnaryOperator('IS NULL'));
36 self::assertFalse($this->object->isUnaryOperator('='));
39 /**
40 * Test for getting type operators
42 * @param string $type Type of field
43 * @param bool $null Whether field can be NULL
44 * @param string|string[] $output Expected output
46 #[DataProvider('providerForGetTypeOperators')]
47 public function testGetTypeOperators(string $type, bool $null, string|array $output): void
49 self::assertSame(
50 $output,
51 $this->object->getTypeOperators($type, $null),
55 /**
56 * data provider for testGetTypeOperators
58 * @return array<array{string, bool, string|string[]}>
60 public static function providerForGetTypeOperators(): array
62 return [
63 ['enum', false, ['=', '!=']],
65 'CHAR',
66 true,
68 'LIKE %...%',
69 'LIKE',
70 'NOT LIKE',
71 'NOT LIKE %...%',
72 '=',
73 '!=',
74 'REGEXP',
75 'REGEXP ^...$',
76 'NOT REGEXP',
77 '= \'\'',
78 '!= \'\'',
79 'IN (...)',
80 'NOT IN (...)',
81 'BETWEEN',
82 'NOT BETWEEN',
83 'IS NULL',
84 'IS NOT NULL',
88 'int',
89 false,
91 '=',
92 '>',
93 '>=',
94 '<',
95 '<=',
96 '!=',
97 'LIKE',
98 'LIKE %...%',
99 'NOT LIKE',
100 'NOT LIKE %...%',
101 'IN (...)',
102 'NOT IN (...)',
103 'BETWEEN',
104 'NOT BETWEEN',
108 'UUID',
109 false,
110 ['=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'NOT LIKE %...%', 'IN (...)', 'NOT IN (...)'],
113 'UUID',
114 true,
116 '=',
117 '!=',
118 'LIKE',
119 'LIKE %...%',
120 'NOT LIKE',
121 'NOT LIKE %...%',
122 'IN (...)',
123 'NOT IN (...)',
124 'IS NULL',
125 'IS NOT NULL',
132 * Test for getTypeOperatorsHtml
134 * @param string $type Type of field
135 * @param bool $null Whether field can be NULL
136 * @param string $selectedOperator Option to be selected
137 * @param string $output Expected output
139 #[DataProvider('providerForTestGetTypeOperatorsHtml')]
140 public function testGetTypeOperatorsHtml(
141 string $type,
142 bool $null,
143 string $selectedOperator,
144 string $output,
145 ): void {
146 self::assertSame(
147 $output,
148 $this->object->getTypeOperatorsHtml($type, $null, $selectedOperator),
153 * Provider for testGetTypeOperatorsHtml
155 * @return array<array{string, bool, string, string}>
157 public static function providerForTestGetTypeOperatorsHtml(): array
159 return [
160 ['enum', false, '=', '<option value="=" selected>=</option><option value="!=">!=</option>'],
165 * Test for getTypeDescription
167 * @param string $type The data type to get a description.
169 #[DataProvider('providerForTestGetTypeDescription')]
170 public function testGetTypeDescription(string $type): void
172 self::assertNotSame(
174 $this->object->getTypeDescription($type),
179 * Test for getTypeDescription with unknown value
181 public function testGetUnknownTypeDescription(): void
183 self::assertSame(
185 $this->object->getTypeDescription('UNKNOWN'),
190 * Provider for testGetTypeDescription
192 * @return array<array{string}>
194 public static function providerForTestGetTypeDescription(): array
196 return [
197 ['TINYINT'],
198 ['SMALLINT'],
199 ['MEDIUMINT'],
200 ['INT'],
201 ['BIGINT'],
202 ['DECIMAL'],
203 ['FLOAT'],
204 ['DOUBLE'],
205 ['REAL'],
206 ['BIT'],
207 ['BOOLEAN'],
208 ['SERIAL'],
209 ['DATE'],
210 ['DATETIME'],
211 ['TIMESTAMP'],
212 ['TIME'],
213 ['YEAR'],
214 ['CHAR'],
215 ['VARCHAR'],
216 ['TINYTEXT'],
217 ['TEXT'],
218 ['MEDIUMTEXT'],
219 ['LONGTEXT'],
220 ['BINARY'],
221 ['VARBINARY'],
222 ['TINYBLOB'],
223 ['MEDIUMBLOB'],
224 ['BLOB'],
225 ['LONGBLOB'],
226 ['ENUM'],
227 ['SET'],
228 ['GEOMETRY'],
229 ['POINT'],
230 ['LINESTRING'],
231 ['POLYGON'],
232 ['MULTIPOINT'],
233 ['MULTILINESTRING'],
234 ['MULTIPOLYGON'],
235 ['GEOMETRYCOLLECTION'],
236 ['JSON'],
237 ['INET6'],
238 ['UUID'],
243 * @param TypeClass $class The class to get function list.
244 * @param string[] $output Expected function list
246 #[DataProvider('providerFortTestGetFunctionsClass')]
247 public function testGetFunctionsClass(TypeClass $class, array $output): void
249 self::assertSame(
250 $output,
251 $this->object->getFunctionsClass($class),
255 /** @return array<array{TypeClass, string[]}> */
256 public static function providerFortTestGetFunctionsClass(): array
258 return [
260 TypeClass::Char,
262 'AES_DECRYPT',
263 'AES_ENCRYPT',
264 'BIN',
265 'CHAR',
266 'COMPRESS',
267 'CURRENT_USER',
268 'DATABASE',
269 'DAYNAME',
270 'DES_DECRYPT',
271 'DES_ENCRYPT',
272 'ENCRYPT',
273 'HEX',
274 'INET6_NTOA',
275 'INET_NTOA',
276 'LOAD_FILE',
277 'LOWER',
278 'LTRIM',
279 'MD5',
280 'MONTHNAME',
281 'OLD_PASSWORD',
282 'PASSWORD',
283 'QUOTE',
284 'REVERSE',
285 'RTRIM',
286 'SHA1',
287 'SHA2',
288 'SOUNDEX',
289 'SPACE',
290 'TRIM',
291 'UNCOMPRESS',
292 'UNHEX',
293 'UPPER',
294 'USER',
295 'UUID',
296 'VERSION',
300 TypeClass::Date,
302 'CURRENT_DATE',
303 'CURRENT_TIME',
304 'DATE',
305 'FROM_DAYS',
306 'FROM_UNIXTIME',
307 'LAST_DAY',
308 'NOW',
309 'SEC_TO_TIME',
310 'SYSDATE',
311 'TIME',
312 'TIMESTAMP',
313 'UTC_DATE',
314 'UTC_TIME',
315 'UTC_TIMESTAMP',
316 'YEAR',
320 TypeClass::Spatial,
322 'ST_GeomFromText',
323 'ST_GeomFromWKB',
325 'ST_GeomCollFromText',
326 'ST_LineFromText',
327 'ST_MLineFromText',
328 'ST_PointFromText',
329 'ST_MPointFromText',
330 'ST_PolyFromText',
331 'ST_MPolyFromText',
333 'ST_GeomCollFromWKB',
334 'ST_LineFromWKB',
335 'ST_MLineFromWKB',
336 'ST_PointFromWKB',
337 'ST_MPointFromWKB',
338 'ST_PolyFromWKB',
339 'ST_MPolyFromWKB',
343 TypeClass::Number,
345 'ABS',
346 'ACOS',
347 'ASCII',
348 'ASIN',
349 'ATAN',
350 'BIT_LENGTH',
351 'BIT_COUNT',
352 'CEILING',
353 'CHAR_LENGTH',
354 'CONNECTION_ID',
355 'COS',
356 'COT',
357 'CRC32',
358 'DAYOFMONTH',
359 'DAYOFWEEK',
360 'DAYOFYEAR',
361 'DEGREES',
362 'EXP',
363 'FLOOR',
364 'HOUR',
365 'INET6_ATON',
366 'INET_ATON',
367 'LENGTH',
368 'LN',
369 'LOG',
370 'LOG2',
371 'LOG10',
372 'MICROSECOND',
373 'MINUTE',
374 'MONTH',
375 'OCT',
376 'ORD',
377 'PI',
378 'QUARTER',
379 'RADIANS',
380 'RAND',
381 'ROUND',
382 'SECOND',
383 'SIGN',
384 'SIN',
385 'SQRT',
386 'TAN',
387 'TO_DAYS',
388 'TO_SECONDS',
389 'TIME_TO_SEC',
390 'UNCOMPRESSED_LENGTH',
391 'UNIX_TIMESTAMP',
392 'UUID_SHORT',
393 'WEEK',
394 'WEEKDAY',
395 'WEEKOFYEAR',
396 'YEARWEEK',
399 [TypeClass::Unknown, []],
404 * Test for getAllFunctions
406 public function testGetAllFunctions(): void
408 self::assertSame(
410 'ABS',
411 'ACOS',
412 'AES_DECRYPT',
413 'AES_ENCRYPT',
414 'ASCII',
415 'ASIN',
416 'ATAN',
417 'BIN',
418 'BIT_COUNT',
419 'BIT_LENGTH',
420 'CEILING',
421 'CHAR',
422 'CHAR_LENGTH',
423 'COMPRESS',
424 'CONNECTION_ID',
425 'COS',
426 'COT',
427 'CRC32',
428 'CURRENT_DATE',
429 'CURRENT_TIME',
430 'CURRENT_USER',
431 'DATABASE',
432 'DATE',
433 'DAYNAME',
434 'DAYOFMONTH',
435 'DAYOFWEEK',
436 'DAYOFYEAR',
437 'DEGREES',
438 'DES_DECRYPT',
439 'DES_ENCRYPT',
440 'ENCRYPT',
441 'EXP',
442 'FLOOR',
443 'FROM_DAYS',
444 'FROM_UNIXTIME',
445 'HEX',
446 'HOUR',
447 'INET6_ATON',
448 'INET6_NTOA',
449 'INET_ATON',
450 'INET_NTOA',
451 'LAST_DAY',
452 'LENGTH',
453 'LN',
454 'LOAD_FILE',
455 'LOG',
456 'LOG10',
457 'LOG2',
458 'LOWER',
459 'LTRIM',
460 'MD5',
461 'MICROSECOND',
462 'MINUTE',
463 'MONTH',
464 'MONTHNAME',
465 'NOW',
466 'OCT',
467 'OLD_PASSWORD',
468 'ORD',
469 'PASSWORD',
470 'PI',
471 'QUARTER',
472 'QUOTE',
473 'RADIANS',
474 'RAND',
475 'REVERSE',
476 'ROUND',
477 'RTRIM',
478 'SECOND',
479 'SEC_TO_TIME',
480 'SHA1',
481 'SHA2',
482 'SIGN',
483 'SIN',
484 'SOUNDEX',
485 'SPACE',
486 'SQRT',
487 'ST_GeomCollFromText',
488 'ST_GeomCollFromWKB',
489 'ST_GeomFromText',
490 'ST_GeomFromWKB',
491 'ST_LineFromText',
492 'ST_LineFromWKB',
493 'ST_MLineFromText',
494 'ST_MLineFromWKB',
495 'ST_MPointFromText',
496 'ST_MPointFromWKB',
497 'ST_MPolyFromText',
498 'ST_MPolyFromWKB',
499 'ST_PointFromText',
500 'ST_PointFromWKB',
501 'ST_PolyFromText',
502 'ST_PolyFromWKB',
503 'SYSDATE',
504 'TAN',
505 'TIME',
506 'TIMESTAMP',
507 'TIME_TO_SEC',
508 'TO_DAYS',
509 'TO_SECONDS',
510 'TRIM',
511 'UNCOMPRESS',
512 'UNCOMPRESSED_LENGTH',
513 'UNHEX',
514 'UNIX_TIMESTAMP',
515 'UPPER',
516 'USER',
517 'UTC_DATE',
518 'UTC_TIME',
519 'UTC_TIMESTAMP',
520 'UUID',
521 'UUID_SHORT',
522 'VERSION',
523 'WEEK',
524 'WEEKDAY',
525 'WEEKOFYEAR',
526 'YEAR',
527 'YEARWEEK',
529 $this->object->getAllFunctions(),
534 * Test for getAttributes
536 public function testGetAttributes(): void
538 self::assertSame(
539 ['', 'BINARY', 'UNSIGNED', 'UNSIGNED ZEROFILL', 'on update CURRENT_TIMESTAMP'],
540 $this->object->getAttributes(),
545 * Test for getColumns
547 public function testGetColumns(): void
549 self::assertSame(
551 0 => 'INT',
552 1 => 'VARCHAR',
553 2 => 'TEXT',
554 3 => 'DATE',
555 'Numeric' => [
556 'TINYINT',
557 'SMALLINT',
558 'MEDIUMINT',
559 'INT',
560 'BIGINT',
561 '-',
562 'DECIMAL',
563 'FLOAT',
564 'DOUBLE',
565 'REAL',
566 '-',
567 'BIT',
568 'BOOLEAN',
569 'SERIAL',
571 'Date and time' => ['DATE', 'DATETIME', 'TIMESTAMP', 'TIME', 'YEAR'],
572 'String' => [
573 'CHAR',
574 'VARCHAR',
575 '-',
576 'TINYTEXT',
577 'TEXT',
578 'MEDIUMTEXT',
579 'LONGTEXT',
580 '-',
581 'BINARY',
582 'VARBINARY',
583 '-',
584 'TINYBLOB',
585 'BLOB',
586 'MEDIUMBLOB',
587 'LONGBLOB',
588 '-',
589 'ENUM',
590 'SET',
592 'Spatial' => [
593 'GEOMETRY',
594 'POINT',
595 'LINESTRING',
596 'POLYGON',
597 'MULTIPOINT',
598 'MULTILINESTRING',
599 'MULTIPOLYGON',
600 'GEOMETRYCOLLECTION',
602 'JSON' => ['JSON'],
604 $this->object->getColumns(),
609 * @param string $type Type to check
610 * @param TypeClass $output Expected result
612 #[DataProvider('providerFortTestGetTypeClass')]
613 public function testGetTypeClass(string $type, TypeClass $output): void
615 self::assertSame(
616 $output,
617 $this->object->getTypeClass($type),
622 * Data provider for type testing
624 * @return array<array{string, TypeClass}>
626 public static function providerFortTestGetTypeClass(): array
628 return [
629 ['SERIAL', TypeClass::Number],
630 ['YEAR', TypeClass::Date],
631 ['GEOMETRYCOLLECTION', TypeClass::Spatial],
632 ['SET', TypeClass::Char],
633 ['JSON', TypeClass::Json],
634 ['UUID', TypeClass::Uuid],
635 ['UNKNOWN', TypeClass::Unknown],