PHP Classes

File: tests/Unit/Core/QRCodeGeneratorTest.php

Recommend this page to a friend!
  Packages of Amirreza Ebrahimi   HeroQR Powerful PHP QR Code Library to generate PNG, SVG, PDF, Logos Ready to Use with Laravel   tests/Unit/Core/QRCodeGeneratorTest.php   Download  
File: tests/Unit/Core/QRCodeGeneratorTest.php
Role: Class source
Content type: text/plain
Description: Class source
Class: HeroQR Powerful PHP QR Code Library to generate PNG, SVG, PDF, Logos Ready to Use with Laravel
Generate QR code images in several formats
Author: By
Last change: Update of tests/Unit/Core/QRCodeGeneratorTest.php
Date: 6 months ago
Size: 8,993 bytes
 

Contents

Class file image Download
<?php

namespace HeroQR\Tests\Unit\Core;

use
Endroid\QrCode\Matrix\Matrix;
use
HeroQR\{Core\QRCodeGenerator, DataTypes\DataType};
use
PHPUnit\Framework\{Attributes\DataProvider, Attributes\Test, TestCase};
use
http\Exception\InvalidArgumentException;

/**
 * Class QRCodeGeneratorTest
 * Tests the functionality of the QRCodeGenerator class
 */
class QRCodeGeneratorTest extends TestCase
{
    private
QRCodeGenerator $qrCodeGenerator;

   
/**
     * Set up the QRCodeGenerator instance before each test
     */
   
protected function setUp(): void
   
{
       
$this->qrCodeGenerator = new QRCodeGenerator();
    }

   
/**
     * Test setting valid data for QR code generation
     */
    #[Test]
   
public function isSetDataValid(): void
   
{
       
$this->qrCodeGenerator->setData('https://example.com', DataType::Url);
       
$this->assertEquals('https://example.com', $this->qrCodeGenerator->getData());
    }

   
/**
     * Test setting invalid data for QR code generation
     */
    #[Test]
   
public function isSetDataInvalid(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->setData('invalid-url', DataType::Url);
    }

   
/**
     * Test setting a valid size for the QR code
     */
    #[Test]
   
public function isSetSizeValid(): void
   
{
       
$this->qrCodeGenerator->setSize(300);
       
$this->assertEquals(300, $this->qrCodeGenerator->getSize());
    }

   
/**
     * Test setting an invalid size for the QR code
     */
    #[Test]
   
public function isSetSizeInvalid(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->setSize(-50);
    }

   
/**
     * Test setting a valid margin for the QR code
     */
    #[Test]
   
public function isSetMarginValid(): void
   
{
       
$this->qrCodeGenerator->setMargin(20);
       
$this->assertEquals(20, $this->qrCodeGenerator->getMargin());
    }

   
/**
     * Test setting an invalid margin for the QR code
     */
    #[Test]
   
public function isSetMarginInvalid(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->setMargin(-10);
    }

   
/**
     * Test setting a valid color for the QR code
     */
    #[Test]
   
public function isSetColorValid(): void
   
{
       
$this->qrCodeGenerator->setColor('#FF5733');
       
$color = $this->qrCodeGenerator->getColor();
       
$this->assertEquals([255, 87, 51, 0], [$color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha()]);
    }

   
/**
     * Test setting an invalid color for the QR code
     */
    #[Test]
   
public function isSetColorInvalid(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->setColor('invalid-color');
    }

   
/**
     * Test setting a valid background color for the QR code
     */
    #[Test]
   
public function isSetBackgroundColorValid(): void
   
{
       
$this->qrCodeGenerator->setBackgroundColor('#FFFFFF');
       
$color = $this->qrCodeGenerator->getBackgroundColor();
       
$this->assertEquals([255, 255, 255, 0], [$color->getRed(), $color->getGreen(), $color->getBlue(), $color->getAlpha()]);
    }

   
/**
     * Test setting an invalid background color for the QR code
     */
    #[Test]
   
public function isSetBackgroundColorInvalid(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->setBackgroundColor('invalid-color');
    }

   
/**
     * Test setting a valid logo for the QR code
     */
    #[Test]
   
public function isSetLogoValid(): void
   
{
       
$logoPath = __DIR__ . '/test_logo.png';
       
file_put_contents($logoPath, '');
       
$this->qrCodeGenerator->setLogo($logoPath, 50);
       
$this->assertEquals($logoPath, $this->qrCodeGenerator->getLogoPath());
       
unlink($logoPath);
    }

   
/**
     * Test setting an invalid logo for the QR code
     */
    #[Test]
   
public function isSetLogoInvalid(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->setLogo('invalid/path/to/logo.png', 50);
    }

   
/**
     * Test setting a valid label for the QR code
     */
    #[Test]
   
public function isSetLabelValid(): void
   
{
       
$this->qrCodeGenerator->setLabel('Test Label', 'center', '#000000', 20, [0, 10, 10, 10]);
       
$this->assertEquals('Test Label', $this->qrCodeGenerator->getLabel());
    }

   
/**
     * Test getting the matrix after generating the QR code
     */
    #[Test]
   
public function isGetMatrixValid(): void
   
{
       
$this->qrCodeGenerator->setData('https://example.com', DataType::Url);
       
$this->qrCodeGenerator->generate('png');
       
$matrix = $this->qrCodeGenerator->getMatrix();
       
$this->assertInstanceOf(Matrix::class, $matrix);
    }

   
/**
     * Test getting the matrix without generating the QR code
     */
    #[Test]
   
public function isGetMatrixWithoutGenerate(): void
   
{
       
$this->expectException(\Error::class);
       
$this->qrCodeGenerator->getMatrix();
    }

   
/**
     * Test generating a valid QR code
     */
    #[Test]
   
public function isGenerateValid(): void
   
{
       
$this->qrCodeGenerator->setData('https://example.com', DataType::Url);
       
$this->qrCodeGenerator->generate('png');
       
$this->assertNotEmpty($this->qrCodeGenerator->getDataUri());
    }

   
/**
     * Test generating a QR code with an invalid format
     */
    #[Test]
   
public function isGenerateInvalidFormat(): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->qrCodeGenerator->generate('invalid-format');
    }

   
