QrCodeTest.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * (c) Jeroen van den Enden <info@endroid.nl>
  5. *
  6. * This source file is subject to the MIT license that is bundled
  7. * with this source code in the file LICENSE.
  8. */
  9. namespace Endroid\QrCode\Tests;
  10. use Endroid\QrCode\Exception\GenerateImageException;
  11. use Endroid\QrCode\Factory\QrCodeFactory;
  12. use Endroid\QrCode\QrCode;
  13. use PHPUnit\Framework\TestCase;
  14. use Zxing\QrReader;
  15. class QrCodeTest extends TestCase
  16. {
  17. public function testReadable(): void
  18. {
  19. $messages = [
  20. 'Tiny',
  21. 'This one has spaces',
  22. 'd2llMS9uU01BVmlvalM2YU9BUFBPTTdQMmJabHpqdndt',
  23. 'http://this.is.an/url?with=query&string=attached',
  24. '11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111',
  25. '{"i":"serialized.data","v":1,"t":1,"d":"4AEPc9XuIQ0OjsZoSRWp9DRWlN6UyDvuMlyOYy8XjOw="}',
  26. 'Spëci&al ch@ract3rs',
  27. '有限公司',
  28. ];
  29. $qrCode = new QrCode();
  30. $qrCode->setSize(300);
  31. foreach ($messages as $message) {
  32. $qrCode->setText($message);
  33. $pngData = $qrCode->writeString();
  34. $this->assertTrue(is_string($pngData));
  35. $reader = new QrReader($pngData, QrReader::SOURCE_TYPE_BLOB);
  36. $this->assertEquals($message, $reader->text());
  37. }
  38. }
  39. public function testFactory(): void
  40. {
  41. $qrCodeFactory = new QrCodeFactory();
  42. $qrCode = $qrCodeFactory->create('QR Code', [
  43. 'writer' => 'png',
  44. 'size' => 300,
  45. 'margin' => 10,
  46. ]);
  47. $pngData = $qrCode->writeString();
  48. $this->assertTrue(is_string($pngData));
  49. $reader = new QrReader($pngData, QrReader::SOURCE_TYPE_BLOB);
  50. $this->assertEquals('QR Code', $reader->text());
  51. }
  52. /**
  53. * @dataProvider writerNamesProvider
  54. */
  55. public function testWriteQrCodeByWriterName($writerName, $fileContent): void
  56. {
  57. $qrCode = new QrCode('QR Code');
  58. $qrCode->setLogoPath(__DIR__.'/../assets/images/symfony.png');
  59. $qrCode->setLogoWidth(100);
  60. $qrCode->setWriterByName($writerName);
  61. $data = $qrCode->writeString();
  62. $this->assertTrue(is_string($data));
  63. if (null !== $fileContent) {
  64. $uriData = $qrCode->writeDataUri();
  65. $this->assertTrue(0 === strpos($uriData, $fileContent));
  66. }
  67. }
  68. public function writerNamesProvider()
  69. {
  70. return [
  71. ['binary', null],
  72. ['debug', null],
  73. ['eps', null],
  74. ['png', 'data:image/png;base64'],
  75. ['svg', 'data:image/svg+xml;base64'],
  76. ];
  77. }
  78. /**
  79. * @dataProvider extensionsProvider
  80. */
  81. public function testWriteQrCodeByWriterExtension($extension, $fileContent): void
  82. {
  83. $qrCode = new QrCode('QR Code');
  84. $qrCode->setLogoPath(__DIR__.'/../assets/images/symfony.png');
  85. $qrCode->setLogoWidth(100);
  86. $qrCode->setWriterByExtension($extension);
  87. $data = $qrCode->writeString();
  88. $this->assertTrue(is_string($data));
  89. if (null !== $fileContent) {
  90. $uriData = $qrCode->writeDataUri();
  91. $this->assertTrue(0 === strpos($uriData, $fileContent));
  92. }
  93. }
  94. public function extensionsProvider()
  95. {
  96. return [
  97. ['bin', null],
  98. ['txt', null],
  99. ['eps', null],
  100. ['png', 'data:image/png;base64'],
  101. ['svg', 'data:image/svg+xml;base64'],
  102. ];
  103. }
  104. public function testSetSize(): void
  105. {
  106. $size = 400;
  107. $margin = 10;
  108. $qrCode = new QrCode('QR Code');
  109. $qrCode->setSize($size);
  110. $qrCode->setMargin($margin);
  111. $pngData = $qrCode->writeString();
  112. $image = imagecreatefromstring($pngData);
  113. $this->assertTrue(imagesx($image) === $size + 2 * $margin);
  114. $this->assertTrue(imagesy($image) === $size + 2 * $margin);
  115. }
  116. public function testSetLabel(): void
  117. {
  118. $qrCode = new QrCode('QR Code');
  119. $qrCode->setSize(300);
  120. $qrCode->setLabel('Scan the code', 15);
  121. $pngData = $qrCode->writeString();
  122. $this->assertTrue(is_string($pngData));
  123. $reader = new QrReader($pngData, QrReader::SOURCE_TYPE_BLOB);
  124. $this->assertEquals('QR Code', $reader->text());
  125. }
  126. public function testSetLogo(): void
  127. {
  128. $qrCode = new QrCode('QR Code');
  129. $qrCode->setSize(500);
  130. $qrCode->setLogoPath(__DIR__.'/../assets/images/symfony.png');
  131. $qrCode->setLogoWidth(100);
  132. $qrCode->setValidateResult(true);
  133. $pngData = $qrCode->writeString();
  134. $this->assertTrue(is_string($pngData));
  135. }
  136. public function testWriteFile(): void
  137. {
  138. $filename = __DIR__.'/output/qr-code.png';
  139. $qrCode = new QrCode('QR Code');
  140. $qrCode->writeFile($filename);
  141. $image = imagecreatefromstring(file_get_contents($filename));
  142. $this->assertTrue(is_resource($image));
  143. }
  144. public function testData(): void
  145. {
  146. $qrCode = new QrCode('QR Code');
  147. $data = $qrCode->getData();
  148. $this->assertArrayHasKey('block_count', $data);
  149. $this->assertArrayHasKey('block_size', $data);
  150. $this->assertArrayHasKey('inner_width', $data);
  151. $this->assertArrayHasKey('inner_height', $data);
  152. $this->assertArrayHasKey('outer_width', $data);
  153. $this->assertArrayHasKey('outer_height', $data);
  154. $this->assertArrayHasKey('margin_left', $data);
  155. $this->assertArrayHasKey('margin_right', $data);
  156. }
  157. public function testNonImageData(): void
  158. {
  159. $qrCode = new QrCode('QR Code');
  160. $qrCode->setLogoPath(__DIR__.'/QrCodeTest.php');
  161. $qrCode->setLogoSize(200, 200);
  162. $qrCode->setWriterByExtension('svg');
  163. $this->expectException(GenerateImageException::class);
  164. $qrCode->writeString();
  165. }
  166. }