(defalias 'erc-list 'ensure-list)
+(defconst erc--parse-user-regexp-pedantic
+ (rx bot (group (* (not (any "!\r\n"))))
+ "!" (group (* nonl))
+ "@" (group (* nonl)) eot))
+
+(defconst erc--parse-user-regexp-legacy
+ "^\\([^!\n]*\\)!\\([^@\n]*\\)@\\(.*\\)$")
+
+(defvar erc--parse-user-regexp erc--parse-user-regexp-legacy)
+
(defun erc-parse-user (string)
"Parse STRING as a user specification (nick!login@host).
Return a list of the three separate tokens."
(cond
- ((string-match "^\\([^!\n]*\\)!\\([^@\n]*\\)@\\(.*\\)$" string)
+ ((string-match erc--parse-user-regexp string)
(list (match-string 1 string)
(match-string 2 string)
(match-string 3 string)))
(setq erc-lurker-ignore-chars "_-`") ; set of chars, not character alts
(should (string= "nick" (erc-lurker-maybe-trim "nick-_`")))))
+(ert-deftest erc-parse-user ()
+ (should (equal erc--parse-user-regexp erc--parse-user-regexp-legacy))
+
+ (should (equal '("" "" "") (erc-parse-user "!@")))
+ (should (equal '("" "!" "") (erc-parse-user "!!@")))
+ (should (equal '("" "" "@") (erc-parse-user "!@@")))
+ (should (equal '("" "!" "@") (erc-parse-user "!!@@")))
+
+ (should (equal '("abc" "" "") (erc-parse-user "abc")))
+ (should (equal '("" "123" "fake") (erc-parse-user "!123@fake")))
+ (should (equal '("abc" "" "123") (erc-parse-user "abc!123")))
+
+ (should (equal '("abc" "123" "fake") (erc-parse-user "abc!123@fake")))
+ (should (equal '("abc" "!123" "@xy") (erc-parse-user "abc!!123@@xy")))
+
+ (should (equal '("de" "fg" "xy") (erc-parse-user "abc\nde!fg@xy")))
+
+ (ert-info ("`erc--parse-user-regexp-pedantic'")
+ (let ((erc--parse-user-regexp erc--parse-user-regexp-pedantic))
+ (should (equal '("" "" "") (erc-parse-user "!@")))
+ (should (equal '("" "!" "") (erc-parse-user "!!@")))
+ (should (equal '("" "@" "") (erc-parse-user "!@@")))
+ (should (equal '("" "!@" "") (erc-parse-user "!!@@")))
+
+ (should (equal '("abc" "" "") (erc-parse-user "abc")))
+ (should (equal '("" "123" "fake") (erc-parse-user "!123@fake")))
+ (should (equal '("abc" "" "123") (erc-parse-user "abc!123")))
+
+ (should (equal '("abc" "123" "fake") (erc-parse-user "abc!123@fake")))
+ (should (equal '("abc" "!123@" "xy") (erc-parse-user "abc!!123@@xy")))
+
+ (should (equal '("de" "" "fg@xy") (erc-parse-user "abc\nde!fg@xy"))))))
+
(ert-deftest erc--parse-isupport-value ()
(should (equal (erc--parse-isupport-value "a,b") '("a" "b")))
(should (equal (erc--parse-isupport-value "a,b,c") '("a" "b" "c")))