/**
     * Test saving the QR code to a valid path
     */
    #[Test]
   
public function isSaveToValidPath(): void
   
{
       
$outputPath = './test_qrcode';
       
$outputFormat = 'png';
       
$this->qrCodeGenerator->setData('https://example.com', DataType::Url);
       
$this->qrCodeGenerator->generate($outputFormat);
       
$this->assertTrue($this->qrCodeGenerator->saveTo($outputPath));
       
$this->assertFileExists($outputPath . '.' . $outputFormat);
       
unlink($outputPath . '.' . $outputFormat);
    }

   
/**
     * Data provider valid error correction levels
     */
   
public static function validLevelsProvider(): array
    {
        return [
            [
'Low', 'low'],
            [
'medium', 'medium'],
            [
'Quartile', 'quartile'],
            [
'high', 'high'],
        ];
    }

   
/**
     * Test setting valid error correction levels (case-insensitive)
     */
    #[Test]
    #[DataProvider('validLevelsProvider')]
   
public function isSetValidErrorCorrectionLevel(string $level, string $expected): void
   
{
       
$this->qrCodeGenerator->setErrorCorrectionLevel($level);
       
$this->assertSame($expected, $this->qrCodeGenerator->getErrorCorrectionLevel()->value);
    }

   
/**
     * Data provider Invalid error correction levels
     */
   
public static function invalidLevelsProvider(): array
    {
        return [[
'L'], ['M'], ['Q'], ['H'], ['invalid']];
    }

   
/**
     * Test setting invalid error correction levels throws exception
     */
    #[Test]
    #[DataProvider('invalidLevelsProvider')]
   
public function isSetInvalidErrorCorrectionLevel(string $level): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->expectExceptionMessage('Invalid error correction level. Accepted values: high, low, medium, quartile.');

       
$this->qrCodeGenerator->setErrorCorrectionLevel($level);
    }

   
/**
     * Data provider valid block size modes
     */
   
public static function validBlockSizeModeProvider(): array
    {
        return [
            [
'enlarge', 'enlarge'],
            [
'Margin', 'margin'],
            [
'nOne', 'none'],
            [
'Shrink', 'shrink'],
        ];
    }

   
/**
     * Test setting valid block size modes (case-insensitive)
     */
    #[Test]
    #[DataProvider('validBlockSizeModeProvider')]
   
public function isSetValidBlockSizeMode(string $mode, string $expected): void
   
{
       
$this->qrCodeGenerator->setBlockSizeMode($mode);
       
$this->assertSame($expected, $this->qrCodeGenerator->getBlockSizeMode()->value);
    }

   
/**
     * Data Provider invalid block size modes
     */
   
public static function invalidBlockSizeModeProvider(): array
    {
        return [[
'E'], ['M'], ['N'], ['S']];
    }

   
/**
     * Test setting invalid block size modes throws exception
     */
    #[Test]
    #[DataProvider('invalidBlockSizeModeProvider')]
   
public function isSetInvalidBlockSizeMode(string $mode): void
   
{
       
$this->expectException(\InvalidArgumentException::class);
       
$this->expectExceptionMessage('Invalid round block size mode. Accepted values: enlarge, margin, none, shrink.');
       
$this->qrCodeGenerator->setBlockSizeMode($mode);
    }
}