2017-12-18 07:11:48 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Amp\Postgres\Test;
|
|
|
|
|
|
|
|
use Amp\PHPUnit\TestCase;
|
|
|
|
use Amp\Postgres\Internal\ArrayParser;
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
class ArrayParserTest extends TestCase
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
/** @var \Amp\Postgres\Internal\ArrayParser */
|
|
|
|
private $parser;
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function setUp()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$this->parser = new ArrayParser;
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testSingleDimensionalArray()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ["one", "two", "three"];
|
|
|
|
$string = '{' . \implode(',', $array) . '}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testMultiDimensionalArray()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ["one", "two", ["three", "four"], "five"];
|
|
|
|
$string = '{one, two, {three, four}, five}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testQuotedStrings()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ["one", "two", ["three", "four"], "five"];
|
|
|
|
$string = '{"one", "two", {"three", "four"}, "five"}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testAlternateDelimiter()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ["1,2,3", "3,4,5"];
|
|
|
|
$string = '{1,2,3;3,4,5}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string, null, ';'));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testEscapedQuoteDelimiter()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ['va"lue1', 'value"2'];
|
|
|
|
$string = '{"va\\"lue1", "value\\"2"}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string, null, ','));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testNullValue()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ["one", null, "three"];
|
|
|
|
$string = '{one, NULL, three}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testQuotedNullValue()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = ["one", "NULL", "three"];
|
|
|
|
$string = '{one, "NULL", three}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testCast()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = [1, 2, 3];
|
|
|
|
$string = '{' . \implode(',', $array) . '}';
|
|
|
|
|
|
|
|
$cast = function (string $value): int {
|
|
|
|
return (int) $value;
|
|
|
|
};
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string, $cast));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testCastWithNull()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = [1, 2, null, 3];
|
|
|
|
$string = '{1,2,NULL,3}';
|
|
|
|
|
|
|
|
$cast = function (string $value): int {
|
|
|
|
return (int) $value;
|
|
|
|
};
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string, $cast));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testCastWithMultidimensionalArray()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = [1, 2, [3, 4], [5], 6, 7, [[8, 9], 10]];
|
|
|
|
$string = '{1,2,{3,4},{5},6,7,{{8,9},10}}';
|
|
|
|
|
|
|
|
$cast = function (string $value): int {
|
|
|
|
return (int) $value;
|
|
|
|
};
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string, $cast));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testRandomWhitespace()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$array = [1, 2, [3, 4], [5], 6, 7, [[8, 9], 10]];
|
|
|
|
$string = " {1, 2, { 3 ,\r 4 },{ 5} \n\t ,6 , 7, { {8,\t 9}, 10} } \n";
|
|
|
|
|
|
|
|
$cast = function (string $value): int {
|
|
|
|
return (int) $value;
|
|
|
|
};
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string, $cast));
|
|
|
|
}
|
|
|
|
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testEscapedBackslashesInQuotedValue()
|
|
|
|
{
|
2018-01-24 03:01:23 +01:00
|
|
|
$array = ["test\\ing", "esca\\ped\\"];
|
|
|
|
$string = '{"test\\\\ing", "esca\\\\ped\\\\"}';
|
|
|
|
|
|
|
|
$this->assertSame($array, $this->parser->parse($string));
|
|
|
|
}
|
|
|
|
|
2017-12-18 07:11:48 +01:00
|
|
|
/**
|
|
|
|
* @expectedException \Amp\Postgres\ParseException
|
|
|
|
* @expectedExceptionMessage Missing opening or closing brackets
|
|
|
|
*/
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testNoClosingBracket()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$string = '{"one", "two"';
|
|
|
|
$this->parser->parse($string);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException \Amp\Postgres\ParseException
|
|
|
|
* @expectedExceptionMessage Data left in buffer after parsing
|
|
|
|
*/
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testTrailingData()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$string = '{"one", "two"} data}';
|
|
|
|
$this->parser->parse($string);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException \Amp\Postgres\ParseException
|
|
|
|
* @expectedExceptionMessage Could not find matching quote in quoted value
|
|
|
|
*/
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testMissingQuote()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$string = '{"one", "two}';
|
|
|
|
$this->parser->parse($string);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @expectedException \Amp\Postgres\ParseException
|
|
|
|
* @expectedExceptionMessage Invalid delimiter
|
|
|
|
*/
|
2018-07-01 19:33:12 +02:00
|
|
|
public function testInvalidDelimiter()
|
|
|
|
{
|
2017-12-18 07:11:48 +01:00
|
|
|
$string = '{"one"; "two"}';
|
|
|
|
$this->parser->parse($string);
|
|
|
|
}
|
|
|
|
}
|