‪TYPO3CMS  ‪main
Permutation.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
21 
23 {
27  private array ‪$targets;
28 
32  private array ‪$applicableSets;
33 
35 
39  private array ‪$results = [];
40 
41  public static function ‪create(‪Variables ‪$variables): self
42  {
43  return new static(‪$variables);
44  }
45 
47  {
48  $this->variables = ‪$variables;
49  }
50 
51  public function ‪permute(): self
52  {
53  $this->results = [];
54  foreach ($this->targets as $target) {
55  if (!$target instanceof ‪TestSet) {
56  throw new \LogicException('Expected DataSet', 1578045577);
57  }
58  $target = $target->withMergedVariables($this->variables);
59  foreach (‪PermutationUtility::meltArrayItems($this->applicableSets) as $applicables) {
60  try {
61  $this->results[] = $this->‪applyApplicables($target, ...$applicables);
62  } catch (‪SkipException $exception) {
63  continue;
64  }
65  }
66  }
67  return $this;
68  }
69 
70  private function ‪applyApplicables(‪TestSet $target, ‪Applicable ...$applicables): ‪TestSet
71  {
72  foreach ($applicables as $index => $applicable) {
73  $target = $this->‪withVariableContext($target, $applicable, ...$applicables);
74  }
75  return $target->‪withMergedApplicables(...$applicables);
76  }
77 
78  private function ‪withVariableContext(‪TestSet $target, ‪Applicable $candidate, ‪Applicable ...$applicables): ‪TestSet
79  {
80  if ($candidate instanceof ‪ApplicableConjunction) {
81  foreach ($candidate->filter(VariablesContext::class) as $variableContext) {
82  // in case SkipException is thrown, skip the whole(!) conjunction
83  // (that's why this is not caught here explicitly)
84  $target = $this->‪withVariableContext($target, $variableContext, ...$applicables);
85  }
86  } elseif ($candidate instanceof ‪VariablesContext) {
87  // apply variables for matching VariableContext
88  $targetApplicables = $this->‪includeTargetApplicables($target, ...$applicables);
89  if ($candidate->matchesRequiredApplicables(...$targetApplicables)) {
90  return $target->‪withMergedVariables($candidate->getVariables());
91  }
92  // otherwise don't apply variables & skip this TestSet
93  throw new ‪SkipException('skip', 1578162207);
94  }
95  return $target;
96  }
97 
101  public function ‪getResults(): array
102  {
103  return ‪$this->results;
104  }
105 
106  public function ‪getTargetsForDataProvider(): array
107  {
108  $keys = array_map(
109  static function (‪TestSet $testSet) {
110  return $testSet->‪describe();
111  },
113  );
114  $values = array_map(
115  static function (‪TestSet $testSet) {
116  return [$testSet];
117  },
119  );
120  return array_combine($keys, $values);
121  }
122 
123  public function ‪withTargets(‪TestSet ...‪$targets): self
124  {
125  $target = clone $this;
126  $target->targets = ‪$targets;
127  return $target;
128  }
129 
130  public function ‪withApplicableSet(‪Applicable ...$applicables): self
131  {
132  $target = clone $this;
133  $target->applicableSets[] = $applicables;
134  return $target;
135  }
136 
137  public function ‪withApplicableItems(array $applicableItems, ‪Applicable ...$applicables): self
138  {
139  $applicableItems = array_values($applicableItems);
140  $applicableItems = array_merge($applicableItems, $applicables);
141  return $this->‪withApplicableSet(...$applicableItems);
142  }
143 
147  private function ‪includeTargetApplicables(‪TestSet $target, ‪Applicable ...$applicables): array
148  {
149  if (empty($target->‪getApplicables())) {
150  return $applicables;
151  }
152  $targetApplicables = $applicables;
153  foreach ($target->‪getApplicables() as $targetApplicable) {
154  if (!in_array($targetApplicable, $targetApplicables, true)) {
155  $targetApplicables[] = $targetApplicable;
156  }
157  }
158  return $targetApplicables;
159  }
160 }
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\withApplicableSet
‪withApplicableSet(Applicable ... $applicables)
Definition: Permutation.php:130
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\TestSet\describe
‪describe()
Definition: TestSet.php:118
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\applyApplicables
‪applyApplicables(TestSet $target, Applicable ... $applicables)
Definition: Permutation.php:70
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation
Definition: Permutation.php:23
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\permute
‪permute()
Definition: Permutation.php:51
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Variables
Definition: Variables.php:21
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\VariablesContext
Definition: VariablesContext.php:21
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\create
‪static create(Variables $variables)
Definition: Permutation.php:41
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\TestSet
Definition: TestSet.php:21
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\$applicableSets
‪array $applicableSets
Definition: Permutation.php:32
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\withVariableContext
‪withVariableContext(TestSet $target, Applicable $candidate, Applicable ... $applicables)
Definition: Permutation.php:78
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Applicable
Definition: Applicable.php:21
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\$results
‪array $results
Definition: Permutation.php:39
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\__construct
‪__construct(Variables $variables)
Definition: Permutation.php:46
‪TYPO3\CMS\Core\Utility\PermutationUtility
Definition: PermutationUtility.php:24
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\TestSet\getApplicables
‪Applicable[] getApplicables(string $type=null)
Definition: TestSet.php:54
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\withTargets
‪withTargets(TestSet ... $targets)
Definition: Permutation.php:123
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\includeTargetApplicables
‪Applicable[] includeTargetApplicables(TestSet $target, Applicable ... $applicables)
Definition: Permutation.php:147
‪TYPO3\CMS\Core\Utility\PermutationUtility\meltArrayItems
‪static array[] meltArrayItems(array $payload, array $previousResult=[])
Definition: PermutationUtility.php:72
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\TestSet\withMergedVariables
‪withMergedVariables(Variables $variables)
Definition: TestSet.php:97
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder
Definition: Applicable.php:18
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\$variables
‪Variables $variables
Definition: Permutation.php:34
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\withApplicableItems
‪withApplicableItems(array $applicableItems, Applicable ... $applicables)
Definition: Permutation.php:137
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\getTargetsForDataProvider
‪getTargetsForDataProvider()
Definition: Permutation.php:106
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\ApplicableConjunction
Definition: ApplicableConjunction.php:21
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\$targets
‪array $targets
Definition: Permutation.php:27
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\Permutation\getResults
‪TestSet[] getResults()
Definition: Permutation.php:101
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\TestSet\withMergedApplicables
‪withMergedApplicables(Applicable ... $applicables)
Definition: TestSet.php:79
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\Framework\Builder\SkipException
Definition: SkipException.php:20