diff --git a/src/Command/StringBitPos.php b/src/Command/StringBitPos.php new file mode 100644 index 00000000..2fbad5cd --- /dev/null +++ b/src/Command/StringBitPos.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Predis\Command; + +/** + * @link http://redis.io/commands/bitpos + * @author Daniele Alessandri + */ +class StringBitCount extends Command +{ + /** + * {@inheritdoc} + */ + public function getId() + { + return 'BITPOS'; + } +} diff --git a/src/Profile/RedisVersion280.php b/src/Profile/RedisVersion280.php index 2ba3cbad..0bb92940 100644 --- a/src/Profile/RedisVersion280.php +++ b/src/Profile/RedisVersion280.php @@ -234,6 +234,9 @@ class RedisVersion280 extends RedisProfile /* commands operating on the key space */ 'SCAN' => 'Predis\Command\KeyScan', + + /* commands operating on string values */ + 'BITPOS' => 'Predis\Command\StringBitPos', /* commands operating on sets */ 'SSCAN' => 'Predis\Command\SetScan', diff --git a/src/Profile/RedisVersion300.php b/src/Profile/RedisVersion300.php index a2862bb2..b95ba04f 100644 --- a/src/Profile/RedisVersion300.php +++ b/src/Profile/RedisVersion300.php @@ -234,6 +234,9 @@ class RedisVersion300 extends RedisProfile /* commands operating on the key space */ 'SCAN' => 'Predis\Command\KeyScan', + + /* commands operating on string values */ + 'BITPOS' => 'Predis\Command\StringBitPos', /* commands operating on sets */ 'SSCAN' => 'Predis\Command\SetScan', diff --git a/tests/Predis/Command/StringBitPosTest.php b/tests/Predis/Command/StringBitPosTest.php new file mode 100644 index 00000000..94ea5a7c --- /dev/null +++ b/tests/Predis/Command/StringBitPosTest.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace Predis\Command; +/** + * @group commands + * @group realm-string + */ +class StringBitPosTest extends PredisCommandTestCase +{ + /** + * {@inheritdoc} + */ + protected function getExpectedCommand() + { + return 'Predis\Command\StringBitPos'; + } + /** + * {@inheritdoc} + */ + protected function getExpectedId() + { + return 'BITPOS'; + } + /** + * @group disconnected + */ + public function testFilterArguments() + { + $arguments = array('key', 0, 1, 10); + $expected = array('key', 0, 1, 10); + $command = $this->getCommand(); + $command->setArguments($arguments); + $this->assertSame($expected, $command->getArguments()); + } + /** + * @group disconnected + */ + public function testParseResponse() + { + $raw = 10; + $expected = 10; + $command = $this->getCommand(); + $this->assertSame($expected, $command->parseResponse($raw)); + } + /** + * @group connected + */ + public function testReturnsBitPosition() + { + $redis = $this->getClient(); + $redis->setbit('key', 10, 0); + $this->assertSame(0, $redis->bitpos('key', 0), 'Get position of first bit set to 0 - full range'); + $this->assertSame(-1, $redis->bitpos('key', 1), 'Get position of first bit set to 1 - full range'); + $this->assertSame(-1, $redis->bitpos('key', 1, 5, 10), 'Get position of first bit set to 1 - specific range'); + $redis->setbit('key', 5, 1); + $this->assertSame(0, $redis->bitpos('key', 0), 'Get position of first bit set to 0 - full range'); + $this->assertSame(5, $redis->bitpos('key', 1), 'Get position of first bit set to 1 - full range'); + $this->assertSame(-1, $redis->bitpos('key', 1, 5, 10), 'Get position of first bit set to 1 - specific range'); + } + /** + * @group connected + * @expectedException \Predis\Response\ServerException + * @expectedExceptionMessage Operation against a key holding the wrong kind of value + */ + public function testThrowsExceptionOnWrongType() + { + $redis = $this->getClient(); + $redis->lpush('key', 'list'); + $redis->bitpos('key'); + } +} \ No newline at end of file