Commit 7b0039e9 authored by alexpott's avatar alexpott

Issue #2002190 by dawehner, jhedstrom: Convert...

Issue #2002190 by dawehner, jhedstrom: Convert core/modules/search/lib/Drupal/search/Tests/SearchExpressionTest.php to phpunit.
parent 37445fd7
<?php
/**
* @file
* Contains \Drupal\search\SearchExpression.
*/
namespace Drupal\search;
/**
* Defines a search expression.
*/
class SearchExpression {
/**
* The search expression string
*
* @var string
*/
protected $expression;
/**
* Constructs a SearchExpression.
*
* @param string $expression
* The search expression.
*/
public function __construct($expression) {
$this->expression = $expression;
}
/**
* Gets the expression.
*
* @return string
*/
public function getExpression() {
return $this->expression;
}
/**
* Extracts a module-specific search option from a search expression.
*
* Search options are added using SearchExpression::insert() and retrieved
* using SearchExpression::extract(). They take the form option:value, and
* are added to the ordinary keywords in the search expression.
*
* @param string $option
* The name of the option to retrieve from the search expression.
*
* @return string
* The value previously stored in the search expression for option $option,
* if any. Trailing spaces in values will not be included.
*/
public function extract($option) {
if (preg_match('/(^| )' . $option . ':([^ ]*)( |$)/i', $this->expression, $matches)) {
return $matches[2];
}
}
/**
* Adds a module-specific search option to a search expression.
*
* Search options are added using SearchExpression::insert() and retrieved
* using SearchExpression::extract(). They take the form option:value, and
* are added to the ordinary keywords in the search expression.
*
* @param string $option
* The name of the option to add to the search expression.
* @param string $value
* The value to add for the option. If present, it will replace any previous
* value added for the option. Cannot contain any spaces or | characters, as
* these are used as delimiters. If you want to add a blank value $option: to
* the search expression, pass in an empty string or a string that is
* composed of only spaces. To clear a previously-stored option without
* adding a replacement, pass in NULL for $value or omit.
*
* @return static|\Drupal\search\SearchExpression
* The search expression, with any previous value for this option removed, and
* a new $option:$value pair added if $value was provided.
*/
public function insert($option, $value = NULL) {
// Remove any previous values stored with $option.
$this->expression = trim(preg_replace('/(^| )' . $option . ':[^ ]*/i', '', $this->expression));
// Set new value, if provided.
if (isset($value)) {
$this->expression .= ' ' . $option . ':' . trim($value);
}
return $this;
}
}
<?php
/**
* @file
* Definition of Drupal\search\Tests\SearchExpressionInsertExtractTest.
*/
namespace Drupal\search\Tests;
use Drupal\simpletest\UnitTestBase;
/**
* Tests search_expression_insert() and search_expression_extract().
*
* @see http://drupal.org/node/419388 (issue)
*/
class SearchExpressionInsertExtractTest extends UnitTestBase {
public static function getInfo() {
return array(
'name' => 'Search expression insert/extract',
'description' => 'Tests the functions search_expression_insert() and search_expression_extract()',
'group' => 'Search',
);
}
function setUp() {
drupal_load('module', 'search');
parent::setUp();
}
/**
* Tests search_expression_insert() and search_expression_extract().
*/
function testInsertExtract() {
$base_expression = "mykeyword";
// Build an array of option, value, what should be in the expression, what
// should be retrieved from expression.
$cases = array(
array('foo', 'bar', 'foo:bar', 'bar'), // Normal case.
array('foo', NULL, '', NULL), // Empty value: shouldn't insert.
array('foo', ' ', 'foo:', ''), // Space as value: should insert but retrieve empty string.
array('foo', '', 'foo:', ''), // Empty string as value: should insert but retrieve empty string.
array('foo', '0', 'foo:0', '0'), // String zero as value: should insert.
array('foo', 0, 'foo:0', '0'), // Numeric zero as value: should insert.
);
foreach ($cases as $index => $case) {
$after_insert = search_expression_insert($base_expression, $case[0], $case[1]);
if (empty($case[2])) {
$this->assertEqual($after_insert, $base_expression, "Empty insert does not change expression in case $index");
}
else {
$this->assertEqual($after_insert, $base_expression . ' ' . $case[2], "Insert added correct expression for case $index");
}
$retrieved = search_expression_extract($after_insert, $case[0]);
if (!isset($case[3])) {
$this->assertFalse(isset($retrieved), "Empty retrieval results in unset value in case $index");
}
else {
$this->assertEqual($retrieved, $case[3], "Value is retrieved for case $index");
}
$after_clear = search_expression_insert($after_insert, $case[0]);
$this->assertEqual(trim($after_clear), $base_expression, "After clearing, base expression is restored for case $index");
$cleared = search_expression_extract($after_clear, $case[0]);
$this->assertFalse(isset($cleared), "After clearing, value could not be retrieved for case $index");
}
}
}
......@@ -7,6 +7,7 @@
use Drupal\Core\Entity\EntityInterface;
use Drupal\Component\Utility\Unicode;
use Drupal\search\SearchExpression;
/**
* Matches all 'N' Unicode character classes (numbers)
......@@ -867,9 +868,8 @@ function search_comment_unpublish($comment) {
* if any. Trailing spaces in values will not be included.
*/
function search_expression_extract($expression, $option) {
if (preg_match('/(^| )' . $option . ':([^ ]*)( |$)/i', $expression, $matches)) {
return $matches[2];
}
$expression = new SearchExpression($expression);
return $expression->extract($option);
}
/**
......@@ -896,14 +896,8 @@ function search_expression_extract($expression, $option) {
* a new $option:$value pair added if $value was provided.
*/
function search_expression_insert($expression, $option, $value = NULL) {
// Remove any previous values stored with $option.
$expression = trim(preg_replace('/(^| )' . $option . ':[^ ]*/i', '', $expression));
// Set new value, if provided.
if (isset($value)) {
$expression .= ' ' . $option . ':' . trim($value);
}
return $expression;
$expression = new SearchExpression($expression);
return $expression->insert($option, $value)->getExpression();
}
/**
......
<?php
/**
* @file
* Contains \Drupal\search\Tests\SearchExpressionTest.
*/
namespace Drupal\search\Tests;
use Drupal\search\SearchExpression;
use Drupal\Tests\UnitTestCase;
/**
* Tests the search expression class.
*
* @see \Drupal\search\SearchExpression
*/
class SearchExpressionTest extends UnitTestCase {
public static function getInfo() {
return array(
'name' => 'Search expression insert/extract',
'description' => 'Tests the search expression class.',
'group' => 'Search',
);
}
/**
* Provides data for the search expression tests.
*
* @return array
* An array of values passed to the test methods.
*/
public function dataProvider() {
$cases = array(
// Normal case.
array('foo', 'bar', 'foo:bar', 'bar'),
// Empty value: shouldn't insert.
array('foo', NULL, '', NULL),
// Space as value: should insert but retrieve empty string.
array('foo', ' ', 'foo:', ''),
// Empty string as value: should insert but retrieve empty string.
array('foo', '', 'foo:', ''),
// String zero as value: should insert.
array('foo', '0', 'foo:0', '0'),
// Numeric zero as value: should insert.
array('foo', 0, 'foo:0', '0'),
);
return $cases;
}
/**
* Tests the search expression methods.
*
* @dataProvider dataProvider
*/
public function testInsertExtract($case_0, $case_1, $case_2, $case_3) {
$base_expression = 'mykeyword';
// Build an array of option, value, what should be in the expression, what
// should be retrieved from expression.
$after_insert = new SearchExpression($base_expression);
$after_insert->insert($case_0, $case_1);
if (empty($case_2)) {
$this->assertEquals($base_expression, $after_insert->getExpression(), 'Empty insert does change expression.');
}
else {
$this->assertEquals($base_expression . ' ' . $case_2, $after_insert->getExpression(), 'Insert added incorrect expression.');
}
$retrieved = $after_insert->extract($case_0);
if (!isset($case_3)) {
$this->assertFalse(isset($retrieved), 'Empty retrieval results in unset value.');
}
else {
$this->assertEquals($case_3, $retrieved, 'Value is retrieved.');
}
$after_clear = $after_insert->insert($case_0);
$this->assertEquals($base_expression, $after_clear->getExpression(), 'After clearing, base expression is not restored.');
$cleared = $after_clear->extract($case_0);
$this->assertFalse(isset($cleared), 'After clearing, value could be retrieved.');
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment