[ { "msg": "Simple message", "title": "Talk:A", "user": "X", "html": "

Foo bar\n

", "expected": false }, { "msg": "Simple message [with heading]", "title": "Talk:A", "user": "X", "html": "

Foo

\n

bar\n

", "expected": false }, { "msg": "Simple message [with empty heading]", "title": "Talk:A", "user": "X", "html": "

\n

bar\n

", "expected": false }, { "msg": "Simple message [indented]", "title": "Talk:A", "user": "X", "html": "
Foo bar
", "expected": false }, { "msg": "Already signed", "title": "Talk:A", "user": "X", "html": "

Foo bar X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed [with heading]", "title": "Talk:A", "user": "X", "html": "

Foo

\n

bar X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed [indented]", "title": "Talk:A", "user": "X", "html": "
Foo bar X (talk) 00:01, 1 January 2020 (UTC)
", "expected": true }, { "msg": "Already signed with hyphens", "title": "Talk:A", "user": "X", "html": "

Foo bar --X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed without space", "title": "Talk:A", "user": "X", "html": "

Foo barX (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Signed with 5 tildes", "title": "Talk:A", "user": "X", "html": "

Foo bar 00:01, 1 January 2020 (UTC)\n

", "expected": false }, { "msg": "Signed with 3 tildes", "title": "Talk:A", "user": "X", "html": "

Foo bar X (talk)\n

", "expected": false }, { "msg": "Already signed by the wrong user", "title": "Talk:A", "user": "Y", "html": "

Foo bar X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": false }, { "msg": "Already signed (self-link on user talk page)", "title": "User talk:X", "user": "X", "html": "

Foo bar X 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed (not at the end, parentheses)", "title": "Talk:A", "user": "X", "html": "

(Foo bar X (talk) 00:01, 1 January 2020 (UTC))\n

", "expected": true }, { "msg": "Already signed (not at the end, )", "title": "Talk:A", "user": "X", "html": "

Foo bar X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed (not at the end, ) [indented]", "title": "Talk:A", "user": "X", "html": "
Foo bar X (talk) 00:01, 1 January 2020 (UTC)
", "expected": true }, { "msg": "Already signed (wrapper)", "title": "Talk:A", "user": "X", "html": "\n\n
Foo bar X (talk) 00:01, 1 January 2020 (UTC)\n
", "expected": true }, { "msg": "Already signed (multi-line)", "title": "Talk:A", "user": "X", "html": "

Foo\n

bar\n

X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed (multi-line) [indented]", "title": "Talk:A", "user": "X", "html": "
Foo
\n
bar
\n
X (talk) 00:01, 1 January 2020 (UTC)
", "expected": true }, { "msg": "Already signed (not at the end, multiline)", "title": "Talk:A", "user": "X", "html": "

Foo\n

X (talk) 00:01, 1 January 2020 (UTC)\n

bar\n

", "expected": false }, { "msg": "Already signed (not at the end, multiline) [indented]", "title": "Talk:A", "user": "X", "html": "
Foo
\n
X (talk) 00:01, 1 January 2020 (UTC)
\n
bar
", "expected": false } ]