]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Add Nickname test cases for @-reply regexes in common_find_mentions
authorBrion Vibber <brion@pobox.com>
Mon, 29 Nov 2010 23:04:21 +0000 (15:04 -0800)
committerBrion Vibber <brion@pobox.com>
Mon, 29 Nov 2010 23:07:55 +0000 (15:07 -0800)
lib/util.php
tests/NicknameTest.php

index c170c8380f19b2727a7d4df897b95c4bdcfe8ed5..317a7aa42eba7559bb695e27c5d297cd374afcb8 100644 (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);
index a59cada7ad0ba09db949bca050ae0890d3040d05..f49aeba602421957dae8e6e20e7656a520a46bf9 100644 (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(