mirror of
https://github.com/getgrav/grav-plugin-admin.git
synced 2025-11-05 04:46:03 +01:00
Removed extraneous files
This commit is contained in:
7
vendor/bacon/bacon-qr-code/.gitignore
vendored
7
vendor/bacon/bacon-qr-code/.gitignore
vendored
@@ -1,7 +0,0 @@
|
||||
nbproject
|
||||
.idea
|
||||
.buildpath
|
||||
.project
|
||||
.DS_Store
|
||||
.*.sw*
|
||||
.*.un~
|
||||
9
vendor/bacon/bacon-qr-code/.travis.yml
vendored
9
vendor/bacon/bacon-qr-code/.travis.yml
vendored
@@ -1,9 +0,0 @@
|
||||
language: php
|
||||
php:
|
||||
- 5.3
|
||||
- 5.4
|
||||
- 5.5
|
||||
- 7.0
|
||||
- hhvm
|
||||
|
||||
script: phpunit --bootstrap tests/bootstrap.php --configuration tests/phpunit.xml tests
|
||||
25
vendor/bacon/bacon-qr-code/composer.json
vendored
25
vendor/bacon/bacon-qr-code/composer.json
vendored
@@ -1,25 +0,0 @@
|
||||
{
|
||||
"name": "bacon/bacon-qr-code",
|
||||
"description": "BaconQrCode is a QR code generator for PHP.",
|
||||
"license" : "BSD-2-Clause",
|
||||
"homepage": "https://github.com/Bacon/BaconQrCode",
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-gd": "to generate QR code images"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Ben Scholzen 'DASPRiD'",
|
||||
"email": "mail@dasprids.de",
|
||||
"homepage": "http://www.dasprids.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"BaconQrCode": "src/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,197 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class BitArrayTest extends TestCase
|
||||
{
|
||||
public function testGetSet()
|
||||
{
|
||||
$array = new BitArray(33);
|
||||
|
||||
for ($i = 0; $i < 33; $i++) {
|
||||
$this->assertFalse($array->get($i));
|
||||
$array->set($i);
|
||||
$this->assertTrue($array->get($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetNextSet1()
|
||||
{
|
||||
$array = new BitArray(32);
|
||||
|
||||
for ($i = 0; $i < $array->getSize(); $i++) {
|
||||
$this->assertEquals($i, 32, '', $array->getNextSet($i));
|
||||
}
|
||||
|
||||
$array = new BitArray(33);
|
||||
|
||||
for ($i = 0; $i < $array->getSize(); $i++) {
|
||||
$this->assertEquals($i, 33, '', $array->getNextSet($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetNextSet2()
|
||||
{
|
||||
$array = new BitArray(33);
|
||||
|
||||
for ($i = 0; $i < $array->getSize(); $i++) {
|
||||
$this->assertEquals($i, $i <= 31 ? 31 : 33, '', $array->getNextSet($i));
|
||||
}
|
||||
|
||||
$array = new BitArray(33);
|
||||
|
||||
for ($i = 0; $i < $array->getSize(); $i++) {
|
||||
$this->assertEquals($i, 32, '', $array->getNextSet($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetNextSet3()
|
||||
{
|
||||
$array = new BitArray(63);
|
||||
$array->set(31);
|
||||
$array->set(32);
|
||||
|
||||
for ($i = 0; $i < $array->getSize(); $i++) {
|
||||
if ($i <= 31) {
|
||||
$expected = 31;
|
||||
} elseif ($i <= 32) {
|
||||
$expected = 32;
|
||||
} else {
|
||||
$expected = 63;
|
||||
}
|
||||
|
||||
$this->assertEquals($i, $expected, '', $array->getNextSet($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetNextSet4()
|
||||
{
|
||||
$array = new BitArray(63);
|
||||
$array->set(33);
|
||||
$array->set(40);
|
||||
|
||||
for ($i = 0; $i < $array->getSize(); $i++) {
|
||||
if ($i <= 33) {
|
||||
$expected = 33;
|
||||
} elseif ($i <= 40) {
|
||||
$expected = 40;
|
||||
} else {
|
||||
$expected = 63;
|
||||
}
|
||||
|
||||
$this->assertEquals($i, $expected, '', $array->getNextSet($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetNextSet5()
|
||||
{
|
||||
mt_srand(hexdec('deadbeef'));
|
||||
|
||||
for ($i = 0; $i < 10; $i++) {
|
||||
$array = new BitArray(mt_rand(1, 100));
|
||||
$numSet = mt_rand(0, 19);
|
||||
|
||||
for ($j = 0; $j < $numSet; $j++) {
|
||||
$array->set(mt_rand(0, $array->getSize() - 1));
|
||||
}
|
||||
|
||||
$numQueries = mt_rand(0, 19);
|
||||
|
||||
for ($j = 0; $j < $numQueries; $j++) {
|
||||
$query = mt_rand(0, $array->getSize() - 1);
|
||||
$expected = $query;
|
||||
|
||||
while ($expected < $array->getSize() && !$array->get($expected)) {
|
||||
$expected++;
|
||||
}
|
||||
|
||||
$actual = $array->getNextSet($query);
|
||||
|
||||
if ($actual !== $expected) {
|
||||
$array->getNextSet($query);
|
||||
}
|
||||
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testSetBulk()
|
||||
{
|
||||
$array = new BitArray(64);
|
||||
$array->setBulk(32, 0xFFFF0000);
|
||||
|
||||
for ($i = 0; $i < 48; $i++) {
|
||||
$this->assertFalse($array->get($i));
|
||||
}
|
||||
|
||||
for ($i = 48; $i < 64; $i++) {
|
||||
$this->assertTrue($array->get($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testClear()
|
||||
{
|
||||
$array = new BitArray(32);
|
||||
|
||||
for ($i = 0; $i < 32; $i++) {
|
||||
$array->set($i);
|
||||
}
|
||||
|
||||
$array->clear();
|
||||
|
||||
for ($i = 0; $i < 32; $i++) {
|
||||
$this->assertFalse($array->get($i));
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetArray()
|
||||
{
|
||||
$array = new BitArray(64);
|
||||
$array->set(0);
|
||||
$array->set(63);
|
||||
|
||||
$ints = $array->getBitArray();
|
||||
|
||||
$this->assertEquals(1, $ints[0]);
|
||||
$this->assertEquals(0x80000000, $ints[1]);
|
||||
}
|
||||
|
||||
public function testIsRange()
|
||||
{
|
||||
$array = new BitArray(64);
|
||||
$this->assertTrue($array->isRange(0, 64, false));
|
||||
$this->assertFalse($array->isRange(0, 64, true));
|
||||
|
||||
$array->set(32);
|
||||
$this->assertTrue($array->isRange(32, 33, true));
|
||||
|
||||
$array->set(31);
|
||||
$this->assertTrue($array->isRange(31, 33, true));
|
||||
|
||||
$array->set(34);
|
||||
$this->assertFalse($array->isRange(31, 35, true));
|
||||
|
||||
for ($i = 0; $i < 31; $i++) {
|
||||
$array->set($i);
|
||||
}
|
||||
|
||||
$this->assertTrue($array->isRange(0, 33, true));
|
||||
|
||||
for ($i = 33; $i < 64; $i++) {
|
||||
$array->set($i);
|
||||
}
|
||||
|
||||
$this->assertTrue($array->isRange(0, 64, true));
|
||||
$this->assertFalse($array->isRange(0, 64, false));
|
||||
}
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class BitMatrixTest extends TestCase
|
||||
{
|
||||
public function testGetSet()
|
||||
{
|
||||
$matrix = new BitMatrix(33);
|
||||
$this->assertEquals(33, $matrix->getHeight());
|
||||
|
||||
for ($y = 0; $y < 33; $y++) {
|
||||
for ($x = 0; $x < 33; $x++) {
|
||||
if ($y * $x % 3 === 0) {
|
||||
$matrix->set($x, $y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ($y = 0; $y < 33; $y++) {
|
||||
for ($x = 0; $x < 33; $x++) {
|
||||
$this->assertEquals($x * $y % 3 === 0, $matrix->get($x, $y));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testSetRegion()
|
||||
{
|
||||
$matrix = new BitMatrix(5);
|
||||
$matrix->setRegion(1, 1, 3, 3);
|
||||
|
||||
for ($y = 0; $y < 5; $y++) {
|
||||
for ($x = 0; $x < 5; $x++) {
|
||||
$this->assertEquals($y >= 1 && $y <= 3 && $x >= 1 && $x <= 3, $matrix->get($x, $y));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testRectangularMatrix()
|
||||
{
|
||||
$matrix = new BitMatrix(75, 20);
|
||||
$this->assertEquals(75, $matrix->getWidth());
|
||||
$this->assertEquals(20, $matrix->getHeight());
|
||||
|
||||
$matrix->set(10, 0);
|
||||
$matrix->set(11, 1);
|
||||
$matrix->set(50, 2);
|
||||
$matrix->set(51, 3);
|
||||
$matrix->flip(74, 4);
|
||||
$matrix->flip(0, 5);
|
||||
|
||||
$this->assertTrue($matrix->get(10, 0));
|
||||
$this->assertTrue($matrix->get(11, 1));
|
||||
$this->assertTrue($matrix->get(50, 2));
|
||||
$this->assertTrue($matrix->get(51, 3));
|
||||
$this->assertTrue($matrix->get(74, 4));
|
||||
$this->assertTrue($matrix->get(0, 5));
|
||||
|
||||
$matrix->flip(50, 2);
|
||||
$matrix->flip(51, 3);
|
||||
|
||||
$this->assertFalse($matrix->get(50, 2));
|
||||
$this->assertFalse($matrix->get(51, 3));
|
||||
}
|
||||
|
||||
public function testRectangularSetRegion()
|
||||
{
|
||||
$matrix = new BitMatrix(320, 240);
|
||||
$this->assertEquals(320, $matrix->getWidth());
|
||||
$this->assertEquals(240, $matrix->getHeight());
|
||||
|
||||
$matrix->setRegion(105, 22, 80, 12);
|
||||
|
||||
for ($y = 0; $y < 240; $y++) {
|
||||
for ($x = 0; $x < 320; $x++) {
|
||||
$this->assertEquals($y >= 22 && $y < 34 && $x >= 105 && $x < 185, $matrix->get($x, $y));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetRow()
|
||||
{
|
||||
$matrix = new BitMatrix(102, 5);
|
||||
|
||||
for ($x = 0; $x < 102; $x++) {
|
||||
if ($x & 3 === 0) {
|
||||
$matrix->set($x, 2);
|
||||
}
|
||||
}
|
||||
|
||||
$array1 = $matrix->getRow(2, null);
|
||||
$this->assertEquals(102, $array1->getSize());
|
||||
|
||||
$array2 = new BitArray(60);
|
||||
$array2 = $matrix->getRow(2, $array2);
|
||||
$this->assertEquals(102, $array2->getSize());
|
||||
|
||||
$array3 = new BitArray(200);
|
||||
$array3 = $matrix->getRow(2, $array3);
|
||||
$this->assertEquals(200, $array3->getSize());
|
||||
|
||||
for ($x = 0; $x < 102; $x++) {
|
||||
$on = ($x & 3 === 0);
|
||||
|
||||
$this->assertEquals($on, $array1->get($x));
|
||||
$this->assertEquals($on, $array2->get($x));
|
||||
$this->assertEquals($on, $array3->get($x));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class BitUtilsTest extends TestCase
|
||||
{
|
||||
public function testUnsignedRightShift()
|
||||
{
|
||||
$this->assertEquals(1, BitUtils::unsignedRightShift(1, 0));
|
||||
$this->assertEquals(1, BitUtils::unsignedRightShift(10, 3));
|
||||
$this->assertEquals(536870910, BitUtils::unsignedRightShift(-10, 3));
|
||||
}
|
||||
|
||||
public function testNumberOfTrailingZeros()
|
||||
{
|
||||
$this->assertEquals(32, BitUtils::numberOfTrailingZeros(0));
|
||||
$this->assertEquals(1, BitUtils::numberOfTrailingZeros(10));
|
||||
$this->assertEquals(0, BitUtils::numberOfTrailingZeros(15));
|
||||
$this->assertEquals(2, BitUtils::numberOfTrailingZeros(20));
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class ErrorCorrectionLevelTest extends TestCase
|
||||
{
|
||||
public function testCreationThrowsNoException()
|
||||
{
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::M);
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L);
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::H);
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::Q);
|
||||
}
|
||||
|
||||
public function testBitsMatchConstants()
|
||||
{
|
||||
$this->assertEquals(0x0, ErrorCorrectionLevel::M);
|
||||
$this->assertEquals(0x1, ErrorCorrectionLevel::L);
|
||||
$this->assertEquals(0x2, ErrorCorrectionLevel::H);
|
||||
$this->assertEquals(0x3, ErrorCorrectionLevel::Q);
|
||||
}
|
||||
|
||||
public function testInvalidErrorCorrectionLevelThrowsException()
|
||||
{
|
||||
$this->setExpectedException(
|
||||
'BaconQrCode\Exception\UnexpectedValueException',
|
||||
'Value not a const in enum BaconQrCode\Common\ErrorCorrectionLevel'
|
||||
);
|
||||
new ErrorCorrectionLevel(4);
|
||||
}
|
||||
}
|
||||
@@ -1,104 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class FormatInformationTest extends TestCase
|
||||
{
|
||||
protected $maskedTestFormatInfo = 0x2bed;
|
||||
protected $unmaskedTestFormatInfo;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
$this->unmaskedTestFormatInfo = $this->maskedTestFormatInfo ^ 0x5412;
|
||||
}
|
||||
|
||||
|
||||
public function testBitsDiffering()
|
||||
{
|
||||
$this->assertEquals(0, FormatInformation::numBitsDiffering(1, 1));
|
||||
$this->assertEquals(1, FormatInformation::numBitsDiffering(0, 2));
|
||||
$this->assertEquals(2, FormatInformation::numBitsDiffering(1, 2));
|
||||
$this->assertEquals(32, FormatInformation::numBitsDiffering(-1, 0));
|
||||
}
|
||||
|
||||
public function testDecode()
|
||||
{
|
||||
$expected = FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo,
|
||||
$this->maskedTestFormatInfo
|
||||
);
|
||||
|
||||
$this->assertNotNull($expected);
|
||||
$this->assertEquals(7, $expected->getDataMask());
|
||||
$this->assertEquals(ErrorCorrectionLevel::Q, $expected->getErrorCorrectionLevel()->get());
|
||||
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
FormatInformation::decodeFormatInformation(
|
||||
$this->unmaskedTestFormatInfo,
|
||||
$this->maskedTestFormatInfo
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function testDecodeWithBitDifference()
|
||||
{
|
||||
$expected = FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo,
|
||||
$this->maskedTestFormatInfo
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo ^ 0x1,
|
||||
$this->maskedTestFormatInfo ^ 0x1
|
||||
)
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo ^ 0x3,
|
||||
$this->maskedTestFormatInfo ^ 0x3
|
||||
)
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo ^ 0x7,
|
||||
$this->maskedTestFormatInfo ^ 0x7
|
||||
)
|
||||
);
|
||||
$this->assertNull(
|
||||
FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo ^ 0xf,
|
||||
$this->maskedTestFormatInfo ^ 0xf
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function testDecodeWithMisRead()
|
||||
{
|
||||
$expected = FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo,
|
||||
$this->maskedTestFormatInfo
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
FormatInformation::decodeFormatInformation(
|
||||
$this->maskedTestFormatInfo ^ 0x3,
|
||||
$this->maskedTestFormatInfo ^ 0xf
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class ModeTest extends TestCase
|
||||
{
|
||||
public function testCreationThrowsNoException()
|
||||
{
|
||||
new Mode(Mode::TERMINATOR);
|
||||
new Mode(Mode::NUMERIC);
|
||||
new Mode(Mode::ALPHANUMERIC);
|
||||
new Mode(Mode::BYTE);
|
||||
new Mode(Mode::KANJI);
|
||||
}
|
||||
|
||||
public function testBitsMatchConstants()
|
||||
{
|
||||
$this->assertEquals(0x0, Mode::TERMINATOR);
|
||||
$this->assertEquals(0x1, Mode::NUMERIC);
|
||||
$this->assertEquals(0x2, Mode::ALPHANUMERIC);
|
||||
$this->assertEquals(0x4, Mode::BYTE);
|
||||
$this->assertEquals(0x8, Mode::KANJI);
|
||||
}
|
||||
|
||||
public function testInvalidModeThrowsException()
|
||||
{
|
||||
$this->setExpectedException(
|
||||
'BaconQrCode\Exception\UnexpectedValueException',
|
||||
'Value not a const in enum BaconQrCode\Common\Mode'
|
||||
);
|
||||
new Mode(10);
|
||||
}
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
use SplFixedArray;
|
||||
|
||||
class ReedSolomonTest extends TestCase
|
||||
{
|
||||
public static function tabProvider()
|
||||
{
|
||||
return array(
|
||||
array(2, 0x7, 1, 1, 1),
|
||||
array(3, 0xb, 1, 1, 2),
|
||||
array(4, 0x13, 1, 1, 4),
|
||||
array(5, 0x25, 1, 1, 6),
|
||||
array(6, 0x43, 1, 1, 8),
|
||||
array(7, 0x89, 1, 1, 10),
|
||||
array(8, 0x11d, 1, 1, 32),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider tabProvider
|
||||
* @param integer $symbolSize
|
||||
* @param integer $generatorPoly
|
||||
* @param integer $firstRoot
|
||||
* @param integer $primitive
|
||||
* @param integer $numRoots
|
||||
* @return void
|
||||
*/
|
||||
public function testCodec($symbolSize, $generatorPoly, $firstRoot, $primitive, $numRoots)
|
||||
{
|
||||
mt_srand(0xdeadbeef);
|
||||
|
||||
$blockSize = (1 << $symbolSize) - 1;
|
||||
$dataSize = $blockSize - $numRoots;
|
||||
$codec = new ReedSolomonCodec($symbolSize, $generatorPoly, $firstRoot, $primitive, $numRoots, 0);
|
||||
|
||||
for ($errors = 0; $errors <= $numRoots / 2; $errors++) {
|
||||
// Load block with random data and encode
|
||||
$block = SplFixedArray::fromArray(array_fill(0, $blockSize, 0), false);
|
||||
|
||||
for ($i = 0; $i < $dataSize; $i++) {
|
||||
$block[$i] = mt_rand(0, $blockSize);
|
||||
}
|
||||
|
||||
// Make temporary copy
|
||||
$tBlock = clone $block;
|
||||
$parity = SplFixedArray::fromArray(array_fill(0, $numRoots, 0), false);
|
||||
$errorLocations = SplFixedArray::fromArray(array_fill(0, $blockSize, 0), false);
|
||||
$erasures = array();
|
||||
|
||||
// Create parity
|
||||
$codec->encode($block, $parity);
|
||||
|
||||
// Copy parity into test blocks
|
||||
for ($i = 0; $i < $numRoots; $i++) {
|
||||
$block[$i + $dataSize] = $parity[$i];
|
||||
$tBlock[$i + $dataSize] = $parity[$i];
|
||||
}
|
||||
|
||||
// Seed with errors
|
||||
for ($i = 0; $i < $errors; $i++) {
|
||||
$errorValue = mt_rand(1, $blockSize);
|
||||
|
||||
do {
|
||||
$errorLocation = mt_rand(0, $blockSize);
|
||||
} while ($errorLocations[$errorLocation] !== 0);
|
||||
|
||||
$errorLocations[$errorLocation] = 1;
|
||||
|
||||
if (mt_rand(0, 1)) {
|
||||
$erasures[] = $errorLocation;
|
||||
}
|
||||
|
||||
$tBlock[$errorLocation] ^= $errorValue;
|
||||
}
|
||||
|
||||
$erasures = SplFixedArray::fromArray($erasures, false);
|
||||
|
||||
// Decode the errored block
|
||||
$foundErrors = $codec->decode($tBlock, $erasures);
|
||||
|
||||
if ($errors > 0 && $foundErrors === null) {
|
||||
$this->assertEquals($block, $tBlock, 'Decoder failed to correct errors');
|
||||
}
|
||||
|
||||
$this->assertEquals($errors, $foundErrors, 'Found errors do not equal expected errors');
|
||||
|
||||
for ($i = 0; $i < $foundErrors; $i++) {
|
||||
if ($errorLocations[$erasures[$i]] === 0) {
|
||||
$this->fail(sprintf('Decoder indicates error in location %d without error', $erasures[$i]));
|
||||
}
|
||||
}
|
||||
|
||||
$this->assertEquals($block, $tBlock, 'Decoder did not correct errors');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Common;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class VersionTest extends TestCase
|
||||
{
|
||||
public static function versionProvider()
|
||||
{
|
||||
$array = array();
|
||||
|
||||
for ($i = 1; $i <= 40; $i++) {
|
||||
$array[] = array($i, 4 * $i + 17);
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
public static function decodeInformationProvider()
|
||||
{
|
||||
return array(
|
||||
array(7, 0x07c94),
|
||||
array(12, 0x0c762),
|
||||
array(17, 0x1145d),
|
||||
array(22, 0x168c9),
|
||||
array(27, 0x1b08e),
|
||||
array(32, 0x209d5),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider versionProvider
|
||||
* @param integer $versionNumber
|
||||
* @param integer $dimension
|
||||
*/
|
||||
public function testVersionForNumber($versionNumber, $dimension)
|
||||
{
|
||||
$version = Version::getVersionForNumber($versionNumber);
|
||||
|
||||
$this->assertNotNull($version);
|
||||
$this->assertEquals($versionNumber, $version->getVersionNumber());
|
||||
$this->assertNotNull($version->getAlignmentPatternCenters());
|
||||
|
||||
if ($versionNumber > 1) {
|
||||
$this->assertTrue(count($version->getAlignmentPatternCenters()) > 0);
|
||||
}
|
||||
|
||||
$this->assertEquals($dimension, $version->getDimensionForVersion());
|
||||
$this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::H)));
|
||||
$this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::L)));
|
||||
$this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::M)));
|
||||
$this->assertNotNull($version->getEcBlocksForLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::Q)));
|
||||
$this->assertNotNull($version->buildFunctionPattern());
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider versionProvider
|
||||
* @param integer $versionNumber
|
||||
* @param integer $dimension
|
||||
*/
|
||||
public function testGetProvisionalVersionForDimension($versionNumber, $dimension)
|
||||
{
|
||||
$this->assertEquals(
|
||||
$versionNumber,
|
||||
Version::getProvisionalVersionForDimension($dimension)->getVersionNumber()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider decodeInformationProvider
|
||||
* @param integer $expectedVersion
|
||||
* @param integer $mask
|
||||
*/
|
||||
public function testDecodeVersionInformation($expectedVersion, $mask)
|
||||
{
|
||||
$version = Version::decodeVersionInformation($mask);
|
||||
$this->assertNotNull($version);
|
||||
$this->assertEquals($expectedVersion, $version->getVersionNumber());
|
||||
}
|
||||
}
|
||||
@@ -1,468 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Encoder;
|
||||
|
||||
use BaconQrCode\Common\BitArray;
|
||||
use BaconQrCode\Common\ErrorCorrectionLevel;
|
||||
use BaconQrCode\Common\Mode;
|
||||
use BaconQrCode\Common\Version;
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
use SplFixedArray;
|
||||
|
||||
class EncoderTest extends TestCase
|
||||
{
|
||||
protected $methods = array();
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
// Hack to be able to test protected methods
|
||||
$reflection = new ReflectionClass('BaconQrCode\Encoder\Encoder');
|
||||
|
||||
foreach ($reflection->getMethods(ReflectionMethod::IS_STATIC) as $method) {
|
||||
$method->setAccessible(true);
|
||||
$this->methods[$method->getName()] = $method;
|
||||
}
|
||||
}
|
||||
|
||||
public function testGetAlphanumericCode()
|
||||
{
|
||||
// The first ten code points are numbers.
|
||||
for ($i = 0; $i < 10; $i++) {
|
||||
$this->assertEquals($i, $this->methods['getAlphanumericCode']->invoke(null, ord('0') + $i));
|
||||
}
|
||||
|
||||
// The next 26 code points are capital alphabet letters.
|
||||
for ($i = 10; $i < 36; $i++) {
|
||||
// The first ten code points are numbers
|
||||
$this->assertEquals($i, $this->methods['getAlphanumericCode']->invoke(null, ord('A') + $i - 10));
|
||||
}
|
||||
|
||||
// Others are symbol letters.
|
||||
$this->assertEquals(36, $this->methods['getAlphanumericCode']->invoke(null, ' '));
|
||||
$this->assertEquals(37, $this->methods['getAlphanumericCode']->invoke(null, '$'));
|
||||
$this->assertEquals(38, $this->methods['getAlphanumericCode']->invoke(null, '%'));
|
||||
$this->assertEquals(39, $this->methods['getAlphanumericCode']->invoke(null, '*'));
|
||||
$this->assertEquals(40, $this->methods['getAlphanumericCode']->invoke(null, '+'));
|
||||
$this->assertEquals(41, $this->methods['getAlphanumericCode']->invoke(null, '-'));
|
||||
$this->assertEquals(42, $this->methods['getAlphanumericCode']->invoke(null, '.'));
|
||||
$this->assertEquals(43, $this->methods['getAlphanumericCode']->invoke(null, '/'));
|
||||
$this->assertEquals(44, $this->methods['getAlphanumericCode']->invoke(null, ':'));
|
||||
|
||||
// Should return -1 for other letters.
|
||||
$this->assertEquals(-1, $this->methods['getAlphanumericCode']->invoke(null, 'a'));
|
||||
$this->assertEquals(-1, $this->methods['getAlphanumericCode']->invoke(null, '#'));
|
||||
$this->assertEquals(-1, $this->methods['getAlphanumericCode']->invoke(null, "\0"));
|
||||
}
|
||||
|
||||
public function testChooseMode()
|
||||
{
|
||||
// Numeric mode
|
||||
$this->assertSame(Mode::NUMERIC, $this->methods['chooseMode']->invoke(null, '0')->get());
|
||||
$this->assertSame(Mode::NUMERIC, $this->methods['chooseMode']->invoke(null, '0123456789')->get());
|
||||
|
||||
// Alphanumeric mode
|
||||
$this->assertSame(Mode::ALPHANUMERIC, $this->methods['chooseMode']->invoke(null, 'A')->get());
|
||||
$this->assertSame(Mode::ALPHANUMERIC, $this->methods['chooseMode']->invoke(null, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:')->get());
|
||||
|
||||
// 8-bit byte mode
|
||||
$this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, 'a')->get());
|
||||
$this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, '#')->get());
|
||||
$this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, '')->get());
|
||||
|
||||
// AIUE in Hiragana in SHIFT-JIS
|
||||
$this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, "\x8\xa\x8\xa\x8\xa\x8\xa6")->get());
|
||||
|
||||
// Nihon in Kanji in SHIFT-JIS
|
||||
$this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, "\x9\xf\x9\x7b")->get());
|
||||
|
||||
// Sou-Utso-Byou in Kanji in SHIFT-JIS
|
||||
$this->assertSame(Mode::BYTE, $this->methods['chooseMode']->invoke(null, "\xe\x4\x9\x5\x9\x61")->get());
|
||||
}
|
||||
|
||||
public function testEncode()
|
||||
{
|
||||
$qrCode = Encoder::encode('ABCDEF', new ErrorCorrectionLevel(ErrorCorrectionLevel::H));
|
||||
$expected = "<<\n"
|
||||
. " mode: ALPHANUMERIC\n"
|
||||
. " ecLevel: H\n"
|
||||
. " version: 1\n"
|
||||
. " maskPattern: 0\n"
|
||||
. " matrix:\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0\n"
|
||||
. " 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0\n"
|
||||
. " 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0\n"
|
||||
. " 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1\n"
|
||||
. ">>\n";
|
||||
|
||||
$this->assertEquals($expected, $qrCode->__toString());
|
||||
}
|
||||
|
||||
public function testSimpleUtf8Eci()
|
||||
{
|
||||
$qrCode = Encoder::encode('hello', new ErrorCorrectionLevel(ErrorCorrectionLevel::H), 'utf-8');
|
||||
$expected = "<<\n"
|
||||
. " mode: BYTE\n"
|
||||
. " ecLevel: H\n"
|
||||
. " version: 1\n"
|
||||
. " maskPattern: 3\n"
|
||||
. " matrix:\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 0 0\n"
|
||||
. " 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 1 0\n"
|
||||
. " 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1\n"
|
||||
. " 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0\n"
|
||||
. " 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0\n"
|
||||
. " 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0\n"
|
||||
. ">>\n";
|
||||
|
||||
$this->assertEquals($expected, $qrCode->__toString());
|
||||
}
|
||||
|
||||
public function testAppendModeInfo()
|
||||
{
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendModeInfo']->invoke(null, new Mode(Mode::NUMERIC), $bits);
|
||||
$this->assertEquals(' ...X', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testAppendLengthInfo()
|
||||
{
|
||||
// 1 letter (1/1), 10 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendLengthInfo']->invoke(
|
||||
null,
|
||||
1,
|
||||
Version::getVersionForNumber(1),
|
||||
new Mode(Mode::NUMERIC),
|
||||
$bits
|
||||
);
|
||||
$this->assertEquals(' ........ .X', $bits->__toString());
|
||||
|
||||
// 2 letters (2/1), 11 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendLengthInfo']->invoke(
|
||||
null,
|
||||
2,
|
||||
Version::getVersionForNumber(10),
|
||||
new Mode(Mode::ALPHANUMERIC),
|
||||
$bits
|
||||
);
|
||||
$this->assertEquals(' ........ .X.', $bits->__toString());
|
||||
|
||||
// 255 letters (255/1), 16 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendLengthInfo']->invoke(
|
||||
null,
|
||||
255,
|
||||
Version::getVersionForNumber(27),
|
||||
new Mode(Mode::BYTE),
|
||||
$bits
|
||||
);
|
||||
$this->assertEquals(' ........ XXXXXXXX', $bits->__toString());
|
||||
|
||||
// 512 letters (1024/2), 12 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendLengthInfo']->invoke(
|
||||
null,
|
||||
512,
|
||||
Version::getVersionForNumber(40),
|
||||
new Mode(Mode::KANJI),
|
||||
$bits
|
||||
);
|
||||
$this->assertEquals(' ..X..... ....', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testAppendBytes()
|
||||
{
|
||||
// Should use appendNumericBytes.
|
||||
// 1 = 01 = 0001 in 4 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendBytes']->invoke(
|
||||
null,
|
||||
'1',
|
||||
new Mode(Mode::NUMERIC),
|
||||
$bits,
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->assertEquals(' ...X', $bits->__toString());
|
||||
|
||||
// Should use appendAlphaNumericBytes.
|
||||
// A = 10 = 0xa = 001010 in 6 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendBytes']->invoke(
|
||||
null,
|
||||
'A',
|
||||
new Mode(Mode::ALPHANUMERIC),
|
||||
$bits,
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->assertEquals(' ..X.X.', $bits->__toString());
|
||||
|
||||
// Should use append8BitBytes.
|
||||
// 0x61, 0x62, 0x63
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendBytes']->invoke(
|
||||
null,
|
||||
'abc',
|
||||
new Mode(Mode::BYTE),
|
||||
$bits,
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->assertEquals(' .XX....X .XX...X. .XX...XX', $bits->__toString());
|
||||
|
||||
// Should use appendKanjiBytes.
|
||||
// 0x93, 0x5f
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendBytes']->invoke(
|
||||
null,
|
||||
"\x93\x5f",
|
||||
new Mode(Mode::KANJI),
|
||||
$bits,
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->assertEquals(' .XX.XX.. XXXXX', $bits->__toString());
|
||||
|
||||
// Lower letters such as 'a' cannot be encoded in alphanumeric mode.
|
||||
$this->setExpectedException(
|
||||
'BaconQrCode\Exception\WriterException',
|
||||
'Invalid alphanumeric code'
|
||||
);
|
||||
$this->methods['appendBytes']->invoke(
|
||||
null,
|
||||
"a",
|
||||
new Mode(Mode::ALPHANUMERIC),
|
||||
$bits,
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
}
|
||||
|
||||
public function testTerminateBits()
|
||||
{
|
||||
$bits = new BitArray();
|
||||
$this->methods['terminateBits']->invoke(null, 0, $bits);
|
||||
$this->assertEquals('', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$this->methods['terminateBits']->invoke(null, 1, $bits);
|
||||
$this->assertEquals(' ........', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$bits->appendBits(0, 3);
|
||||
$this->methods['terminateBits']->invoke(null, 1, $bits);
|
||||
$this->assertEquals(' ........', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$bits->appendBits(0, 5);
|
||||
$this->methods['terminateBits']->invoke(null, 1, $bits);
|
||||
$this->assertEquals(' ........', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$bits->appendBits(0, 8);
|
||||
$this->methods['terminateBits']->invoke(null, 1, $bits);
|
||||
$this->assertEquals(' ........', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$this->methods['terminateBits']->invoke(null, 2, $bits);
|
||||
$this->assertEquals(' ........ XXX.XX..', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$bits->appendBits(0, 1);
|
||||
$this->methods['terminateBits']->invoke(null, 3, $bits);
|
||||
$this->assertEquals(' ........ XXX.XX.. ...X...X', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testGetNumDataBytesAndNumEcBytesForBlockId()
|
||||
{
|
||||
// Version 1-H.
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 26, 9, 1, 0);
|
||||
$this->assertEquals(9, $numDataBytes);
|
||||
$this->assertEquals(17, $numEcBytes);
|
||||
|
||||
// Version 3-H. 2 blocks.
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 70, 26, 2, 0);
|
||||
$this->assertEquals(13, $numDataBytes);
|
||||
$this->assertEquals(22, $numEcBytes);
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 70, 26, 2, 1);
|
||||
$this->assertEquals(13, $numDataBytes);
|
||||
$this->assertEquals(22, $numEcBytes);
|
||||
|
||||
// Version 7-H. (4 + 1) blocks.
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 196, 66, 5, 0);
|
||||
$this->assertEquals(13, $numDataBytes);
|
||||
$this->assertEquals(26, $numEcBytes);
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 196, 66, 5, 4);
|
||||
$this->assertEquals(14, $numDataBytes);
|
||||
$this->assertEquals(26, $numEcBytes);
|
||||
|
||||
// Version 40-H. (20 + 61) blocks.
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 3706, 1276, 81, 0);
|
||||
$this->assertEquals(15, $numDataBytes);
|
||||
$this->assertEquals(30, $numEcBytes);
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 3706, 1276, 81, 20);
|
||||
$this->assertEquals(16, $numDataBytes);
|
||||
$this->assertEquals(30, $numEcBytes);
|
||||
list($numDataBytes, $numEcBytes) = $this->methods['getNumDataBytesAndNumEcBytesForBlockId']->invoke(null, 3706, 1276, 81, 80);
|
||||
$this->assertEquals(16, $numDataBytes);
|
||||
$this->assertEquals(30, $numEcBytes);
|
||||
}
|
||||
|
||||
public function testInterleaveWithEcBytes()
|
||||
{
|
||||
$dataBytes = SplFixedArray::fromArray(array(32, 65, 205, 69, 41, 220, 46, 128, 236), false);
|
||||
$in = new BitArray();
|
||||
|
||||
foreach ($dataBytes as $dataByte) {
|
||||
$in->appendBits($dataByte, 8);
|
||||
}
|
||||
|
||||
$outBits = $this->methods['interleaveWithEcBytes']->invoke(null, $in, 26, 9, 1);
|
||||
$expected = SplFixedArray::fromArray(array(
|
||||
// Data bytes.
|
||||
32, 65, 205, 69, 41, 220, 46, 128, 236,
|
||||
// Error correction bytes.
|
||||
42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61,
|
||||
), false);
|
||||
|
||||
$out = $outBits->toBytes(0, count($expected));
|
||||
|
||||
$this->assertEquals($expected, $out);
|
||||
}
|
||||
|
||||
public function testAppendNumericBytes()
|
||||
{
|
||||
// 1 = 01 = 0001 in 4 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendNumericBytes']->invoke(null, '1', $bits);
|
||||
$this->assertEquals(' ...X', $bits->__toString());
|
||||
|
||||
// 12 = 0xc = 0001100 in 7 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendNumericBytes']->invoke(null, '12', $bits);
|
||||
$this->assertEquals(' ...XX..', $bits->__toString());
|
||||
|
||||
// 123 = 0x7b = 0001111011 in 10 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendNumericBytes']->invoke(null, '123', $bits);
|
||||
$this->assertEquals(' ...XXXX. XX', $bits->__toString());
|
||||
|
||||
// 1234 = "123" + "4" = 0001111011 + 0100 in 14 bits.
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendNumericBytes']->invoke(null, '1234', $bits);
|
||||
$this->assertEquals(' ...XXXX. XX.X..', $bits->__toString());
|
||||
|
||||
// Empty
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendNumericBytes']->invoke(null, '', $bits);
|
||||
$this->assertEquals('', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testAppendAlphanumericBytes()
|
||||
{
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendAlphanumericBytes']->invoke(null, 'A', $bits);
|
||||
$this->assertEquals(' ..X.X.', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendAlphanumericBytes']->invoke(null, 'AB', $bits);
|
||||
$this->assertEquals(' ..XXX..X X.X', $bits->__toString());
|
||||
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendAlphanumericBytes']->invoke(null, 'ABC', $bits);
|
||||
$this->assertEquals(' ..XXX..X X.X..XX. .', $bits->__toString());
|
||||
|
||||
// Empty
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendAlphanumericBytes']->invoke(null, '', $bits);
|
||||
$this->assertEquals('', $bits->__toString());
|
||||
|
||||
// Invalid data
|
||||
$this->setExpectedException('BaconQrCode\Exception\WriterException', 'Invalid alphanumeric code');
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendAlphanumericBytes']->invoke(null, 'abc', $bits);
|
||||
}
|
||||
|
||||
public function testAppend8BitBytes()
|
||||
{
|
||||
// 0x61, 0x62, 0x63
|
||||
$bits = new BitArray();
|
||||
$this->methods['append8BitBytes']->invoke(null, 'abc', $bits, Encoder::DEFAULT_BYTE_MODE_ECODING);
|
||||
$this->assertEquals(' .XX....X .XX...X. .XX...XX', $bits->__toString());
|
||||
|
||||
// Empty
|
||||
$bits = new BitArray();
|
||||
$this->methods['append8BitBytes']->invoke(null, '', $bits, Encoder::DEFAULT_BYTE_MODE_ECODING);
|
||||
$this->assertEquals('', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testAppendKanjiBytes()
|
||||
{
|
||||
// Numbers are from page 21 of JISX0510:2004
|
||||
$bits = new BitArray();
|
||||
$this->methods['appendKanjiBytes']->invoke(null, "\x93\x5f", $bits);
|
||||
$this->assertEquals(' .XX.XX.. XXXXX', $bits->__toString());
|
||||
|
||||
$this->methods['appendKanjiBytes']->invoke(null, "\xe4\xaa", $bits);
|
||||
$this->assertEquals(' .XX.XX.. XXXXXXX. X.X.X.X. X.', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testGenerateEcBytes()
|
||||
{
|
||||
// Numbers are from http://www.swetake.com/qr/qr3.html and
|
||||
// http://www.swetake.com/qr/qr9.html
|
||||
$dataBytes = SplFixedArray::fromArray(array(32, 65, 205, 69, 41, 220, 46, 128, 236), false);
|
||||
$ecBytes = $this->methods['generateEcBytes']->invoke(null, $dataBytes, 17);
|
||||
$expected = SplFixedArray::fromArray(array(42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237, 85, 224, 96, 74, 219, 61), false);
|
||||
$this->assertEquals($expected, $ecBytes);
|
||||
|
||||
$dataBytes = SplFixedArray::fromArray(array(67, 70, 22, 38, 54, 70, 86, 102, 118, 134, 150, 166, 182, 198, 214), false);
|
||||
$ecBytes = $this->methods['generateEcBytes']->invoke(null, $dataBytes, 18);
|
||||
$expected = SplFixedArray::fromArray(array(175, 80, 155, 64, 178, 45, 214, 233, 65, 209, 12, 155, 117, 31, 140, 214, 27, 187), false);
|
||||
$this->assertEquals($expected, $ecBytes);
|
||||
|
||||
// High-order zero coefficient case.
|
||||
$dataBytes = SplFixedArray::fromArray(array(32, 49, 205, 69, 42, 20, 0, 236, 17), false);
|
||||
$ecBytes = $this->methods['generateEcBytes']->invoke(null, $dataBytes, 17);
|
||||
$expected = SplFixedArray::fromArray(array(0, 3, 130, 179, 194, 0, 55, 211, 110, 79, 98, 72, 170, 96, 211, 137, 213), false);
|
||||
$this->assertEquals($expected, $ecBytes);
|
||||
}
|
||||
}
|
||||
@@ -1,281 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Encoder;
|
||||
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class MaskUtilTest extends TestCase
|
||||
{
|
||||
public static function dataMaskBitProvider()
|
||||
{
|
||||
return array(
|
||||
array(
|
||||
0,
|
||||
array(
|
||||
array(1, 0, 1, 0, 1, 0),
|
||||
array(0, 1, 0, 1, 0, 1),
|
||||
array(1, 0, 1, 0, 1, 0),
|
||||
array(0, 1, 0, 1, 0, 1),
|
||||
array(1, 0, 1, 0, 1, 0),
|
||||
array(0, 1, 0, 1, 0, 1),
|
||||
)
|
||||
),
|
||||
array(
|
||||
1,
|
||||
array(
|
||||
array(1, 1, 1, 1, 1, 1),
|
||||
array(0, 0, 0, 0, 0, 0),
|
||||
array(1, 1, 1, 1, 1, 1),
|
||||
array(0, 0, 0, 0, 0, 0),
|
||||
array(1, 1, 1, 1, 1, 1),
|
||||
array(0, 0, 0, 0, 0, 0),
|
||||
)
|
||||
),
|
||||
array(
|
||||
2,
|
||||
array(
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
)
|
||||
),
|
||||
array(
|
||||
3,
|
||||
array(
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(0, 0, 1, 0, 0, 1),
|
||||
array(0, 1, 0, 0, 1, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(0, 0, 1, 0, 0, 1),
|
||||
array(0, 1, 0, 0, 1, 0),
|
||||
)
|
||||
),
|
||||
array(
|
||||
4,
|
||||
array(
|
||||
array(1, 1, 1, 0, 0, 0),
|
||||
array(1, 1, 1, 0, 0, 0),
|
||||
array(0, 0, 0, 1, 1, 1),
|
||||
array(0, 0, 0, 1, 1, 1),
|
||||
array(1, 1, 1, 0, 0, 0),
|
||||
array(1, 1, 1, 0, 0, 0),
|
||||
)
|
||||
),
|
||||
array(
|
||||
5,
|
||||
array(
|
||||
array(1, 1, 1, 1, 1, 1),
|
||||
array(1, 0, 0, 0, 0, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 1, 0, 1, 0),
|
||||
array(1, 0, 0, 1, 0, 0),
|
||||
array(1, 0, 0, 0, 0, 0),
|
||||
)
|
||||
),
|
||||
array(
|
||||
6,
|
||||
array(
|
||||
array(1, 1, 1, 1, 1, 1),
|
||||
array(1, 1, 1, 0, 0, 0),
|
||||
array(1, 1, 0, 1, 1, 0),
|
||||
array(1, 0, 1, 0, 1, 0),
|
||||
array(1, 0, 1, 1, 0, 1),
|
||||
array(1, 0, 0, 0, 1, 1),
|
||||
)
|
||||
),
|
||||
array(
|
||||
7,
|
||||
array(
|
||||
array(1, 0, 1, 0, 1, 0),
|
||||
array(0, 0, 0, 1, 1, 1),
|
||||
array(1, 0, 0, 0, 1, 1),
|
||||
array(0, 1, 0, 1, 0, 1),
|
||||
array(1, 1, 1, 0, 0, 0),
|
||||
array(0, 1, 1, 1, 0, 0),
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataMaskBitProvider
|
||||
* @param integer $maskPattern
|
||||
* @param array $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testGetDatMaskBit($maskPattern, array $expected)
|
||||
{
|
||||
for ($x = 0; $x < 6; $x++) {
|
||||
for ($y = 0; $y < 6; $y++) {
|
||||
if (($expected[$y][$x] === 1) !== MaskUtil::getDataMaskBit($maskPattern, $x, $y)) {
|
||||
$this->fail('Data mask bit did not match');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function testApplyMaskPenaltyRule1()
|
||||
{
|
||||
$matrix = new ByteMatrix(4, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(2, 0, 0);
|
||||
$matrix->set(3, 0, 0);
|
||||
|
||||
$this->assertEquals(0, MaskUtil::applyMaskPenaltyRule1($matrix));
|
||||
|
||||
// Horizontal
|
||||
$matrix = new ByteMatrix(6, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(2, 0, 0);
|
||||
$matrix->set(3, 0, 0);
|
||||
$matrix->set(4, 0, 0);
|
||||
$matrix->set(5, 0, 1);
|
||||
$this->assertEquals(3, MaskUtil::applyMaskPenaltyRule1($matrix));
|
||||
$matrix->set(5, 0, 0);
|
||||
$this->assertEquals(4, MaskUtil::applyMaskPenaltyRule1($matrix));
|
||||
|
||||
// Vertical
|
||||
$matrix = new ByteMatrix(1, 6);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(0, 1, 0);
|
||||
$matrix->set(0, 2, 0);
|
||||
$matrix->set(0, 3, 0);
|
||||
$matrix->set(0, 4, 0);
|
||||
$matrix->set(0, 5, 1);
|
||||
$this->assertEquals(3, MaskUtil::applyMaskPenaltyRule1($matrix));
|
||||
$matrix->set(0, 5, 0);
|
||||
$this->assertEquals(4, MaskUtil::applyMaskPenaltyRule1($matrix));
|
||||
}
|
||||
|
||||
public function testApplyMaskPenaltyRule2()
|
||||
{
|
||||
$matrix = new ByteMatrix(1, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$this->assertEquals(0, MaskUtil::applyMaskPenaltyRule2($matrix));
|
||||
|
||||
$matrix = new ByteMatrix(2, 2);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(0, 1, 0);
|
||||
$matrix->set(1, 1, 1);
|
||||
$this->assertEquals(0, MaskUtil::applyMaskPenaltyRule2($matrix));
|
||||
|
||||
$matrix = new ByteMatrix(2, 2);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(0, 1, 0);
|
||||
$matrix->set(1, 1, 0);
|
||||
$this->assertEquals(3, MaskUtil::applyMaskPenaltyRule2($matrix));
|
||||
|
||||
$matrix = new ByteMatrix(3, 3);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(2, 0, 0);
|
||||
$matrix->set(0, 1, 0);
|
||||
$matrix->set(1, 1, 0);
|
||||
$matrix->set(2, 1, 0);
|
||||
$matrix->set(0, 2, 0);
|
||||
$matrix->set(1, 2, 0);
|
||||
$matrix->set(2, 2, 0);
|
||||
$this->assertEquals(3 * 4, MaskUtil::applyMaskPenaltyRule2($matrix));
|
||||
}
|
||||
|
||||
public function testApplyMaskPenalty3()
|
||||
{
|
||||
// Horizontal 00001011101
|
||||
$matrix = new ByteMatrix(11, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(2, 0, 0);
|
||||
$matrix->set(3, 0, 0);
|
||||
$matrix->set(4, 0, 1);
|
||||
$matrix->set(5, 0, 0);
|
||||
$matrix->set(6, 0, 1);
|
||||
$matrix->set(7, 0, 1);
|
||||
$matrix->set(8, 0, 1);
|
||||
$matrix->set(9, 0, 0);
|
||||
$matrix->set(10, 0, 1);
|
||||
$this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
|
||||
|
||||
// Horizontal 10111010000
|
||||
$matrix = new ByteMatrix(11, 1);
|
||||
$matrix->set(0, 0, 1);
|
||||
$matrix->set(1, 0, 0);
|
||||
$matrix->set(2, 0, 1);
|
||||
$matrix->set(3, 0, 1);
|
||||
$matrix->set(4, 0, 1);
|
||||
$matrix->set(5, 0, 0);
|
||||
$matrix->set(6, 0, 1);
|
||||
$matrix->set(7, 0, 0);
|
||||
$matrix->set(8, 0, 0);
|
||||
$matrix->set(9, 0, 0);
|
||||
$matrix->set(10, 0, 0);
|
||||
$this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
|
||||
|
||||
// Vertical 00001011101
|
||||
$matrix = new ByteMatrix(1, 11);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(0, 1, 0);
|
||||
$matrix->set(0, 2, 0);
|
||||
$matrix->set(0, 3, 0);
|
||||
$matrix->set(0, 4, 1);
|
||||
$matrix->set(0, 5, 0);
|
||||
$matrix->set(0, 6, 1);
|
||||
$matrix->set(0, 7, 1);
|
||||
$matrix->set(0, 8, 1);
|
||||
$matrix->set(0, 9, 0);
|
||||
$matrix->set(0, 10, 1);
|
||||
$this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
|
||||
|
||||
// Vertical 10111010000
|
||||
$matrix = new ByteMatrix(1, 11);
|
||||
$matrix->set(0, 0, 1);
|
||||
$matrix->set(0, 1, 0);
|
||||
$matrix->set(0, 2, 1);
|
||||
$matrix->set(0, 3, 1);
|
||||
$matrix->set(0, 4, 1);
|
||||
$matrix->set(0, 5, 0);
|
||||
$matrix->set(0, 6, 1);
|
||||
$matrix->set(0, 7, 0);
|
||||
$matrix->set(0, 8, 0);
|
||||
$matrix->set(0, 9, 0);
|
||||
$matrix->set(0, 10, 0);
|
||||
$this->assertEquals(40, MaskUtil::applyMaskPenaltyRule3($matrix));
|
||||
}
|
||||
|
||||
public function testApplyMaskPenaltyRule4()
|
||||
{
|
||||
// Dark cell ratio = 0%
|
||||
$matrix = new ByteMatrix(1, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$this->assertEquals(100, MaskUtil::applyMaskPenaltyRule4($matrix));
|
||||
|
||||
// Dark cell ratio = 5%
|
||||
$matrix = new ByteMatrix(2, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(0, 0, 1);
|
||||
$this->assertEquals(0, MaskUtil::applyMaskPenaltyRule4($matrix));
|
||||
|
||||
// Dark cell ratio = 66.67%
|
||||
$matrix = new ByteMatrix(6, 1);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 1);
|
||||
$matrix->set(2, 0, 1);
|
||||
$matrix->set(3, 0, 1);
|
||||
$matrix->set(4, 0, 1);
|
||||
$matrix->set(5, 0, 0);
|
||||
$this->assertEquals(30, MaskUtil::applyMaskPenaltyRule4($matrix));
|
||||
}
|
||||
}
|
||||
@@ -1,336 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Encoder;
|
||||
|
||||
use BaconQrCode\Common\BitArray;
|
||||
use BaconQrCode\Common\ErrorCorrectionLevel;
|
||||
use BaconQrCode\Common\Version;
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
|
||||
class MatrixUtilTest extends TestCase
|
||||
{
|
||||
protected $methods = array();
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
// Hack to be able to test protected methods
|
||||
$reflection = new ReflectionClass('BaconQrCode\Encoder\MatrixUtil');
|
||||
|
||||
foreach ($reflection->getMethods(ReflectionMethod::IS_STATIC) as $method) {
|
||||
$method->setAccessible(true);
|
||||
$this->methods[$method->getName()] = $method;
|
||||
}
|
||||
}
|
||||
|
||||
public function testToString()
|
||||
{
|
||||
$matrix= new ByteMatrix(3, 3);
|
||||
$matrix->set(0, 0, 0);
|
||||
$matrix->set(1, 0, 1);
|
||||
$matrix->set(2, 0, 0);
|
||||
$matrix->set(0, 1, 1);
|
||||
$matrix->set(1, 1, 0);
|
||||
$matrix->set(2, 1, 1);
|
||||
$matrix->set(0, 2, -1);
|
||||
$matrix->set(1, 2, -1);
|
||||
$matrix->set(2, 2, -1);
|
||||
|
||||
$expected = " 0 1 0\n 1 0 1\n \n";
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testClearMatrix()
|
||||
{
|
||||
$matrix = new ByteMatrix(2, 2);
|
||||
MatrixUtil::clearMatrix($matrix);
|
||||
|
||||
$this->assertEquals(-1, $matrix->get(0, 0));
|
||||
$this->assertEquals(-1, $matrix->get(1, 0));
|
||||
$this->assertEquals(-1, $matrix->get(0, 1));
|
||||
$this->assertEquals(-1, $matrix->get(1, 1));
|
||||
}
|
||||
|
||||
public function testEmbedBasicPatterns1()
|
||||
{
|
||||
$matrix = new ByteMatrix(21, 21);
|
||||
MatrixUtil::clearMatrix($matrix);
|
||||
$this->methods['embedBasicPatterns']->invoke(
|
||||
null,
|
||||
Version::getVersionForNumber(1),
|
||||
$matrix
|
||||
);
|
||||
$expected = " 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 1 \n"
|
||||
. " 0 0 0 0 0 0 0 0 1 \n"
|
||||
. " 1 1 1 1 1 1 1 0 \n"
|
||||
. " 1 0 0 0 0 0 1 0 \n"
|
||||
. " 1 0 1 1 1 0 1 0 \n"
|
||||
. " 1 0 1 1 1 0 1 0 \n"
|
||||
. " 1 0 1 1 1 0 1 0 \n"
|
||||
. " 1 0 0 0 0 0 1 0 \n"
|
||||
. " 1 1 1 1 1 1 1 0 \n";
|
||||
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testEmbedBasicPatterns2()
|
||||
{
|
||||
$matrix = new ByteMatrix(25, 25);
|
||||
MatrixUtil::clearMatrix($matrix);
|
||||
$this->methods['embedBasicPatterns']->invoke(
|
||||
null,
|
||||
Version::getVersionForNumber(2),
|
||||
$matrix
|
||||
);
|
||||
$expected = " 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 1 1 1 1 1 1 \n"
|
||||
. " 0 0 0 0 0 0 0 0 1 1 0 0 0 1 \n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 \n"
|
||||
. " 1 0 0 0 0 0 1 0 1 0 0 0 1 \n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 1 1 1 \n"
|
||||
. " 1 0 1 1 1 0 1 0 \n"
|
||||
. " 1 0 1 1 1 0 1 0 \n"
|
||||
. " 1 0 0 0 0 0 1 0 \n"
|
||||
. " 1 1 1 1 1 1 1 0 \n";
|
||||
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testEmbedTypeInfo()
|
||||
{
|
||||
$matrix = new ByteMatrix(21, 21);
|
||||
MatrixUtil::clearMatrix($matrix);
|
||||
$this->methods['embedTypeInfo']->invoke(
|
||||
null,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::M),
|
||||
5,
|
||||
$matrix
|
||||
);
|
||||
$expected = " 0 \n"
|
||||
. " 1 \n"
|
||||
. " 1 \n"
|
||||
. " 1 \n"
|
||||
. " 0 \n"
|
||||
. " 0 \n"
|
||||
. " \n"
|
||||
. " 1 \n"
|
||||
. " 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0\n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " 0 \n"
|
||||
. " 0 \n"
|
||||
. " 0 \n"
|
||||
. " 0 \n"
|
||||
. " 0 \n"
|
||||
. " 0 \n"
|
||||
. " 1 \n";
|
||||
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testEmbedVersionInfo()
|
||||
{
|
||||
$matrix = new ByteMatrix(21, 21);
|
||||
MatrixUtil::clearMatrix($matrix);
|
||||
$this->methods['maybeEmbedVersionInfo']->invoke(
|
||||
null,
|
||||
Version::getVersionForNumber(7),
|
||||
$matrix
|
||||
);
|
||||
$expected = " 0 0 1 \n"
|
||||
. " 0 1 0 \n"
|
||||
. " 0 1 0 \n"
|
||||
. " 0 1 1 \n"
|
||||
. " 1 1 1 \n"
|
||||
. " 0 0 0 \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " 0 0 0 0 1 0 \n"
|
||||
. " 0 1 1 1 1 0 \n"
|
||||
. " 1 0 0 1 1 0 \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n"
|
||||
. " \n";
|
||||
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testEmbedDataBits()
|
||||
{
|
||||
$matrix = new ByteMatrix(21, 21);
|
||||
MatrixUtil::clearMatrix($matrix);
|
||||
$this->methods['embedBasicPatterns']->invoke(
|
||||
null,
|
||||
Version::getVersionForNumber(1),
|
||||
$matrix
|
||||
);
|
||||
|
||||
$bits = new BitArray();
|
||||
$this->methods['embedDataBits']->invoke(
|
||||
null,
|
||||
$bits,
|
||||
-1,
|
||||
$matrix
|
||||
);
|
||||
|
||||
$expected = " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n";
|
||||
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testBuildMatrix()
|
||||
{
|
||||
$bytes = array(
|
||||
32, 65, 205, 69, 41, 220, 46, 128, 236, 42, 159, 74, 221, 244, 169,
|
||||
239, 150, 138, 70, 237, 85, 224, 96, 74, 219 , 61
|
||||
);
|
||||
$bits = new BitArray();
|
||||
|
||||
foreach ($bytes as $byte) {
|
||||
$bits->appendBits($byte, 8);
|
||||
}
|
||||
|
||||
$matrix = new ByteMatrix(21, 21);
|
||||
MatrixUtil::buildMatrix(
|
||||
$bits,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::H),
|
||||
Version::getVersionForNumber(1),
|
||||
3,
|
||||
$matrix
|
||||
);
|
||||
|
||||
$expected = " 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0\n"
|
||||
. " 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0\n"
|
||||
. " 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0\n"
|
||||
. " 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0\n"
|
||||
. " 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0\n"
|
||||
. " 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1\n"
|
||||
. " 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1\n"
|
||||
. " 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0\n"
|
||||
. " 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0\n"
|
||||
. " 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0\n"
|
||||
. " 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0\n";
|
||||
|
||||
$this->assertEquals($expected, $matrix->__toString());
|
||||
}
|
||||
|
||||
public function testFindMsbSet()
|
||||
{
|
||||
$this->assertEquals(0, $this->methods['findMsbSet']->invoke(null, 0));
|
||||
$this->assertEquals(1, $this->methods['findMsbSet']->invoke(null, 1));
|
||||
$this->assertEquals(8, $this->methods['findMsbSet']->invoke(null, 0x80));
|
||||
$this->assertEquals(32, $this->methods['findMsbSet']->invoke(null, 0x80000000));
|
||||
}
|
||||
|
||||
public function testCalculateBchCode()
|
||||
{
|
||||
// Encoding of type information.
|
||||
// From Appendix C in JISX0510:2004 (p 65)
|
||||
$this->assertEquals(0xdc, $this->methods['calculateBchCode']->invoke(null, 5, 0x537));
|
||||
// From http://www.swetake.com/qr/qr6.html
|
||||
$this->assertEquals(0x1c2, $this->methods['calculateBchCode']->invoke(null, 0x13, 0x537));
|
||||
// From http://www.swetake.com/qr/qr11.html
|
||||
$this->assertEquals(0x214, $this->methods['calculateBchCode']->invoke(null, 0x1b, 0x537));
|
||||
|
||||
// Encoding of version information.
|
||||
// From Appendix D in JISX0510:2004 (p 68)
|
||||
$this->assertEquals(0xc94, $this->methods['calculateBchCode']->invoke(null, 7, 0x1f25));
|
||||
$this->assertEquals(0x5bc, $this->methods['calculateBchCode']->invoke(null, 8, 0x1f25));
|
||||
$this->assertEquals(0xa99, $this->methods['calculateBchCode']->invoke(null, 9, 0x1f25));
|
||||
$this->assertEquals(0x4d3, $this->methods['calculateBchCode']->invoke(null, 10, 0x1f25));
|
||||
$this->assertEquals(0x9a6, $this->methods['calculateBchCode']->invoke(null, 20, 0x1f25));
|
||||
$this->assertEquals(0xd75, $this->methods['calculateBchCode']->invoke(null, 30, 0x1f25));
|
||||
$this->assertEquals(0xc69, $this->methods['calculateBchCode']->invoke(null, 40, 0x1f25));
|
||||
}
|
||||
|
||||
public function testMakeVersionInfoBits()
|
||||
{
|
||||
// From Appendix D in JISX0510:2004 (p 68)
|
||||
$bits = new BitArray();
|
||||
$this->methods['makeVersionInfoBits']->invoke(null, Version::getVersionForNumber(7), $bits);
|
||||
$this->assertEquals(' ...XXXXX ..X..X.X ..', $bits->__toString());
|
||||
}
|
||||
|
||||
public function testMakeTypeInfoBits()
|
||||
{
|
||||
// From Appendix D in JISX0510:2004 (p 68)
|
||||
$bits = new BitArray();
|
||||
$this->methods['makeTypeInfoBits']->invoke(null, new ErrorCorrectionLevel(ErrorCorrectionLevel::M), 5, $bits);
|
||||
$this->assertEquals(' X......X X..XXX.', $bits->__toString());
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Encoder;
|
||||
|
||||
use BaconQrCode\Common\ErrorCorrectionLevel;
|
||||
use BaconQrCode\Renderer\Text\Html;
|
||||
use BaconQrCode\Writer;
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class HtmlTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var Html
|
||||
*/
|
||||
protected $renderer;
|
||||
|
||||
/**
|
||||
* @var Writer
|
||||
*/
|
||||
protected $writer;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
$this->renderer = new Html();
|
||||
$this->writer = new Writer($this->renderer);
|
||||
}
|
||||
|
||||
public function testBasicRender()
|
||||
{
|
||||
$content = 'foobar';
|
||||
$expected =
|
||||
'<pre style="font-family: monospace; line-height: 0.65em; letter-spacing: -1px" class="">' .
|
||||
" \n" .
|
||||
" ███████ █████ ███████ \n" .
|
||||
" █ █ █ █ █ █ \n" .
|
||||
" █ ███ █ ██ █ ███ █ \n" .
|
||||
" █ ███ █ ███ █ ███ █ \n" .
|
||||
" █ ███ █ █ █ █ ███ █ \n" .
|
||||
" █ █ ██ █ █ \n" .
|
||||
" ███████ █ █ █ ███████ \n" .
|
||||
" █████ \n" .
|
||||
" ██ ██ █ ██ █ █ █ \n" .
|
||||
" ██ ██ █ █ ██ \n" .
|
||||
" ████████ █ ██ █ ██ \n" .
|
||||
" ██ █ █ \n" .
|
||||
" ██ ███ █ █ █ █ \n" .
|
||||
" █ ███ █ █ \n" .
|
||||
" ███████ ██ ██████ \n" .
|
||||
" █ █ ████ ██ \n" .
|
||||
" █ ███ █ ██ ██ ██ █ ██ \n" .
|
||||
" █ ███ █ ██ ██ █ ██ \n" .
|
||||
" █ ███ █ █ █ ██ ██ \n" .
|
||||
" █ █ ███ ███ ████ \n" .
|
||||
" ███████ ████ ██ \n" .
|
||||
" \n" .
|
||||
'</pre>'
|
||||
;
|
||||
|
||||
$qrCode = Encoder::encode(
|
||||
$content,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L),
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->assertEquals($expected, $this->renderer->render($qrCode));
|
||||
}
|
||||
|
||||
public function testSetStyle()
|
||||
{
|
||||
$content = 'foobar';
|
||||
$qrCode = Encoder::encode(
|
||||
$content,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L),
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->renderer->setStyle('bar');
|
||||
$this->assertEquals('bar', $this->renderer->getStyle());
|
||||
$this->assertStringMatchesFormat('%astyle="bar"%a', $this->renderer->render($qrCode));
|
||||
}
|
||||
|
||||
public function testSetClass()
|
||||
{
|
||||
$content = 'foobar';
|
||||
$qrCode = Encoder::encode(
|
||||
$content,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L),
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->renderer->setClass('bar');
|
||||
$this->assertEquals('bar', $this->renderer->getClass());
|
||||
$this->assertStringMatchesFormat('%aclass="bar"%a', $this->renderer->render($qrCode));
|
||||
}
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
namespace BaconQrCode\Encoder;
|
||||
|
||||
use BaconQrCode\Common\ErrorCorrectionLevel;
|
||||
use BaconQrCode\Renderer\Text\Plain;
|
||||
use BaconQrCode\Writer;
|
||||
use PHPUnit_Framework_TestCase as TestCase;
|
||||
|
||||
class PlainTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var Plain
|
||||
*/
|
||||
protected $renderer;
|
||||
|
||||
/**
|
||||
* @var Writer
|
||||
*/
|
||||
protected $writer;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
$this->renderer = new Plain();
|
||||
$this->writer = new Writer($this->renderer);
|
||||
}
|
||||
|
||||
public function testBasicRender()
|
||||
{
|
||||
$content = 'foobar';
|
||||
$expected =
|
||||
" \n" .
|
||||
" ███████ █████ ███████ \n" .
|
||||
" █ █ █ █ █ █ \n" .
|
||||
" █ ███ █ ██ █ ███ █ \n" .
|
||||
" █ ███ █ ███ █ ███ █ \n" .
|
||||
" █ ███ █ █ █ █ ███ █ \n" .
|
||||
" █ █ ██ █ █ \n" .
|
||||
" ███████ █ █ █ ███████ \n" .
|
||||
" █████ \n" .
|
||||
" ██ ██ █ ██ █ █ █ \n" .
|
||||
" ██ ██ █ █ ██ \n" .
|
||||
" ████████ █ ██ █ ██ \n" .
|
||||
" ██ █ █ \n" .
|
||||
" ██ ███ █ █ █ █ \n" .
|
||||
" █ ███ █ █ \n" .
|
||||
" ███████ ██ ██████ \n" .
|
||||
" █ █ ████ ██ \n" .
|
||||
" █ ███ █ ██ ██ ██ █ ██ \n" .
|
||||
" █ ███ █ ██ ██ █ ██ \n" .
|
||||
" █ ███ █ █ █ ██ ██ \n" .
|
||||
" █ █ ███ ███ ████ \n" .
|
||||
" ███████ ████ ██ \n" .
|
||||
" \n"
|
||||
;
|
||||
|
||||
$qrCode = Encoder::encode(
|
||||
$content,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L),
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->assertEquals($expected, $this->renderer->render($qrCode));
|
||||
}
|
||||
|
||||
public function testBasicRenderNoMargins()
|
||||
{
|
||||
$content = 'foobar';
|
||||
$expected =
|
||||
"███████ █████ ███████\n" .
|
||||
"█ █ █ █ █ █\n" .
|
||||
"█ ███ █ ██ █ ███ █\n" .
|
||||
"█ ███ █ ███ █ ███ █\n" .
|
||||
"█ ███ █ █ █ █ ███ █\n" .
|
||||
"█ █ ██ █ █\n" .
|
||||
"███████ █ █ █ ███████\n" .
|
||||
" █████ \n" .
|
||||
"██ ██ █ ██ █ █ █\n" .
|
||||
" ██ ██ █ █ ██ \n" .
|
||||
" ████████ █ ██ █ ██\n" .
|
||||
" ██ █ █\n" .
|
||||
" ██ ███ █ █ █ █\n" .
|
||||
" █ ███ █ █ \n" .
|
||||
"███████ ██ ██████ \n" .
|
||||
"█ █ ████ ██ \n" .
|
||||
"█ ███ █ ██ ██ ██ █ ██\n" .
|
||||
"█ ███ █ ██ ██ █ ██ \n" .
|
||||
"█ ███ █ █ █ ██ ██\n" .
|
||||
"█ █ ███ ███ ████\n" .
|
||||
"███████ ████ ██ \n"
|
||||
;
|
||||
|
||||
$qrCode = Encoder::encode(
|
||||
$content,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L),
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->renderer->setMargin(0);
|
||||
$this->assertEquals(0, $this->renderer->getMargin());
|
||||
$this->assertEquals($expected, $this->renderer->render($qrCode));
|
||||
}
|
||||
|
||||
public function testBasicRenderCustomChar()
|
||||
{
|
||||
$content = 'foobar';
|
||||
$expected =
|
||||
"-----------------------\n" .
|
||||
"-#######-#####-#######-\n" .
|
||||
"-#-----#--#-#--#-----#-\n" .
|
||||
"-#-###-#--##---#-###-#-\n" .
|
||||
"-#-###-#--###--#-###-#-\n" .
|
||||
"-#-###-#---#-#-#-###-#-\n" .
|
||||
"-#-----#----##-#-----#-\n" .
|
||||
"-#######-#-#-#-#######-\n" .
|
||||
"---------#####---------\n" .
|
||||
"-##-##-#--##-#-#-----#-\n" .
|
||||
"----##----##-#-#-##----\n" .
|
||||
"--########-#--##-#--##-\n" .
|
||||
"-----------##------#-#-\n" .
|
||||
"--##--###--#---#--#--#-\n" .
|
||||
"---------#-###----#-#--\n" .
|
||||
"-#######--##-######----\n" .
|
||||
"-#-----#---####---##---\n" .
|
||||
"-#-###-#-##-##-##-#-##-\n" .
|
||||
"-#-###-#-##-##--#-##---\n" .
|
||||
"-#-###-#---#---#-##-##-\n" .
|
||||
"-#-----#-###--###-####-\n" .
|
||||
"-#######-####---##-----\n" .
|
||||
"-----------------------\n"
|
||||
;
|
||||
|
||||
$qrCode = Encoder::encode(
|
||||
$content,
|
||||
new ErrorCorrectionLevel(ErrorCorrectionLevel::L),
|
||||
Encoder::DEFAULT_BYTE_MODE_ECODING
|
||||
);
|
||||
$this->renderer->setFullBlock('#');
|
||||
$this->renderer->setEmptyBlock('-');
|
||||
$this->assertEquals('#', $this->renderer->getFullBlock());
|
||||
$this->assertEquals('-', $this->renderer->getEmptyBlock());
|
||||
$this->assertEquals($expected, $this->renderer->render($qrCode));
|
||||
}
|
||||
}
|
||||
10
vendor/bacon/bacon-qr-code/tests/bootstrap.php
vendored
10
vendor/bacon/bacon-qr-code/tests/bootstrap.php
vendored
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* BaconQrCode
|
||||
*
|
||||
* @link http://github.com/Bacon/BaconQrCode For the canonical source repository
|
||||
* @copyright 2013 Ben 'DASPRiD' Scholzen
|
||||
* @license http://opensource.org/licenses/BSD-2-Clause Simplified BSD License
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../autoload_register.php';
|
||||
11
vendor/bacon/bacon-qr-code/tests/phpunit.xml
vendored
11
vendor/bacon/bacon-qr-code/tests/phpunit.xml
vendored
@@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit bootstrap="./bootstrap.php" colors="true">
|
||||
<testsuite name="BaconQrCode">
|
||||
<directory>.</directory>
|
||||
</testsuite>
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory suffix=".php">../src/</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
||||
186
vendor/robthree/twofactorauth/.gitignore
vendored
186
vendor/robthree/twofactorauth/.gitignore
vendored
@@ -1,186 +0,0 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
build/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
|
||||
# Roslyn cache directories
|
||||
*.ide/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
#NUNIT
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_i.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# JustCode is a .NET coding addin-in
|
||||
.JustCode
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# TODO: Comment the next line if you want to checkin your web deploy settings
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/packages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/packages/build/
|
||||
# If using the old MSBuild-Integrated Package Restore, uncomment this:
|
||||
#!**/packages/repositories.config
|
||||
|
||||
# Windows Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Windows Store app package directory
|
||||
AppPackages/
|
||||
|
||||
# Others
|
||||
sql/
|
||||
*.Cache
|
||||
ClientBin/
|
||||
[Ss]tyle[Cc]op.*
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
node_modules/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# Composer
|
||||
/vendor
|
||||
11
vendor/robthree/twofactorauth/.travis.yml
vendored
11
vendor/robthree/twofactorauth/.travis.yml
vendored
@@ -1,11 +0,0 @@
|
||||
language: php
|
||||
|
||||
php:
|
||||
- 5.3
|
||||
- 5.4
|
||||
- 5.5
|
||||
- 5.6
|
||||
- 7
|
||||
- hhvm
|
||||
|
||||
script: phpunit --coverage-text tests
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,69 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Name>TwoFactorAuth</Name>
|
||||
<ProjectGuid>{e569f53a-a604-4579-91ce-4e35b27da47b}</ProjectGuid>
|
||||
<RootNamespace>TwoFactorAuth</RootNamespace>
|
||||
<OutputType>Library</OutputType>
|
||||
<ProjectTypeGuids>{A0786B88-2ADB-4C21-ABE8-AA2D79766269}</ProjectTypeGuids>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
<Server>PHPDev</Server>
|
||||
<PublishEvent>None</PublishEvent>
|
||||
<PHPDevAutoPort>True</PHPDevAutoPort>
|
||||
<PHPDevPort>41315</PHPDevPort>
|
||||
<PHPDevHostName>localhost</PHPDevHostName>
|
||||
<IISProjectUrl>http://localhost:41315/</IISProjectUrl>
|
||||
<Runtime>PHP</Runtime>
|
||||
<RuntimeVersion>7.0</RuntimeVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<IncludeDebugInformation>true</IncludeDebugInformation>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<IncludeDebugInformation>false</IncludeDebugInformation>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="demo\demo.php" />
|
||||
<Compile Include="demo\loader.php" />
|
||||
<Compile Include="lib\Providers\Qr\BaseHTTPQRCodeProvider.php" />
|
||||
<Compile Include="lib\Providers\Qr\GoogleQRCodeProvider.php" />
|
||||
<Compile Include="lib\Providers\Qr\IQRCodeProvider.php" />
|
||||
<Compile Include="lib\Providers\Qr\QRException.php" />
|
||||
<Compile Include="lib\Providers\Qr\QRicketProvider.php" />
|
||||
<Compile Include="lib\Providers\Qr\QRServerProvider.php" />
|
||||
<Compile Include="lib\Providers\Rng\CSRNGProvider.php" />
|
||||
<Compile Include="lib\Providers\Rng\IRNGProvider.php" />
|
||||
<Compile Include="lib\Providers\Rng\MCryptRNGProvider.php" />
|
||||
<Compile Include="lib\Providers\Rng\OpenSSLRNGProvider.php" />
|
||||
<Compile Include="lib\Providers\Rng\HashRNGProvider.php" />
|
||||
<Compile Include="lib\Providers\Rng\RNGException.php" />
|
||||
<Compile Include="lib\Providers\Time\ConvertUnixTimeDotComTimeProvider.php" />
|
||||
<Compile Include="lib\Providers\Time\HttpTimeProvider.php" />
|
||||
<Compile Include="lib\Providers\Time\ITimeProvider.php" />
|
||||
<Compile Include="lib\Providers\Time\LocalMachineTimeProvider.php" />
|
||||
<Compile Include="lib\Providers\Time\TimeException.php" />
|
||||
<Compile Include="lib\TwoFactorAuth.php" />
|
||||
<Compile Include=".gitignore" />
|
||||
<Compile Include="README.md" />
|
||||
<Compile Include="lib\TwoFactorAuthException.php" />
|
||||
<Compile Include="tests\TwoFactorAuthTest.php" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="lib\" />
|
||||
<Folder Include="lib\Providers\" />
|
||||
<Folder Include="lib\Providers\Time\" />
|
||||
<Folder Include="lib\Providers\Qr\" />
|
||||
<Folder Include="lib\Providers\Rng\" />
|
||||
<Folder Include="demo\" />
|
||||
<Folder Include="tests\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include=".travis.yml" />
|
||||
<Content Include="composer.json" />
|
||||
<Content Include="composer.lock" />
|
||||
<Content Include="logo.png" />
|
||||
<Content Include="multifactorauthforeveryone.png" />
|
||||
<Content Include="LICENSE" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
36
vendor/robthree/twofactorauth/composer.json
vendored
36
vendor/robthree/twofactorauth/composer.json
vendored
@@ -1,36 +0,0 @@
|
||||
{
|
||||
"name": "robthree/twofactorauth",
|
||||
"description": "Two Factor Authentication",
|
||||
"version": "1.6",
|
||||
"type": "library",
|
||||
"keywords": [ "Authentication", "Two Factor Authentication", "Multi Factor Authentication", "TFA", "MFA", "PHP", "Authenticator", "Authy" ],
|
||||
"homepage": "https://github.com/RobThree/TwoFactorAuth",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Rob Janssen",
|
||||
"homepage": "http://robiii.me",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/RobThree/TwoFactorAuth/issues",
|
||||
"source": "https://github.com/RobThree/TwoFactorAuth"
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "@stable"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"RobThree\\Auth\\": "lib"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"RobThree\\Auth\\Test\\": "tests"
|
||||
}
|
||||
}
|
||||
}
|
||||
980
vendor/robthree/twofactorauth/composer.lock
generated
vendored
980
vendor/robthree/twofactorauth/composer.lock
generated
vendored
@@ -1,980 +0,0 @@
|
||||
{
|
||||
"_readme": [
|
||||
"This file locks the dependencies of your project to a known state",
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "9647de85f54ba6db237f5ff42ff85a1f",
|
||||
"packages": [],
|
||||
"packages-dev": [
|
||||
{
|
||||
"name": "doctrine/instantiator",
|
||||
"version": "1.0.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/doctrine/instantiator.git",
|
||||
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
|
||||
"reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3,<8.0-DEV"
|
||||
},
|
||||
"require-dev": {
|
||||
"athletic/athletic": "~0.1.8",
|
||||
"ext-pdo": "*",
|
||||
"ext-phar": "*",
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"squizlabs/php_codesniffer": "~2.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Marco Pivetta",
|
||||
"email": "ocramius@gmail.com",
|
||||
"homepage": "http://ocramius.github.com/"
|
||||
}
|
||||
],
|
||||
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
|
||||
"homepage": "https://github.com/doctrine/instantiator",
|
||||
"keywords": [
|
||||
"constructor",
|
||||
"instantiate"
|
||||
],
|
||||
"time": "2015-06-14T21:17:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/reflection-docblock",
|
||||
"version": "2.0.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
|
||||
"reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
|
||||
"reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0"
|
||||
},
|
||||
"suggest": {
|
||||
"dflydev/markdown": "~1.0",
|
||||
"erusev/parsedown": "~1.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"phpDocumentor": [
|
||||
"src/"
|
||||
]
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Mike van Riel",
|
||||
"email": "mike.vanriel@naenius.com"
|
||||
}
|
||||
],
|
||||
"time": "2015-02-03T12:10:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpspec/prophecy",
|
||||
"version": "v1.6.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpspec/prophecy.git",
|
||||
"reference": "6c52c2722f8460122f96f86346600e1077ce22cb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb",
|
||||
"reference": "6c52c2722f8460122f96f86346600e1077ce22cb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/instantiator": "^1.0.2",
|
||||
"php": "^5.3|^7.0",
|
||||
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
|
||||
"sebastian/comparator": "^1.1",
|
||||
"sebastian/recursion-context": "^1.0|^2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpspec/phpspec": "^2.0",
|
||||
"phpunit/phpunit": "^4.8 || ^5.6.5"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.6.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"Prophecy\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Konstantin Kudryashov",
|
||||
"email": "ever.zet@gmail.com",
|
||||
"homepage": "http://everzet.com"
|
||||
},
|
||||
{
|
||||
"name": "Marcello Duarte",
|
||||
"email": "marcello.duarte@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Highly opinionated mocking framework for PHP 5.3+",
|
||||
"homepage": "https://github.com/phpspec/prophecy",
|
||||
"keywords": [
|
||||
"Double",
|
||||
"Dummy",
|
||||
"fake",
|
||||
"mock",
|
||||
"spy",
|
||||
"stub"
|
||||
],
|
||||
"time": "2016-11-21T14:58:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-code-coverage",
|
||||
"version": "2.2.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
|
||||
"reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
|
||||
"reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3",
|
||||
"phpunit/php-file-iterator": "~1.3",
|
||||
"phpunit/php-text-template": "~1.2",
|
||||
"phpunit/php-token-stream": "~1.3",
|
||||
"sebastian/environment": "^1.3.2",
|
||||
"sebastian/version": "~1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-xdebug": ">=2.1.4",
|
||||
"phpunit/phpunit": "~4"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-dom": "*",
|
||||
"ext-xdebug": ">=2.2.1",
|
||||
"ext-xmlwriter": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.2.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sb@sebastian-bergmann.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
|
||||
"keywords": [
|
||||
"coverage",
|
||||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2015-10-06T15:47:00+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-file-iterator",
|
||||
"version": "1.4.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
|
||||
"reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
|
||||
"reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.4.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sb@sebastian-bergmann.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
|
||||
"keywords": [
|
||||
"filesystem",
|
||||
"iterator"
|
||||
],
|
||||
"time": "2016-10-03T07:40:28+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-text-template",
|
||||
"version": "1.2.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-text-template.git",
|
||||
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
|
||||
"reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Simple template engine.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
|
||||
"keywords": [
|
||||
"template"
|
||||
],
|
||||
"time": "2015-06-21T13:50:34+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-timer",
|
||||
"version": "1.0.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-timer.git",
|
||||
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
|
||||
"reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4|~5"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sb@sebastian-bergmann.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Utility class for timing",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-timer/",
|
||||
"keywords": [
|
||||
"timer"
|
||||
],
|
||||
"time": "2016-05-12T18:03:57+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/php-token-stream",
|
||||
"version": "1.4.9",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
|
||||
"reference": "3b402f65a4cc90abf6e1104e388b896ce209631b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b",
|
||||
"reference": "3b402f65a4cc90abf6e1104e388b896ce209631b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-tokenizer": "*",
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.2"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.4-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Wrapper around PHP's tokenizer extension.",
|
||||
"homepage": "https://github.com/sebastianbergmann/php-token-stream/",
|
||||
"keywords": [
|
||||
"tokenizer"
|
||||
],
|
||||
"time": "2016-11-15T14:06:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit",
|
||||
"version": "4.8.35",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||
"reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87",
|
||||
"reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-dom": "*",
|
||||
"ext-json": "*",
|
||||
"ext-pcre": "*",
|
||||
"ext-reflection": "*",
|
||||
"ext-spl": "*",
|
||||
"php": ">=5.3.3",
|
||||
"phpspec/prophecy": "^1.3.1",
|
||||
"phpunit/php-code-coverage": "~2.1",
|
||||
"phpunit/php-file-iterator": "~1.4",
|
||||
"phpunit/php-text-template": "~1.2",
|
||||
"phpunit/php-timer": "^1.0.6",
|
||||
"phpunit/phpunit-mock-objects": "~2.3",
|
||||
"sebastian/comparator": "~1.2.2",
|
||||
"sebastian/diff": "~1.2",
|
||||
"sebastian/environment": "~1.3",
|
||||
"sebastian/exporter": "~1.2",
|
||||
"sebastian/global-state": "~1.0",
|
||||
"sebastian/version": "~1.0",
|
||||
"symfony/yaml": "~2.1|~3.0"
|
||||
},
|
||||
"suggest": {
|
||||
"phpunit/php-invoker": "~1.1"
|
||||
},
|
||||
"bin": [
|
||||
"phpunit"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.8.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "The PHP Unit Testing framework.",
|
||||
"homepage": "https://phpunit.de/",
|
||||
"keywords": [
|
||||
"phpunit",
|
||||
"testing",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2017-02-06T05:18:07+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpunit/phpunit-mock-objects",
|
||||
"version": "2.3.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
|
||||
"reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
|
||||
"reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"doctrine/instantiator": "^1.0.2",
|
||||
"php": ">=5.3.3",
|
||||
"phpunit/php-text-template": "~1.2",
|
||||
"sebastian/exporter": "~1.2"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.4"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-soap": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.3.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sb@sebastian-bergmann.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Mock Object library for PHPUnit",
|
||||
"homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
|
||||
"keywords": [
|
||||
"mock",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2015-10-02T06:51:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/comparator",
|
||||
"version": "1.2.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/comparator.git",
|
||||
"reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
|
||||
"reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3",
|
||||
"sebastian/diff": "~1.2",
|
||||
"sebastian/exporter": "~1.2 || ~2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.4"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.2.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jeff Welch",
|
||||
"email": "whatthejeff@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Volker Dusch",
|
||||
"email": "github@wallbash.com"
|
||||
},
|
||||
{
|
||||
"name": "Bernhard Schussek",
|
||||
"email": "bschussek@2bepublished.at"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Provides the functionality to compare PHP values for equality",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/comparator",
|
||||
"keywords": [
|
||||
"comparator",
|
||||
"compare",
|
||||
"equality"
|
||||
],
|
||||
"time": "2017-01-29T09:50:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/diff",
|
||||
"version": "1.4.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/diff.git",
|
||||
"reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
|
||||
"reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.8"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.4-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Kore Nordmann",
|
||||
"email": "mail@kore-nordmann.de"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Diff implementation",
|
||||
"homepage": "https://github.com/sebastianbergmann/diff",
|
||||
"keywords": [
|
||||
"diff"
|
||||
],
|
||||
"time": "2015-12-08T07:14:41+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/environment",
|
||||
"version": "1.3.8",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/environment.git",
|
||||
"reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
|
||||
"reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^5.3.3 || ^7.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4.8 || ^5.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.3.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Provides functionality to handle HHVM/PHP environments",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/environment",
|
||||
"keywords": [
|
||||
"Xdebug",
|
||||
"environment",
|
||||
"hhvm"
|
||||
],
|
||||
"time": "2016-08-18T05:49:44+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/exporter",
|
||||
"version": "1.2.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/exporter.git",
|
||||
"reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
|
||||
"reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3",
|
||||
"sebastian/recursion-context": "~1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-mbstring": "*",
|
||||
"phpunit/phpunit": "~4.4"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.3.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jeff Welch",
|
||||
"email": "whatthejeff@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Volker Dusch",
|
||||
"email": "github@wallbash.com"
|
||||
},
|
||||
{
|
||||
"name": "Bernhard Schussek",
|
||||
"email": "bschussek@2bepublished.at"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
},
|
||||
{
|
||||
"name": "Adam Harvey",
|
||||
"email": "aharvey@php.net"
|
||||
}
|
||||
],
|
||||
"description": "Provides the functionality to export PHP variables for visualization",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/exporter",
|
||||
"keywords": [
|
||||
"export",
|
||||
"exporter"
|
||||
],
|
||||
"time": "2016-06-17T09:04:28+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/global-state",
|
||||
"version": "1.1.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/global-state.git",
|
||||
"reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
|
||||
"reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.2"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-uopz": "*"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
}
|
||||
],
|
||||
"description": "Snapshotting of global state",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/global-state",
|
||||
"keywords": [
|
||||
"global state"
|
||||
],
|
||||
"time": "2015-10-12T03:26:01+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/recursion-context",
|
||||
"version": "1.0.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/recursion-context.git",
|
||||
"reference": "913401df809e99e4f47b27cdd781f4a258d58791"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
|
||||
"reference": "913401df809e99e4f47b27cdd781f4a258d58791",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.4"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jeff Welch",
|
||||
"email": "whatthejeff@gmail.com"
|
||||
},
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de"
|
||||
},
|
||||
{
|
||||
"name": "Adam Harvey",
|
||||
"email": "aharvey@php.net"
|
||||
}
|
||||
],
|
||||
"description": "Provides functionality to recursively process PHP variables",
|
||||
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
|
||||
"time": "2015-11-11T19:50:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/version",
|
||||
"version": "1.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/version.git",
|
||||
"reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
|
||||
"reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"src/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"BSD-3-Clause"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Sebastian Bergmann",
|
||||
"email": "sebastian@phpunit.de",
|
||||
"role": "lead"
|
||||
}
|
||||
],
|
||||
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
|
||||
"homepage": "https://github.com/sebastianbergmann/version",
|
||||
"time": "2015-06-21T13:59:46+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/yaml",
|
||||
"version": "v2.8.17",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/yaml.git",
|
||||
"reference": "322a8c2dfbca15ad6b1b27e182899f98ec0e0153"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/322a8c2dfbca15ad6b1b27e182899f98ec0e0153",
|
||||
"reference": "322a8c2dfbca15ad6b1b27e182899f98ec0e0153",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.9"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "2.8-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Symfony\\Component\\Yaml\\": ""
|
||||
},
|
||||
"exclude-from-classmap": [
|
||||
"/Tests/"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Fabien Potencier",
|
||||
"email": "fabien@symfony.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony Yaml Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-01-21T16:40:50+00:00"
|
||||
}
|
||||
],
|
||||
"aliases": [],
|
||||
"minimum-stability": "stable",
|
||||
"stability-flags": {
|
||||
"phpunit/phpunit": 0
|
||||
},
|
||||
"prefer-stable": false,
|
||||
"prefer-lowest": false,
|
||||
"platform": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"platform-dev": []
|
||||
}
|
||||
35
vendor/robthree/twofactorauth/demo/demo.php
vendored
35
vendor/robthree/twofactorauth/demo/demo.php
vendored
@@ -1,35 +0,0 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Demo</title>
|
||||
</head>
|
||||
<body>
|
||||
<ol>
|
||||
<?php
|
||||
require_once 'loader.php';
|
||||
Loader::register('../lib','RobThree\\Auth');
|
||||
|
||||
use \RobThree\Auth\TwoFactorAuth;
|
||||
|
||||
$tfa = new TwoFactorAuth('MyApp');
|
||||
|
||||
echo '<li>First create a secret and associate it with a user';
|
||||
$secret = $tfa->createSecret(160); // Though the default is an 80 bits secret (for backwards compatibility reasons) we recommend creating 160+ bits secrets (see RFC 4226 - Algorithm Requirements)
|
||||
echo '<li>Next create a QR code and let the user scan it:<br><img src="' . $tfa->getQRCodeImageAsDataUri('My label', $secret) . '"><br>...or display the secret to the user for manual entry: ' . chunk_split($secret, 4, ' ');
|
||||
$code = $tfa->getCode($secret);
|
||||
echo '<li>Next, have the user verify the code; at this time the code displayed by a 2FA-app would be: <span style="color:#00c">' . $code . '</span> (but that changes periodically)';
|
||||
echo '<li>When the code checks out, 2FA can be / is enabled; store (encrypted?) secret with user and have the user verify a code each time a new session is started.';
|
||||
echo '<li>When aforementioned code (' . $code . ') was entered, the result would be: ' . (($tfa->verifyCode($secret, $code) === true) ? '<span style="color:#0c0">OK</span>' : '<span style="color:#c00">FAIL</span>');
|
||||
?>
|
||||
</ol>
|
||||
<p>Note: Make sure your server-time is <a href="http://en.wikipedia.org/wiki/Network_Time_Protocol">NTP-synced</a>! Depending on the $discrepancy allowed your time cannot drift too much from the users' time!</p>
|
||||
<?php
|
||||
try {
|
||||
$tfa->ensureCorrectTime();
|
||||
echo 'Your hosts time seems to be correct / within margin';
|
||||
} catch (RobThree\Auth\TwoFactorAuthException $ex) {
|
||||
echo '<b>Warning:</b> Your hosts time seems to be off: ' . $ex->getMessage();
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
50
vendor/robthree/twofactorauth/demo/loader.php
vendored
50
vendor/robthree/twofactorauth/demo/loader.php
vendored
@@ -1,50 +0,0 @@
|
||||
<?php
|
||||
|
||||
//http://www.leaseweblabs.com/2014/04/psr-0-psr-4-autoloading-classes-php/
|
||||
class Loader
|
||||
{
|
||||
protected static $parentPath = null;
|
||||
protected static $paths = null;
|
||||
protected static $files = null;
|
||||
protected static $nsChar = '\\';
|
||||
protected static $initialized = false;
|
||||
|
||||
protected static function initialize()
|
||||
{
|
||||
if (static::$initialized) return;
|
||||
static::$initialized = true;
|
||||
static::$parentPath = __FILE__;
|
||||
for ($i=substr_count(get_class(), static::$nsChar);$i>=0;$i--) {
|
||||
static::$parentPath = dirname(static::$parentPath);
|
||||
}
|
||||
static::$paths = array();
|
||||
static::$files = array(__FILE__);
|
||||
}
|
||||
|
||||
public static function register($path,$namespace) {
|
||||
if (!static::$initialized) static::initialize();
|
||||
static::$paths[$namespace] = trim($path,DIRECTORY_SEPARATOR);
|
||||
}
|
||||
|
||||
public static function load($class) {
|
||||
if (class_exists($class,false)) return;
|
||||
if (!static::$initialized) static::initialize();
|
||||
|
||||
foreach (static::$paths as $namespace => $path) {
|
||||
if (!$namespace || $namespace.static::$nsChar === substr($class, 0, strlen($namespace.static::$nsChar))) {
|
||||
|
||||
$fileName = substr($class,strlen($namespace.static::$nsChar)-1);
|
||||
$fileName = str_replace(static::$nsChar, DIRECTORY_SEPARATOR, ltrim($fileName,static::$nsChar));
|
||||
$fileName = static::$parentPath.DIRECTORY_SEPARATOR.$path.DIRECTORY_SEPARATOR.$fileName.'.php';
|
||||
|
||||
if (file_exists($fileName)) {
|
||||
include $fileName;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
spl_autoload_register(array('Loader', 'load'));
|
||||
BIN
vendor/robthree/twofactorauth/logo.png
vendored
BIN
vendor/robthree/twofactorauth/logo.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 2.6 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB |
@@ -1,381 +0,0 @@
|
||||
<?php
|
||||
require_once 'lib/TwoFactorAuth.php';
|
||||
require_once 'lib/TwoFactorAuthException.php';
|
||||
|
||||
require_once 'lib/Providers/Qr/IQRCodeProvider.php';
|
||||
require_once 'lib/Providers/Qr/BaseHTTPQRCodeProvider.php';
|
||||
require_once 'lib/Providers/Qr/GoogleQRCodeProvider.php';
|
||||
require_once 'lib/Providers/Qr/QRException.php';
|
||||
|
||||
require_once 'lib/Providers/Rng/IRNGProvider.php';
|
||||
require_once 'lib/Providers/Rng/RNGException.php';
|
||||
require_once 'lib/Providers/Rng/CSRNGProvider.php';
|
||||
require_once 'lib/Providers/Rng/MCryptRNGProvider.php';
|
||||
require_once 'lib/Providers/Rng/OpenSSLRNGProvider.php';
|
||||
require_once 'lib/Providers/Rng/HashRNGProvider.php';
|
||||
require_once 'lib/Providers/Rng/RNGException.php';
|
||||
|
||||
require_once 'lib/Providers/Time/ITimeProvider.php';
|
||||
require_once 'lib/Providers/Time/LocalMachineTimeProvider.php';
|
||||
require_once 'lib/Providers/Time/HttpTimeProvider.php';
|
||||
require_once 'lib/Providers/Time/ConvertUnixTimeDotComTimeProvider.php';
|
||||
require_once 'lib/Providers/Time/TimeException.php';
|
||||
|
||||
use RobThree\Auth\TwoFactorAuth;
|
||||
use RobThree\Auth\Providers\Qr\IQRCodeProvider;
|
||||
use RobThree\Auth\Providers\Rng\IRNGProvider;
|
||||
use RobThree\Auth\Providers\Time\ITimeProvider;
|
||||
|
||||
|
||||
class TwoFactorAuthTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testConstructorThrowsOnInvalidDigits() {
|
||||
|
||||
new TwoFactorAuth('Test', 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testConstructorThrowsOnInvalidPeriod() {
|
||||
|
||||
new TwoFactorAuth('Test', 6, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testConstructorThrowsOnInvalidAlgorithm() {
|
||||
|
||||
new TwoFactorAuth('Test', 6, 30, 'xxx');
|
||||
}
|
||||
|
||||
public function testGetCodeReturnsCorrectResults() {
|
||||
|
||||
$tfa = new TwoFactorAuth('Test');
|
||||
$this->assertEquals('543160', $tfa->getCode('VMR466AB62ZBOKHE', 1426847216));
|
||||
$this->assertEquals('538532', $tfa->getCode('VMR466AB62ZBOKHE', 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testCreateSecretThrowsOnInsecureRNGProvider() {
|
||||
$rng = new TestRNGProvider();
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', null, $rng);
|
||||
$tfa->createSecret();
|
||||
}
|
||||
|
||||
public function testCreateSecretOverrideSecureDoesNotThrowOnInsecureRNG() {
|
||||
$rng = new TestRNGProvider();
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', null, $rng);
|
||||
$this->assertEquals('ABCDEFGHIJKLMNOP', $tfa->createSecret(80, false));
|
||||
}
|
||||
|
||||
public function testCreateSecretDoesNotThrowOnSecureRNGProvider() {
|
||||
$rng = new TestRNGProvider(true);
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', null, $rng);
|
||||
$this->assertEquals('ABCDEFGHIJKLMNOP', $tfa->createSecret());
|
||||
}
|
||||
|
||||
public function testCreateSecretGeneratesDesiredAmountOfEntropy() {
|
||||
$rng = new TestRNGProvider(true);
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', null, $rng);
|
||||
$this->assertEquals('A', $tfa->createSecret(5));
|
||||
$this->assertEquals('AB', $tfa->createSecret(6));
|
||||
$this->assertEquals('ABCDEFGHIJKLMNOPQRSTUVWXYZ', $tfa->createSecret(128));
|
||||
$this->assertEquals('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', $tfa->createSecret(160));
|
||||
$this->assertEquals('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', $tfa->createSecret(320));
|
||||
$this->assertEquals('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567ABCDEFGHIJKLMNOPQRSTUVWXYZ234567A', $tfa->createSecret(321));
|
||||
}
|
||||
|
||||
public function testEnsureCorrectTimeDoesNotThrowForCorrectTime() {
|
||||
$tpr1 = new TestTimeProvider(123);
|
||||
$tpr2 = new TestTimeProvider(128);
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', null, null, $tpr1);
|
||||
$tfa->ensureCorrectTime(array($tpr2)); // 128 - 123 = 5 => within default leniency
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testEnsureCorrectTimeThrowsOnIncorrectTime() {
|
||||
$tpr1 = new TestTimeProvider(123);
|
||||
$tpr2 = new TestTimeProvider(124);
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', null, null, $tpr1);
|
||||
$tfa->ensureCorrectTime(array($tpr2), 0); // We force a leniency of 0, 124-123 = 1 so this should throw
|
||||
}
|
||||
|
||||
|
||||
public function testEnsureDefaultTimeProviderReturnsCorrectTime() {
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1');
|
||||
$tfa->ensureCorrectTime(array(new TestTimeProvider(time())), 1); // Use a leniency of 1, should the time change between both time() calls
|
||||
}
|
||||
|
||||
public function testEnsureAllTimeProvidersReturnCorrectTime() {
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1');
|
||||
$tfa->ensureCorrectTime(array(
|
||||
new RobThree\Auth\Providers\Time\ConvertUnixTimeDotComTimeProvider(),
|
||||
new RobThree\Auth\Providers\Time\HttpTimeProvider(), // Uses google.com by default
|
||||
new RobThree\Auth\Providers\Time\HttpTimeProvider('https://github.com'),
|
||||
new RobThree\Auth\Providers\Time\HttpTimeProvider('https://yahoo.com'),
|
||||
));
|
||||
}
|
||||
|
||||
public function testVerifyCodeWorksCorrectly() {
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30);
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 1, 1426847190));
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 0, 1426847190 + 29)); //Test discrepancy
|
||||
$this->assertEquals(false, $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 0, 1426847190 + 30)); //Test discrepancy
|
||||
$this->assertEquals(false, $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 0, 1426847190 - 1)); //Test discrepancy
|
||||
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 1, 1426847205 + 0)); //Test discrepancy
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 1, 1426847205 + 35)); //Test discrepancy
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 1, 1426847205 - 35)); //Test discrepancy
|
||||
|
||||
$this->assertEquals(false, $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 1, 1426847205 + 65)); //Test discrepancy
|
||||
$this->assertEquals(false, $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 1, 1426847205 - 65)); //Test discrepancy
|
||||
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 2, 1426847205 + 65)); //Test discrepancy
|
||||
$this->assertEquals(true , $tfa->verifyCode('VMR466AB62ZBOKHE', '543160', 2, 1426847205 - 65)); //Test discrepancy
|
||||
}
|
||||
|
||||
public function testTotpUriIsCorrect() {
|
||||
$qr = new TestQrProvider();
|
||||
|
||||
$tfa = new TwoFactorAuth('Test&Issuer', 6, 30, 'sha1', $qr);
|
||||
$data = $this->DecodeDataUri($tfa->getQRCodeImageAsDataUri('Test&Label', 'VMR466AB62ZBOKHE'));
|
||||
$this->assertEquals('test/test', $data['mimetype']);
|
||||
$this->assertEquals('base64', $data['encoding']);
|
||||
$this->assertEquals('otpauth://totp/Test%26Label?secret=VMR466AB62ZBOKHE&issuer=Test%26Issuer&period=30&algorithm=SHA1&digits=6@200', $data['data']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testGetQRCodeImageAsDataUriThrowsOnInvalidSize() {
|
||||
$qr = new TestQrProvider();
|
||||
|
||||
$tfa = new TwoFactorAuth('Test', 6, 30, 'sha1', $qr);
|
||||
$tfa->getQRCodeImageAsDataUri('Test', 'VMR466AB62ZBOKHE', 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testGetCodeThrowsOnInvalidBase32String1() {
|
||||
$tfa = new TwoFactorAuth('Test');
|
||||
$tfa->getCode('FOO1BAR8BAZ9'); //1, 8 & 9 are invalid chars
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \RobThree\Auth\TwoFactorAuthException
|
||||
*/
|
||||
public function testGetCodeThrowsOnInvalidBase32String2() {
|
||||
$tfa = new TwoFactorAuth('Test');
|
||||
$tfa->getCode('mzxw6==='); //Lowercase
|
||||
}
|
||||
|
||||
public function testKnownBase32DecodeTestVectors() {
|
||||
// We usually don't test internals (e.g. privates) but since we rely heavily on base32 decoding and don't want
|
||||
// to expose this method nor do we want to give people the possibility of implementing / providing their own base32
|
||||
// decoding/decoder (as we do with Rng/QR providers for example) we simply test the private base32Decode() method
|
||||
// with some known testvectors **only** to ensure base32 decoding works correctly following RFC's so there won't
|
||||
// be any bugs hiding in there. We **could** 'fool' ourselves by calling the public getCode() method (which uses
|
||||
// base32decode internally) and then make sure getCode's output (in digits) equals expected output since that would
|
||||
// mean the base32Decode() works as expected but that **could** hide some subtle bug(s) in decoding the base32 string.
|
||||
|
||||
// "In general, you don't want to break any encapsulation for the sake of testing (or as Mom used to say, "don't
|
||||
// expose your privates!"). Most of the time, you should be able to test a class by exercising its public methods."
|
||||
// Dave Thomas and Andy Hunt -- "Pragmatic Unit Testing
|
||||
$tfa = new TwoFactorAuth('Test');
|
||||
|
||||
$method = new ReflectionMethod('RobThree\Auth\TwoFactorAuth', 'base32Decode');
|
||||
$method->setAccessible(true);
|
||||
|
||||
// Test vectors from: https://tools.ietf.org/html/rfc4648#page-12
|
||||
$this->assertEquals('', $method->invoke($tfa, ''));
|
||||
$this->assertEquals('f', $method->invoke($tfa, 'MY======'));
|
||||
$this->assertEquals('fo', $method->invoke($tfa, 'MZXQ===='));
|
||||
$this->assertEquals('foo', $method->invoke($tfa, 'MZXW6==='));
|
||||
$this->assertEquals('foob', $method->invoke($tfa, 'MZXW6YQ='));
|
||||
$this->assertEquals('fooba', $method->invoke($tfa, 'MZXW6YTB'));
|
||||
$this->assertEquals('foobar', $method->invoke($tfa, 'MZXW6YTBOI======'));
|
||||
}
|
||||
|
||||
public function testKnownBase32DecodeUnpaddedTestVectors() {
|
||||
// See testKnownBase32DecodeTestVectors() for the rationale behind testing the private base32Decode() method.
|
||||
// This test ensures that strings without the padding-char ('=') are also decoded correctly.
|
||||
// https://tools.ietf.org/html/rfc4648#page-4:
|
||||
// "In some circumstances, the use of padding ("=") in base-encoded data is not required or used."
|
||||
$tfa = new TwoFactorAuth('Test');
|
||||
|
||||
$method = new ReflectionMethod('RobThree\Auth\TwoFactorAuth', 'base32Decode');
|
||||
$method->setAccessible(true);
|
||||
|
||||
// Test vectors from: https://tools.ietf.org/html/rfc4648#page-12
|
||||
$this->assertEquals('', $method->invoke($tfa, ''));
|
||||
$this->assertEquals('f', $method->invoke($tfa, 'MY'));
|
||||
$this->assertEquals('fo', $method->invoke($tfa, 'MZXQ'));
|
||||
$this->assertEquals('foo', $method->invoke($tfa, 'MZXW6'));
|
||||
$this->assertEquals('foob', $method->invoke($tfa, 'MZXW6YQ'));
|
||||
$this->assertEquals('fooba', $method->invoke($tfa, 'MZXW6YTB'));
|
||||
$this->assertEquals('foobar', $method->invoke($tfa, 'MZXW6YTBOI'));
|
||||
}
|
||||
|
||||
|
||||
public function testKnownTestVectors_sha1() {
|
||||
//Known test vectors for SHA1: https://tools.ietf.org/html/rfc6238#page-15
|
||||
$secret = 'GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ'; //== base32encode('12345678901234567890')
|
||||
$tfa = new TwoFactorAuth('Test', 8, 30, 'sha1');
|
||||
$this->assertEquals('94287082', $tfa->getCode($secret, 59));
|
||||
$this->assertEquals('07081804', $tfa->getCode($secret, 1111111109));
|
||||
$this->assertEquals('14050471', $tfa->getCode($secret, 1111111111));
|
||||
$this->assertEquals('89005924', $tfa->getCode($secret, 1234567890));
|
||||
$this->assertEquals('69279037', $tfa->getCode($secret, 2000000000));
|
||||
$this->assertEquals('65353130', $tfa->getCode($secret, 20000000000));
|
||||
}
|
||||
|
||||
public function testKnownTestVectors_sha256() {
|
||||
//Known test vectors for SHA256: https://tools.ietf.org/html/rfc6238#page-15
|
||||
$secret = 'GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZA'; //== base32encode('12345678901234567890123456789012')
|
||||
$tfa = new TwoFactorAuth('Test', 8, 30, 'sha256');
|
||||
$this->assertEquals('46119246', $tfa->getCode($secret, 59));
|
||||
$this->assertEquals('68084774', $tfa->getCode($secret, 1111111109));
|
||||
$this->assertEquals('67062674', $tfa->getCode($secret, 1111111111));
|
||||
$this->assertEquals('91819424', $tfa->getCode($secret, 1234567890));
|
||||
$this->assertEquals('90698825', $tfa->getCode($secret, 2000000000));
|
||||
$this->assertEquals('77737706', $tfa->getCode($secret, 20000000000));
|
||||
}
|
||||
|
||||
public function testKnownTestVectors_sha512() {
|
||||
//Known test vectors for SHA512: https://tools.ietf.org/html/rfc6238#page-15
|
||||
$secret = 'GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNA'; //== base32encode('1234567890123456789012345678901234567890123456789012345678901234')
|
||||
$tfa = new TwoFactorAuth('Test', 8, 30, 'sha512');
|
||||
$this->assertEquals('90693936', $tfa->getCode($secret, 59));
|
||||
$this->assertEquals('25091201', $tfa->getCode($secret, 1111111109));
|
||||
$this->assertEquals('99943326', $tfa->getCode($secret, 1111111111));
|
||||
$this->assertEquals('93441116', $tfa->getCode($secret, 1234567890));
|
||||
$this->assertEquals('38618901', $tfa->getCode($secret, 2000000000));
|
||||
$this->assertEquals('47863826', $tfa->getCode($secret, 20000000000));
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires function random_bytes
|
||||
*/
|
||||
public function testCSRNGProvidersReturnExpectedNumberOfBytes() {
|
||||
$rng = new \RobThree\Auth\Providers\Rng\CSRNGProvider();
|
||||
foreach ($this->getRngTestLengths() as $l)
|
||||
$this->assertEquals($l, strlen($rng->getRandomBytes($l)));
|
||||
$this->assertEquals(true, $rng->isCryptographicallySecure());
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires function hash_algos
|
||||
* @requires function hash
|
||||
*/
|
||||
public function testHashRNGProvidersReturnExpectedNumberOfBytes() {
|
||||
$rng = new \RobThree\Auth\Providers\Rng\HashRNGProvider();
|
||||
foreach ($this->getRngTestLengths() as $l)
|
||||
$this->assertEquals($l, strlen($rng->getRandomBytes($l)));
|
||||
$this->assertEquals(false, $rng->isCryptographicallySecure());
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires function mcrypt_create_iv
|
||||
*/
|
||||
public function testMCryptRNGProvidersReturnExpectedNumberOfBytes() {
|
||||
$rng = new \RobThree\Auth\Providers\Rng\MCryptRNGProvider();
|
||||
foreach ($this->getRngTestLengths() as $l)
|
||||
$this->assertEquals($l, strlen($rng->getRandomBytes($l)));
|
||||
$this->assertEquals(true, $rng->isCryptographicallySecure());
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires function openssl_random_pseudo_bytes
|
||||
*/
|
||||
public function testStrongOpenSSLRNGProvidersReturnExpectedNumberOfBytes() {
|
||||
$rng = new \RobThree\Auth\Providers\Rng\OpenSSLRNGProvider(true);
|
||||
foreach ($this->getRngTestLengths() as $l)
|
||||
$this->assertEquals($l, strlen($rng->getRandomBytes($l)));
|
||||
$this->assertEquals(true, $rng->isCryptographicallySecure());
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires function openssl_random_pseudo_bytes
|
||||
*/
|
||||
public function testNonStrongOpenSSLRNGProvidersReturnExpectedNumberOfBytes() {
|
||||
$rng = new \RobThree\Auth\Providers\Rng\OpenSSLRNGProvider(false);
|
||||
foreach ($this->getRngTestLengths() as $l)
|
||||
$this->assertEquals($l, strlen($rng->getRandomBytes($l)));
|
||||
$this->assertEquals(false, $rng->isCryptographicallySecure());
|
||||
}
|
||||
|
||||
|
||||
private function getRngTestLengths() {
|
||||
return array(1, 16, 32, 256);
|
||||
}
|
||||
|
||||
private function DecodeDataUri($datauri) {
|
||||
if (preg_match('/data:(?P<mimetype>[\w\.\-\/]+);(?P<encoding>\w+),(?P<data>.*)/', $datauri, $m) === 1) {
|
||||
return array(
|
||||
'mimetype' => $m['mimetype'],
|
||||
'encoding' => $m['encoding'],
|
||||
'data' => base64_decode($m['data'])
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class TestRNGProvider implements IRNGProvider {
|
||||
private $isSecure;
|
||||
|
||||
function __construct($isSecure = false) {
|
||||
$this->isSecure = $isSecure;
|
||||
}
|
||||
|
||||
public function getRandomBytes($bytecount) {
|
||||
$result = '';
|
||||
for ($i=0; $i<$bytecount; $i++)
|
||||
$result.=chr($i);
|
||||
return $result;
|
||||
|
||||
}
|
||||
|
||||
public function isCryptographicallySecure() {
|
||||
return $this->isSecure;
|
||||
}
|
||||
}
|
||||
|
||||
class TestQrProvider implements IQRCodeProvider {
|
||||
public function getQRCodeImage($qrtext, $size) {
|
||||
return $qrtext . '@' . $size;
|
||||
}
|
||||
|
||||
public function getMimeType() {
|
||||
return 'test/test';
|
||||
}
|
||||
}
|
||||
|
||||
class TestTimeProvider implements ITimeProvider {
|
||||
private $time;
|
||||
|
||||
function __construct($time) {
|
||||
$this->time = $time;
|
||||
}
|
||||
|
||||
public function getTime() {
|
||||
return $this->time;
|
||||
}
|
||||
}
|
||||
5
vendor/zendframework/zendxml/.gitignore
vendored
5
vendor/zendframework/zendxml/.gitignore
vendored
@@ -1,5 +0,0 @@
|
||||
composer.lock
|
||||
vendor
|
||||
.buildpath
|
||||
.project
|
||||
.settings
|
||||
43
vendor/zendframework/zendxml/.travis.yml
vendored
43
vendor/zendframework/zendxml/.travis.yml
vendored
@@ -1,43 +0,0 @@
|
||||
sudo: false
|
||||
|
||||
language: php
|
||||
|
||||
branches:
|
||||
except:
|
||||
- /^release-.*$/
|
||||
- /^ghgfk-.*$/
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.composer/cache
|
||||
|
||||
matrix:
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
matrix:
|
||||
fast_finish: true
|
||||
include:
|
||||
- php: 5.3
|
||||
- php: 5.4
|
||||
- php: 5.5
|
||||
env:
|
||||
- EXECUTE_CS_CHECK=true
|
||||
- php: 5.6
|
||||
- php: 7
|
||||
- php: hhvm
|
||||
allow_failures:
|
||||
- php: hhvm
|
||||
|
||||
before_install:
|
||||
- composer self-update
|
||||
|
||||
install:
|
||||
- travis_retry composer install --no-interaction --ignore-platform-reqs
|
||||
|
||||
script:
|
||||
- ./vendor/bin/phpunit -c ./tests
|
||||
- if [[ $EXECUTE_CS_CHECK == 'true' ]]; then ./vendor/bin/phpcs --standard=PSR2 --ignore=tests/Bootstrap.php library tests ; fi
|
||||
|
||||
notifications:
|
||||
irc: "irc.freenode.org#zftalk.dev"
|
||||
email: false
|
||||
40
vendor/zendframework/zendxml/composer.json
vendored
40
vendor/zendframework/zendxml/composer.json
vendored
@@ -1,40 +0,0 @@
|
||||
{
|
||||
"name": "zendframework/zendxml",
|
||||
"description": "Utility library for XML usage, best practices, and security in PHP",
|
||||
"type": "library",
|
||||
"license": "BSD-3-Clause",
|
||||
"keywords": [
|
||||
"zf2",
|
||||
"xml",
|
||||
"security"
|
||||
],
|
||||
"homepage": "http://packages.zendframework.com/",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"ZendXml\\": "library/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"ZendTest\\Xml\\": "tests/ZendXmlTest/"
|
||||
}
|
||||
},
|
||||
"repositories": [
|
||||
{
|
||||
"type": "composer",
|
||||
"url": "http://packages.zendframework.com/"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "^5.3.3 || ^7.0"
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0-dev"
|
||||
}
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^3.7 || ^4.0",
|
||||
"squizlabs/php_codesniffer": "^1.5"
|
||||
}
|
||||
}
|
||||
92
vendor/zendframework/zendxml/tests/Bootstrap.php
vendored
92
vendor/zendframework/zendxml/tests/Bootstrap.php
vendored
@@ -1,92 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework (http://framework.zend.com/)
|
||||
*
|
||||
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
||||
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
* @package Zend
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set error reporting to the level to which Zend Framework code must comply.
|
||||
*/
|
||||
error_reporting( E_ALL | E_STRICT );
|
||||
|
||||
if (class_exists('PHPUnit_Runner_Version', true)) {
|
||||
$phpUnitVersion = PHPUnit_Runner_Version::id();
|
||||
if ('@package_version@' !== $phpUnitVersion && version_compare($phpUnitVersion, '3.7.0', '<')) {
|
||||
echo 'This version of PHPUnit (' .
|
||||
PHPUnit_Runner_Version::id() .
|
||||
') is not supported for ZendXml unit tests - use v 3.7.0 or higher.'
|
||||
. PHP_EOL
|
||||
;
|
||||
exit(1);
|
||||
}
|
||||
unset($phpUnitVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup autoloading
|
||||
*/
|
||||
// Try to use Composer autoloader
|
||||
if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
|
||||
include_once __DIR__ . '/../vendor/autoload.php';
|
||||
}
|
||||
// ... or use a simple SPL autoloader
|
||||
else{
|
||||
|
||||
// update include path
|
||||
set_include_path(implode(PATH_SEPARATOR, array(
|
||||
__DIR__.'/../src',
|
||||
__DIR__,
|
||||
get_include_path()
|
||||
)));
|
||||
|
||||
/**
|
||||
* @link https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#example-implementation
|
||||
*/
|
||||
spl_autoload_register(function ($className) {
|
||||
$className = ltrim($className, '\\');
|
||||
$fileName = '';
|
||||
$namespace = '';
|
||||
if ($lastNsPos = strrpos($className, '\\')) {
|
||||
$namespace = substr($className, 0, $lastNsPos);
|
||||
$className = substr($className, $lastNsPos + 1);
|
||||
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
|
||||
}
|
||||
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
|
||||
require $fileName;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Code coverage option
|
||||
*/
|
||||
if (defined('TESTS_GENERATE_REPORT') && TESTS_GENERATE_REPORT === true) {
|
||||
$codeCoverageFilter = new PHP_CodeCoverage_Filter();
|
||||
|
||||
$lastArg = end($_SERVER['argv']);
|
||||
if (is_dir($zfCoreTests . '/' . $lastArg)) {
|
||||
$codeCoverageFilter->addDirectoryToWhitelist($zfCoreLibrary . '/' . $lastArg);
|
||||
} elseif (is_file($zfCoreTests . '/' . $lastArg)) {
|
||||
$codeCoverageFilter->addDirectoryToWhitelist(dirname($zfCoreLibrary . '/' . $lastArg));
|
||||
} else {
|
||||
$codeCoverageFilter->addDirectoryToWhitelist($zfCoreLibrary);
|
||||
}
|
||||
|
||||
/*
|
||||
* Omit from code coverage reports the contents of the tests directory
|
||||
*/
|
||||
$codeCoverageFilter->addDirectoryToBlacklist($zfCoreTests, '');
|
||||
$codeCoverageFilter->addDirectoryToBlacklist(PEAR_INSTALL_DIR, '');
|
||||
$codeCoverageFilter->addDirectoryToBlacklist(PHP_LIBDIR, '');
|
||||
|
||||
unset($codeCoverageFilter);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset global variables that are no longer needed.
|
||||
*/
|
||||
unset($phpUnitVersion);
|
||||
@@ -1,125 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework (http://framework.zend.com/)
|
||||
*
|
||||
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
||||
* @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
namespace ZendTest\Xml;
|
||||
|
||||
use ZendXml\Security as XmlSecurity;
|
||||
use ZendXml\Exception;
|
||||
use DOMDocument;
|
||||
use ReflectionMethod;
|
||||
use SimpleXMLElement;
|
||||
|
||||
/**
|
||||
* @group ZF2015-06
|
||||
*/
|
||||
class MultibyteTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function multibyteEncodings()
|
||||
{
|
||||
return array(
|
||||
'UTF-16LE' => array('UTF-16LE', pack('CC', 0xff, 0xfe), 3),
|
||||
'UTF-16BE' => array('UTF-16BE', pack('CC', 0xfe, 0xff), 3),
|
||||
'UTF-32LE' => array('UTF-32LE', pack('CCCC', 0xff, 0xfe, 0x00, 0x00), 4),
|
||||
'UTF-32BE' => array('UTF-32BE', pack('CCCC', 0x00, 0x00, 0xfe, 0xff), 4),
|
||||
);
|
||||
}
|
||||
|
||||
public function getXmlWithXXE()
|
||||
{
|
||||
return <<<XML
|
||||
<?xml version="1.0" encoding="{ENCODING}"?>
|
||||
<!DOCTYPE methodCall [
|
||||
<!ENTITY pocdata SYSTEM "file:///etc/passwd">
|
||||
]>
|
||||
<methodCall>
|
||||
<methodName>retrieved: &pocdata;</methodName>
|
||||
</methodCall>
|
||||
XML;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke ZendXml\Security::heuristicScan with the provided XML.
|
||||
*
|
||||
* @param string $xml
|
||||
* @return void
|
||||
* @throws Exception\RuntimeException
|
||||
*/
|
||||
public function invokeHeuristicScan($xml)
|
||||
{
|
||||
$r = new ReflectionMethod('ZendXml\Security', 'heuristicScan');
|
||||
$r->setAccessible(true);
|
||||
return $r->invoke(null, $xml);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider multibyteEncodings
|
||||
* @group heuristicDetection
|
||||
*/
|
||||
public function testDetectsMultibyteXXEVectorsUnderFPMWithEncodedStringMissingBOM($encoding, $bom, $bomLength)
|
||||
{
|
||||
$xml = $this->getXmlWithXXE();
|
||||
$xml = str_replace('{ENCODING}', $encoding, $xml);
|
||||
$xml = iconv('UTF-8', $encoding, $xml);
|
||||
$this->assertNotSame(0, strncmp($xml, $bom, $bomLength));
|
||||
$this->setExpectedException('ZendXml\Exception\RuntimeException', 'ENTITY');
|
||||
$this->invokeHeuristicScan($xml);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider multibyteEncodings
|
||||
*/
|
||||
public function testDetectsMultibyteXXEVectorsUnderFPMWithEncodedStringUsingBOM($encoding, $bom)
|
||||
{
|
||||
$xml = $this->getXmlWithXXE();
|
||||
$xml = str_replace('{ENCODING}', $encoding, $xml);
|
||||
$orig = iconv('UTF-8', $encoding, $xml);
|
||||
$xml = $bom . $orig;
|
||||
$this->setExpectedException('ZendXml\Exception\RuntimeException', 'ENTITY');
|
||||
$this->invokeHeuristicScan($xml);
|
||||
}
|
||||
|
||||
public function getXmlWithoutXXE()
|
||||
{
|
||||
return <<<XML
|
||||
<?xml version="1.0" encoding="{ENCODING}"?>
|
||||
<methodCall>
|
||||
<methodName>retrieved: &pocdata;</methodName>
|
||||
</methodCall>
|
||||
XML;
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider multibyteEncodings
|
||||
*/
|
||||
public function testDoesNotFlagValidMultibyteXmlAsInvalidUnderFPM($encoding)
|
||||
{
|
||||
$xml = $this->getXmlWithoutXXE();
|
||||
$xml = str_replace('{ENCODING}', $encoding, $xml);
|
||||
$xml = iconv('UTF-8', $encoding, $xml);
|
||||
try {
|
||||
$result = $this->invokeHeuristicScan($xml);
|
||||
$this->assertNull($result);
|
||||
} catch (\Exception $e) {
|
||||
$this->fail('Security scan raised exception when it should not have');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider multibyteEncodings
|
||||
* @group mixedEncoding
|
||||
*/
|
||||
public function testDetectsXXEWhenXMLDocumentEncodingDiffersFromFileEncoding($encoding, $bom)
|
||||
{
|
||||
$xml = $this->getXmlWithXXE();
|
||||
$xml = str_replace('{ENCODING}', 'UTF-8', $xml);
|
||||
$xml = iconv('UTF-8', $encoding, $xml);
|
||||
$xml = $bom . $xml;
|
||||
$this->setExpectedException('ZendXml\Exception\RuntimeException', 'ENTITY');
|
||||
$this->invokeHeuristicScan($xml);
|
||||
}
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Zend Framework (http://framework.zend.com/)
|
||||
*
|
||||
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
||||
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
|
||||
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||||
*/
|
||||
namespace ZendTest\Xml;
|
||||
|
||||
use ZendXml\Security as XmlSecurity;
|
||||
use ZendXml\Exception;
|
||||
use DOMDocument;
|
||||
use SimpleXMLElement;
|
||||
|
||||
class SecurityTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
/**
|
||||
* @expectedException ZendXml\Exception\RuntimeException
|
||||
*/
|
||||
public function testScanForXEE()
|
||||
{
|
||||
$xml = <<<XML
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE results [<!ENTITY harmless "completely harmless">]>
|
||||
<results>
|
||||
<result>This result is &harmless;</result>
|
||||
</results>
|
||||
XML;
|
||||
|
||||
$this->setExpectedException('ZendXml\Exception\RuntimeException');
|
||||
$result = XmlSecurity::scan($xml);
|
||||
}
|
||||
|
||||
public function testScanForXXE()
|
||||
{
|
||||
$file = tempnam(sys_get_temp_dir(), 'ZendXml_Security');
|
||||
file_put_contents($file, 'This is a remote content!');
|
||||
$xml = <<<XML
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE root
|
||||
[
|
||||
<!ENTITY foo SYSTEM "file://$file">
|
||||
]>
|
||||
<results>
|
||||
<result>&foo;</result>
|
||||
</results>
|
||||
XML;
|
||||
|
||||
try {
|
||||
$result = XmlSecurity::scan($xml);
|
||||
} catch (Exception\RuntimeException $e) {
|
||||
unlink($file);
|
||||
return;
|
||||
}
|
||||
$this->fail('An expected exception has not been raised.');
|
||||
}
|
||||
|
||||
public function testScanSimpleXmlResult()
|
||||
{
|
||||
$result = XmlSecurity::scan($this->getXml());
|
||||
$this->assertTrue($result instanceof SimpleXMLElement);
|
||||
$this->assertEquals($result->result, 'test');
|
||||
}
|
||||
|
||||
public function testScanDom()
|
||||
{
|
||||
$dom = new DOMDocument('1.0');
|
||||
$result = XmlSecurity::scan($this->getXml(), $dom);
|
||||
$this->assertTrue($result instanceof DOMDocument);
|
||||
$node = $result->getElementsByTagName('result')->item(0);
|
||||
$this->assertEquals($node->nodeValue, 'test');
|
||||
}
|
||||
|
||||
public function testScanInvalidXml()
|
||||
{
|
||||
$xml = <<<XML
|
||||
<foo>test</bar>
|
||||
XML;
|
||||
|
||||
$result = XmlSecurity::scan($xml);
|
||||
$this->assertFalse($result);
|
||||
}
|
||||
|
||||
public function testScanInvalidXmlDom()
|
||||
{
|
||||
$xml = <<<XML
|
||||
<foo>test</bar>
|
||||
XML;
|
||||
|
||||
$dom = new DOMDocument('1.0');
|
||||
$result = XmlSecurity::scan($xml, $dom);
|
||||
$this->assertFalse($result);
|
||||
}
|
||||
|
||||
public function testScanFile()
|
||||
{
|
||||
$file = tempnam(sys_get_temp_dir(), 'ZendXml_Security');
|
||||
file_put_contents($file, $this->getXml());
|
||||
|
||||
$result = XmlSecurity::scanFile($file);
|
||||
$this->assertTrue($result instanceof SimpleXMLElement);
|
||||
$this->assertEquals($result->result, 'test');
|
||||
unlink($file);
|
||||
}
|
||||
|
||||
public function testScanXmlWithDTD()
|
||||
{
|
||||
$xml = <<<XML
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE results [
|
||||
<!ELEMENT results (result+)>
|
||||
<!ELEMENT result (#PCDATA)>
|
||||
]>
|
||||
<results>
|
||||
<result>test</result>
|
||||
</results>
|
||||
XML;
|
||||
|
||||
$dom = new DOMDocument('1.0');
|
||||
$result = XmlSecurity::scan($xml, $dom);
|
||||
$this->assertTrue($result instanceof DOMDocument);
|
||||
$this->assertTrue($result->validate());
|
||||
}
|
||||
|
||||
protected function getXml()
|
||||
{
|
||||
return <<<XML
|
||||
<?xml version="1.0"?>
|
||||
<results>
|
||||
<result>test</result>
|
||||
</results>
|
||||
XML;
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
<phpunit bootstrap="./Bootstrap.php" colors="true">
|
||||
<testsuites>
|
||||
<testsuite name="ZendXml Test Suite">
|
||||
<directory>./ZendXmlTest</directory>
|
||||
<exclude>./ZendXmlTest/TestAsset</exclude>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
|
||||
<groups>
|
||||
<exclude>
|
||||
</exclude>
|
||||
</groups>
|
||||
|
||||
<listeners>
|
||||
</listeners>
|
||||
|
||||
<filter>
|
||||
<blacklist>
|
||||
<directory suffix=".php">./ZendXmlTest</directory>
|
||||
<directory>../vendor</directory>
|
||||
</blacklist>
|
||||
</filter>
|
||||
|
||||
<php>
|
||||
</php>
|
||||
|
||||
</phpunit>
|
||||
Reference in New Issue
Block a user