[ { "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 [with heading, prefixed by unsigned text]", "title": "Talk:A", "user": "X", "html": "

foo\n

## 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": "Incorrectly signed (with 5 tildes)", "title": "Talk:A", "user": "X", "html": "

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

", "expected": false }, { "msg": "Incorrectly signed (with 3 tildes)", "title": "Talk:A", "user": "X", "html": "

Foo bar X (talk)\n

", "expected": false }, { "msg": "Incorrectly 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, with more text following on the same line)", "title": "Talk:A", "user": "X", "html": "

Foo bar X (talk) 00:01, 1 January 2020 (UTC) Ceterum censeo Carthaginem esse delendam.\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
\nFoo bar X (talk) 00:01, 1 January 2020 (UTC)\n

", "expected": true }, { "msg": "Already signed (wrapper with trailers)", "title": "Talk:A", "user": "X", "html": "

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

\n", "expected": true }, { "msg": "Incorrectly signed (wrapper, with more text following on another line)", "title": "Talk:A", "user": "X", "html": "

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

\nCeterum censeo Carthaginem esse delendam.", "expected": false }, { "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": "Incorrectly signed (multiline, with more text following on another line)", "title": "Talk:A", "user": "X", "html": "

Foo\n

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

bar\n

", "expected": false }, { "msg": "Incorrectly signed (multiline, with more text following on another line) [indented]", "title": "Talk:A", "user": "X", "html": "

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

", "expected": false } ]