RequirePassTest.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <?php
  2. /*
  3. * This file is part of Psy Shell.
  4. *
  5. * (c) 2012-2023 Justin Hileman
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Psy\Test\CodeCleaner;
  11. use Psy\CodeCleaner\RequirePass;
  12. /**
  13. * @group isolation-fail
  14. */
  15. class RequirePassTest extends CodeCleanerTestCase
  16. {
  17. /**
  18. * @before
  19. */
  20. public function getReady()
  21. {
  22. $this->setPass(new RequirePass());
  23. }
  24. /**
  25. * @dataProvider exitStatements
  26. */
  27. public function testExitStatement($from, $to)
  28. {
  29. $this->assertProcessesAs($from, $to);
  30. }
  31. public function exitStatements()
  32. {
  33. $resolve = '\\Psy\\CodeCleaner\\RequirePass::resolve';
  34. return [
  35. // The basics
  36. ['require "a"', "require $resolve(\"a\", 1);"],
  37. ['require "b.php"', "require $resolve(\"b.php\", 1);"],
  38. ['require_once "c"', "require_once $resolve(\"c\", 1);"],
  39. ['require_once "d.php"', "require_once $resolve(\"d.php\", 1);"],
  40. // Ensure that line numbers work correctly
  41. ["null;\nrequire \"e.php\"", "null;\nrequire $resolve(\"e.php\", 2);"],
  42. ["null;\nrequire_once \"f.php\"", "null;\nrequire_once $resolve(\"f.php\", 2);"],
  43. // Things with expressions
  44. ['require $foo', "require $resolve(\$foo, 1);"],
  45. ['require_once $foo', "require_once $resolve(\$foo, 1);"],
  46. ['require ($bar = "g.php")', "require $resolve(\$bar = \"g.php\", 1);"],
  47. ['require_once ($bar = "h.php")', "require_once $resolve(\$bar = \"h.php\", 1);"],
  48. ['$bar = require ($baz = "i.php")', "\$bar = (require $resolve(\$baz = \"i.php\", 1));"],
  49. ['$bar = require_once ($baz = "j.php")', "\$bar = (require_once $resolve(\$baz = \"j.php\", 1));"],
  50. ];
  51. }
  52. public function testResolve()
  53. {
  54. $this->expectException(\Psy\Exception\FatalErrorException::class);
  55. $this->expectExceptionMessage('Failed opening required \'not a file name\' in eval()\'d code on line 2');
  56. RequirePass::resolve('not a file name', 2);
  57. $this->fail();
  58. }
  59. /**
  60. * @dataProvider emptyWarnings
  61. */
  62. public function testResolveEmptyWarnings($file)
  63. {
  64. if (!\E_WARNING & \error_reporting()) {
  65. $this->markTestSkipped();
  66. }
  67. $this->expectException(\Psy\Exception\ErrorException::class);
  68. $this->expectExceptionMessage('Filename cannot be empty on line 1');
  69. RequirePass::resolve($file, 1);
  70. $this->fail();
  71. }
  72. public function emptyWarnings()
  73. {
  74. return [
  75. [null],
  76. [false],
  77. [''],
  78. ];
  79. }
  80. public function testResolveWorks()
  81. {
  82. $this->assertSame(__FILE__, RequirePass::resolve(__FILE__, 3));
  83. }
  84. }