Added response parser for WithScore trait (#830)

* Added response parser for WithScore trait

* Added test coverage for new method

Co-authored-by: Vladyslav Vildanov <vladyslavvildanov@Vladyslav-Vildanov-MacBook-Pro.local>
This commit is contained in:
Vladyslav Vildanov
2022-11-30 23:20:56 +02:00
committed by GitHub
parent 573c54ac4c
commit 35d18d739a
4 changed files with 67 additions and 7 deletions
+30
View File
@@ -19,4 +19,34 @@ trait WithScores
parent::setArguments($arguments);
}
/**
* Checks for the presence of the WITHSCORES modifier.
*
* @return bool
*/
private function isWithScoreModifier(): bool
{
$arguments = parent::getArguments();
$lastArgument = $arguments[count($arguments) - 1];
return is_string($lastArgument) && strtoupper($lastArgument) === 'WITHSCORES';
}
public function parseResponse($data)
{
if ($this->isWithScoreModifier()) {
$result = [];
for ($i = 0, $iMax = count($data); $i < $iMax; ++$i) {
if ($data[$i + 1] ?? false) {
$result[$data[$i]] = $data[++$i];
}
}
return $result;
}
return $data;
}
}
+3 -3
View File
@@ -76,7 +76,7 @@ class ZDIFF_test extends PredisCommandTestCase
{
$redis = $this->getClient();
$membersDictionary = [1, 'member1', 2, 'member2', 3, 'member3'];
$expectedResponse = ['member1', '1', 'member2', '2', 'member3', '3'];
$expectedResponse = ['member1' => '1', 'member2' => '2', 'member3' => '3'];
$redis->zadd('test-zset-1', ...$membersDictionary);
$this->assertSame($expectedResponse, $redis->zdiff(['test-zset-1', 'test-zset-2'], true));
@@ -130,13 +130,13 @@ class ZDIFF_test extends PredisCommandTestCase
'no intersection - with score' => [
[1, 'member1', 2, 'member2', 3, 'member3'],
[1, 'member4', 2, 'member5', 3, 'member6'],
['member1', '1', 'member2', '2', 'member3', '3'],
['member1' => '1', 'member2' => '2', 'member3' => '3'],
true
],
'partial intersection - with score' => [
[1, 'member1', 2, 'member2', 3, 'member3'],
[1, 'member1', 2, 'member2', 3, 'member4'],
['member3', '3'],
['member3' => '3'],
true
],
];
@@ -111,19 +111,19 @@ class ZRANDMEMBER_test extends PredisCommandTestCase
['member1', 'member1'],
false
],
'one member - with score' => ['test-zset', 1, [1, 'member1'], ['member1', 1], true],
'one member - with score' => ['test-zset', 1, [1, 'member1'], ['member1' => '1'], true],
'multiple members - positive count - with score' => [
'test-zset',
2,
[1, 'member1', 2, 'member2'],
['member1', 1, 'member2', 2],
['member1' => '1', 'member2' => '2'],
true
],
'multiple members - negative count - with score' => [
'test-zset',
-2,
-1,
[1, 'member1'],
['member1', 1, 'member1', 1],
['member1' => '1'],
true
],
];
@@ -39,6 +39,21 @@ class WithScoresTest extends PredisTestCase
$this->assertSame($expectedArguments, $this->testClass->getArguments());
}
/**
* @dataProvider dataProvider
* @param array $actualData
* @param array $expectedResponse
* @return void
*/
public function testParseDataReturnsCorrectResponse(array $actualData, array $expectedResponse): void
{
$this->testClass->setArguments($actualData);
$arguments = $this->testClass->getArguments();
$this->assertSame($expectedResponse, $this->testClass->parseResponse($arguments));
}
public function valuesProvider(): array
{
return [
@@ -47,4 +62,19 @@ class WithScoresTest extends PredisTestCase
'with last argument non boolean' => [['test', 'test1', 1], ['test', 'test1', 1]],
];
}
public function dataProvider(): array
{
return [
'without modifier' => [['member1', '1', 'member2', '2'], ['member1', '1', 'member2', '2']],
'with wrong modifier' => [
['member1', '1', 'member2', '2', 'WITHSCOREE'],
['member1', '1', 'member2', '2', 'WITHSCOREE'],
],
'with modifier' => [
['member1', '1', 'member2', '2', 'WITHSCORES'],
['member1' => '1', 'member2' => '2'],
]
];
}
}