<?php namespace BitWasp\Buffertools\Tests\Types; use BitWasp\Buffertools\ByteOrder; use BitWasp\Buffertools\Tests\BinaryTest; use BitWasp\Buffertools\Types\UintInterface; use BitWasp\Buffertools\Types\Uint8; use BitWasp\Buffertools\Types\Uint16; use BitWasp\Buffertools\Types\Uint32; use BitWasp\Buffertools\Types\Uint64; use BitWasp\Buffertools\Types\Uint128; use BitWasp\Buffertools\Types\Uint256; use BitWasp\Buffertools\Buffer; use BitWasp\Buffertools\Buffertools; use BitWasp\Buffertools\Parser; use Mdanter\Ecc\EccFactory; class UintSetTest extends BinaryTest { /** * @param $bitSize * @return array */ private function generateSizeBasedTests($bitSize, $byteOrder) { $math = EccFactory::getAdapter(); $halfPos = $math->baseConvert(str_pad('7', $bitSize / 4, 'f', STR_PAD_RIGHT), 16, 10); $maxPos = $math->baseConvert(str_pad('', $bitSize / 4, 'f', STR_PAD_RIGHT), 16, 10); $test = function ($integer) use ($bitSize, $math, $byteOrder) { $hex = str_pad($math->baseConvert($integer, 10, 16), $bitSize / 4, '0', STR_PAD_LEFT); if ($byteOrder == ByteOrder::LE) { $hex = Buffertools::flipBytes(Buffer::hex($hex))->getHex(); } return [ $integer, $hex, null ]; }; return [ $test(0), $test(1), $test($halfPos), $test($maxPos) ]; } /** * @param $math * @return UintInterface[] */ public function getUintClasses($math) { return [ new Uint8($math), new Uint16($math), new Uint32($math), new Uint64($math), new Uint128($math), new Uint256($math), new Uint8($math, ByteOrder::LE), new Uint16($math, ByteOrder::LE), new Uint32($math, ByteOrder::LE), new Uint64($math, ByteOrder::LE), new Uint128($math, ByteOrder::LE), new Uint256($math, ByteOrder::LE), ]; } /** * @return array */ public function AllTests() { $math = EccFactory::getAdapter(); $vectors = []; foreach ($this->getUintClasses($math) as $val) { $order = $val->getByteOrder(); foreach ($this->generateSizeBasedTests($val->getBitSize(), $order) as $t) { $vectors[] = array_merge([$val], $t); } } return $vectors; } /** * @dataProvider AllTests * @param $int * @param $eHex */ public function testUint(UintInterface $comp, $int, $eHex) { $binary = $comp->write($int); $this->assertEquals($eHex, str_pad(bin2hex($binary), $comp->getBitSize() / 4, '0', STR_PAD_LEFT)); $parser = new Parser(new Buffer($binary)); $recovered = $comp->read($parser); $this->assertEquals($int, $recovered); } /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage Must pass valid flag for endianness */ public function testUintInvalidOrder() { $math = EccFactory::getAdapter(); new Uint8($math, 2); } /** * @expectedException \Exception * @expectedExceptionMessage Bit string length must be a multiple of 8 */ public function testInvalidFlipLength() { $math = EccFactory::getAdapter(); $u = new Uint8($math, 1); $u->flipBits('0'); } }