QROutputTestAbstract.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. /**
  3. * Class QROutputTestAbstract
  4. *
  5. * @created 24.12.2017
  6. * @author Smiley <smiley@chillerlan.net>
  7. * @copyright 2017 Smiley
  8. * @license MIT
  9. */
  10. namespace chillerlan\QRCodeTest\Output;
  11. use chillerlan\QRCode\{QRCode, QROptions};
  12. use chillerlan\QRCode\Data\QRMatrix;
  13. use chillerlan\QRCode\Output\{QRCodeOutputException, QROutputInterface};
  14. use PHPUnit\Framework\TestCase;
  15. use ReflectionClass;
  16. use function file_exists, file_get_contents, mkdir, realpath;
  17. /**
  18. * Test abstract for the several (built-in) output modules,
  19. * should also be used to test custom output modules
  20. */
  21. abstract class QROutputTestAbstract extends TestCase{
  22. /** @var \chillerlan\QRCode\QROptions|\chillerlan\Settings\SettingsContainerInterface */
  23. protected QROptions $options;
  24. protected QROutputInterface $outputInterface;
  25. protected QRMatrix $matrix;
  26. protected string $type;
  27. protected const buildDir = __DIR__.'/../../.build/output-test/';
  28. /**
  29. * Attempts to create a directory under /.build and instances several required objects
  30. */
  31. protected function setUp():void{
  32. if(!file_exists($this::buildDir)){
  33. mkdir($this::buildDir, 0777, true);
  34. }
  35. $this->options = new QROptions;
  36. $this->options->outputType = $this->type;
  37. $this->matrix = (new QRCode($this->options))->addByteSegment('testdata')->getQRMatrix();
  38. $this->outputInterface = $this->getOutputInterface($this->options, $this->matrix);
  39. }
  40. abstract protected function getOutputInterface(QROptions $options, QRMatrix $matrix):QROutputInterface;
  41. /**
  42. * Tests if an exception is thrown when trying to write a cache file to an invalid destination
  43. */
  44. public function testSaveException():void{
  45. $this->expectException(QRCodeOutputException::class);
  46. $this->expectExceptionMessage('Cannot write data to cache file: /foo/bar.test');
  47. $this->outputInterface->dump('/foo/bar.test');
  48. }
  49. abstract public static function moduleValueProvider():array;
  50. /**
  51. * @param mixed $value
  52. * @param bool $expected
  53. *
  54. * @dataProvider moduleValueProvider
  55. */
  56. public function testValidateModuleValues($value, bool $expected):void{
  57. $this::assertSame($expected, $this->outputInterface::moduleValueIsValid($value));
  58. }
  59. /*
  60. * additional, non-essential, potentially inaccurate coverage tests
  61. */
  62. /**
  63. * covers the module values settings
  64. */
  65. abstract public function testSetModuleValues():void;
  66. /**
  67. * coverage of the built-in output modules
  68. */
  69. public function testRenderToCacheFile():void{
  70. $this->options->outputBase64 = false;
  71. $this->outputInterface = $this->getOutputInterface($this->options, $this->matrix);
  72. // create the cache file
  73. $name = (new ReflectionClass($this->outputInterface))->getShortName();
  74. $file = realpath($this::buildDir).'test.output.'.$name;
  75. $data = $this->outputInterface->dump($file);
  76. $this::assertSame($data, file_get_contents($file));
  77. }
  78. }