Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

IntegrationTestCase.php

Zuletzt modifiziert: 09.10.2024, 12:58 - Dateigröße: 7.63 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of Twig.
 005   *
 006   * (c) 2010 Fabien Potencier
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  /**
 013   * Integration test helper.
 014   *
 015   * @author Fabien Potencier <fabien@symfony.com>
 016   * @author Karma Dordrak <drak@zikula.org>
 017   */
 018  abstract class Twig_Test_IntegrationTestCase extends PHPUnit_Framework_TestCase
 019  {
 020      /**
 021       * @return string
 022       */
 023      abstract protected function getFixturesDir();
 024   
 025      /**
 026       * @return Twig_ExtensionInterface[]
 027       */
 028      protected function getExtensions()
 029      {
 030          return array();
 031      }
 032   
 033      /**
 034       * @return Twig_SimpleFilter[]
 035       */
 036      protected function getTwigFilters()
 037      {
 038          return array();
 039      }
 040   
 041      /**
 042       * @return Twig_SimpleFunction[]
 043       */
 044      protected function getTwigFunctions()
 045      {
 046          return array();
 047      }
 048   
 049      /**
 050       * @return Twig_SimpleTest[]
 051       */
 052      protected function getTwigTests()
 053      {
 054          return array();
 055      }
 056   
 057      /**
 058       * @dataProvider getTests
 059       */
 060      public function testIntegration($file, $message, $condition, $templates, $exception, $outputs)
 061      {
 062          $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs);
 063      }
 064   
 065      /**
 066       * @dataProvider getLegacyTests
 067       * @group legacy
 068       */
 069      public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs)
 070      {
 071          $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs);
 072      }
 073   
 074      public function getTests($name, $legacyTests = false)
 075      {
 076          $fixturesDir = realpath($this->getFixturesDir());
 077          $tests = array();
 078   
 079          foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
 080              if (!preg_match('/\.test$/', $file)) {
 081                  continue;
 082              }
 083   
 084              if ($legacyTests xor false !== strpos($file->getRealpath(), '.legacy.test')) {
 085                  continue;
 086              }
 087   
 088              $test = file_get_contents($file->getRealpath());
 089   
 090              if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) {
 091                  $message = $match[1];
 092                  $condition = $match[2];
 093                  $templates = self::parseTemplates($match[3]);
 094                  $exception = $match[5];
 095                  $outputs = array(array(null, $match[4], null, ''));
 096              } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) {
 097                  $message = $match[1];
 098                  $condition = $match[2];
 099                  $templates = self::parseTemplates($match[3]);
 100                  $exception = false;
 101                  preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, PREG_SET_ORDER);
 102              } else {
 103                  throw new InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file)));
 104              }
 105   
 106              $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs);
 107          }
 108   
 109          if ($legacyTests && empty($tests)) {
 110              // add a dummy test to avoid a PHPUnit message
 111              return array(array('not', '-', '', array(), '', array()));
 112          }
 113   
 114          return $tests;
 115      }
 116   
 117      public function getLegacyTests()
 118      {
 119          return $this->getTests('testLegacyIntegration', true);
 120      }
 121   
 122      protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs)
 123      {
 124          if ($condition) {
 125              eval('$ret = '.$condition.';');
 126              if (!$ret) {
 127                  $this->markTestSkipped($condition);
 128              }
 129          }
 130   
 131          $loader = new Twig_Loader_Array($templates);
 132   
 133          foreach ($outputs as $i => $match) {
 134              $config = array_merge(array(
 135                  'cache' => false,
 136                  'strict_variables' => true,
 137              ), $match[2] ? eval($match[2].';') : array());
 138              $twig = new Twig_Environment($loader, $config);
 139              $twig->addGlobal('global', 'global');
 140              foreach ($this->getExtensions() as $extension) {
 141                  $twig->addExtension($extension);
 142              }
 143   
 144              foreach ($this->getTwigFilters() as $filter) {
 145                  $twig->addFilter($filter);
 146              }
 147   
 148              foreach ($this->getTwigTests() as $test) {
 149                  $twig->addTest($test);
 150              }
 151   
 152              foreach ($this->getTwigFunctions() as $function) {
 153                  $twig->addFunction($function);
 154              }
 155   
 156              // avoid using the same PHP class name for different cases
 157              // only for PHP 5.2+
 158              if (PHP_VERSION_ID >= 50300) {
 159                  $p = new ReflectionProperty($twig, 'templateClassPrefix');
 160                  $p->setAccessible(true);
 161                  $p->setValue($twig, '__TwigTemplate_'.hash('sha256', uniqid(mt_rand(), true), false).'_');
 162              }
 163   
 164              try {
 165                  $template = $twig->loadTemplate('index.twig');
 166              } catch (Exception $e) {
 167                  if (false !== $exception) {
 168                      $message = $e->getMessage();
 169                      $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $message)));
 170                      $this->assertSame('.', substr($message, strlen($message) - 1), $message, 'Exception message must end with a dot.');
 171   
 172                      return;
 173                  }
 174   
 175                  if ($e instanceof Twig_Error_Syntax) {
 176                      $e->setTemplateFile($file);
 177   
 178                      throw $e;
 179                  }
 180   
 181                  throw new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e);
 182              }
 183   
 184              try {
 185                  $output = trim($template->render(eval($match[1].';')), "\n ");
 186              } catch (Exception $e) {
 187                  if (false !== $exception) {
 188                      $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $e->getMessage())));
 189   
 190                      return;
 191                  }
 192   
 193                  if ($e instanceof Twig_Error_Syntax) {
 194                      $e->setTemplateFile($file);
 195                  } else {
 196                      $e = new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e);
 197                  }
 198   
 199                  $output = trim(sprintf('%s: %s', get_class($e), $e->getMessage()));
 200              }
 201   
 202              if (false !== $exception) {
 203                  list($class) = explode(':', $exception);
 204                  $this->assertThat(null, new PHPUnit_Framework_Constraint_Exception($class));
 205              }
 206   
 207              $expected = trim($match[3], "\n ");
 208   
 209              if ($expected !== $output) {
 210                  printf("Compiled templates that failed on case %d:\n", $i + 1);
 211   
 212                  foreach (array_keys($templates) as $name) {
 213                      echo "Template: $name\n";
 214                      $source = $loader->getSource($name);
 215                      echo $twig->compile($twig->parse($twig->tokenize($source, $name)));
 216                  }
 217              }
 218              $this->assertEquals($expected, $output, $message.' (in '.$file.')');
 219          }
 220      }
 221   
 222      protected static function parseTemplates($test)
 223      {
 224          $templates = array();
 225          preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, PREG_SET_ORDER);
 226          foreach ($matches as $match) {
 227              $templates[($match[1] ? $match[1] : 'index.twig')] = $match[2];
 228          }
 229   
 230          return $templates;
 231      }
 232  }
 233