From 82799f675f2afa067ecb46e829d9b93b79b773b2 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 29 Nov 2010 15:04:21 -0800 Subject: [PATCH] Add Nickname test cases for @-reply regexes in common_find_mentions --- lib/util.php | 47 ++++++++++++++++++++++++++++++++---------- tests/NicknameTest.php | 19 +++++++++++++++++ 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/lib/util.php b/lib/util.php index c170c8380f..317a7aa42e 100644 --- a/lib/util.php +++ b/lib/util.php @@ -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); diff --git a/tests/NicknameTest.php b/tests/NicknameTest.php index a59cada7ad..f49aeba602 100644 --- a/tests/NicknameTest.php +++ b/tests/NicknameTest.php @@ -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(