QrCodeTest.php 5.5 KB

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