Add Nickname test cases for @-reply regexes in common_find_mentions

This commit is contained in:
Brion Vibber 2010-11-29 15:04:21 -08:00
parent fffc10a230
commit 82799f675f
2 changed files with 55 additions and 11 deletions

View File

@ -564,6 +564,16 @@ function common_render_content($text, $notice)
return $r;
}
/**
* Finds @-mentions within the partially-rendered text section and
* turns them into live links.
*
* Should generally not be called except from common_render_content().
*
* @param string $text partially-rendered HTML
* @param Notice $notice in-progress or complete Notice object for context
* @return string partially-rendered HTML
*/
function common_linkify_mentions($text, $notice)
{
$mentions = common_find_mentions($text, $notice);
@ -669,17 +679,7 @@ function common_find_mentions($text, $notice)
}
}
preg_match_all('/^T (' . Nickname::DISPLAY_FMT . ') /',
$text,
$tmatches,
PREG_OFFSET_CAPTURE);
preg_match_all('/(?:^|\s+)@(' . Nickname::DISPLAY_FMT . ')\b/',
$text,
$atmatches,
PREG_OFFSET_CAPTURE);
$matches = array_merge($tmatches[1], $atmatches[1]);
$matches = common_find_mentions_raw($text);
foreach ($matches as $match) {
try {
@ -753,6 +753,31 @@ function common_find_mentions($text, $notice)
return $mentions;
}
/**
* Does the actual regex pulls to find @-mentions in text.
* Should generally not be called directly; for use in common_find_mentions.
*
* @param string $text
* @return array of PCRE match arrays
*/
function common_find_mentions_raw($text)
{
$tmatches = array();
preg_match_all('/^T (' . Nickname::DISPLAY_FMT . ') /',
$text,
$tmatches,
PREG_OFFSET_CAPTURE);
$atmatches = array();
preg_match_all('/(?:^|\s+)@(' . Nickname::DISPLAY_FMT . ')\b/',
$text,
$atmatches,
PREG_OFFSET_CAPTURE);
$matches = array_merge($tmatches[1], $atmatches[1]);
return $matches;
}
function common_render_text($text)
{
$r = htmlspecialchars($text);

View File

@ -51,6 +51,25 @@ class NicknameTest extends PHPUnit_Framework_TestCase
}
}
/**
* Test on the regex matching used in common_find_mentions
* (testing on the full notice rendering is difficult as it needs
* to be able to pull from global state)
*
* @dataProvider provider
*/
public function testAtReply($input, $expected, $expectedException=null)
{
if ($expected == false) {
// nothing to do
} else {
$text = "@{$input} awesome! :)";
$matches = common_find_mentions_raw($text);
$this->assertEquals(1, count($matches));
$this->assertEquals($expected, Nickname::normalize($matches[0][0]));
}
}
static public function provider()
{
return array(