Skip to content

Commit

Permalink
add local cache for transformPatternToRegex
Browse files Browse the repository at this point in the history
  • Loading branch information
jdeniau committed Jun 4, 2018
1 parent b8f8822 commit 8ba1ea4
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 3 deletions.
14 changes: 11 additions & 3 deletions src/Behat/Behat/Definition/Pattern/PatternTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ final class PatternTransformer
*/
private $policies = array();

private $patternToRegexpCache = array();

/**
* Registers pattern policy.
*
Expand All @@ -34,6 +36,7 @@ final class PatternTransformer
public function registerPatternPolicy(PatternPolicy $policy)
{
$this->policies[] = $policy;
$this->patternToRegexpCache = array();
}

/**
Expand Down Expand Up @@ -68,11 +71,16 @@ public function generatePattern($type, $stepText)
*/
public function transformPatternToRegex($pattern)
{
foreach ($this->policies as $policy) {
if ($policy->supportsPattern($pattern)) {
return $policy->transformPatternToRegex($pattern);
if (!isset($this->patternToRegexpCache[$pattern])) {
foreach ($this->policies as $policy) {
if ($policy->supportsPattern($pattern)) {
$this->patternToRegexpCache[$pattern] = $policy->transformPatternToRegex($pattern);
break;
}
}
}
return $this->patternToRegexpCache[$pattern];


throw new UnknownPatternException(sprintf('Can not find policy for a pattern `%s`.', $pattern), $pattern);
}
Expand Down
68 changes: 68 additions & 0 deletions tests/Behat/Tests/Definition/Pattern/PatternTransformerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

namespace Behat\Tests\Definition\Pattern;

use Behat\Behat\Definition\Pattern\PatternTransformer;
use Behat\Behat\Definition\Pattern\Policy\PatternPolicy;
use PHPUnit\Framework\TestCase;

/**
* Class PatternTransformerTest
* @author Julien Deniau <julien.deniau@mapado.com>
*/
class PatternTransformerTest extends TestCase
{
public function testTransformPatternToRegexCache()
{
$observer = $this->prophesize(PatternPolicy::class);
// first pattern
$observer->supportsPattern('hello world')->willReturn(true);
$observer->transformPatternToRegex('hello world')
->shouldBeCalledTimes(1)
->willReturn('/hello world/');

// second pattern
$observer->supportsPattern('hi world')->willReturn(true);
$observer->transformPatternToRegex('hi world')
->shouldBeCalledTimes(1)
->willReturn('/hi world/');

$testedInstance = new PatternTransformer();
$testedInstance->registerPatternPolicy($observer->reveal());
$regex = $testedInstance->transformPatternToRegex('hello world');
$regex2 = $testedInstance->transformPatternToRegex('hello world');

$regex3 = $testedInstance->transformPatternToRegex('hi world');

$this->assertEquals('/hello world/', $regex);
$this->assertEquals('/hello world/', $regex2);
$this->assertEquals('/hi world/', $regex3);
}

public function testTransformPatternToRegexCacheAndRegisterNewPolicy()
{
// first pattern
$policy1Prophecy = $this->prophesize(PatternPolicy::class);
$policy1Prophecy->supportsPattern('hello world')->willReturn(true);
$policy1Prophecy->transformPatternToRegex('hello world')
->shouldBeCalledTimes(2)
->willReturn('/hello world/');

// second pattern
$policy2Prophecy = $this->prophesize(PatternPolicy::class);
$policy1Prophecy->supportsPattern()->shouldNotBeCalled();
$policy1Prophecy->transformPatternToRegex()->shouldNotBeCalled();

$testedInstance = new PatternTransformer();
$testedInstance->registerPatternPolicy($policy1Prophecy->reveal());
$regex = $testedInstance->transformPatternToRegex('hello world');
$regex2 = $testedInstance->transformPatternToRegex('hello world');

$testedInstance->registerPatternPolicy($policy2Prophecy->reveal());
$regex3 = $testedInstance->transformPatternToRegex('hello world');

$this->assertEquals('/hello world/', $regex);
$this->assertEquals('/hello world/', $regex2);
$this->assertEquals('/hello world/', $regex3);
}
}

0 comments on commit 8ba1ea4

Please sign in to comment.