2011-09-28 13:16:26 +00:00
|
|
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
2011-05-18 18:54:05 +00:00
|
|
|
|
2017-05-18 19:35:54 +00:00
|
|
|
// Test cases for MessageList markup parsing
|
2011-05-18 18:54:05 +00:00
|
|
|
|
|
|
|
const JsUnit = imports.jsUnit;
|
2023-07-10 05:19:40 +00:00
|
|
|
import Pango from 'gi://Pango';
|
2011-05-18 18:54:05 +00:00
|
|
|
|
2023-07-10 06:05:14 +00:00
|
|
|
import '../../js/ui/environment.js';
|
2011-05-18 18:54:05 +00:00
|
|
|
|
2023-07-10 05:59:46 +00:00
|
|
|
imports.ui.main; // eslint-disable-line no-unused-expressions
|
2017-05-18 19:35:54 +00:00
|
|
|
const MessageList = imports.ui.messageList;
|
2011-05-18 18:54:05 +00:00
|
|
|
|
2023-07-10 05:59:46 +00:00
|
|
|
/**
|
|
|
|
* Assert that `input`, assumed to be markup, gets "fixed" to `output`,
|
|
|
|
* which is valid markup. If `output` is null, `input` is expected to
|
|
|
|
* convert to itself
|
|
|
|
*
|
|
|
|
* @param {string} input the input
|
|
|
|
* @param {string} output the output
|
|
|
|
*/
|
2011-05-18 18:54:05 +00:00
|
|
|
function assertConverts(input, output) {
|
|
|
|
if (!output)
|
|
|
|
output = input;
|
2017-05-18 19:35:54 +00:00
|
|
|
let fixed = MessageList._fixMarkup(input, true);
|
2011-05-18 18:54:05 +00:00
|
|
|
JsUnit.assertEquals(output, fixed);
|
|
|
|
|
|
|
|
let parsed = false;
|
|
|
|
try {
|
|
|
|
Pango.parse_markup(fixed, -1, '');
|
|
|
|
parsed = true;
|
|
|
|
} catch (e) {}
|
|
|
|
JsUnit.assertEquals(true, parsed);
|
|
|
|
}
|
|
|
|
|
2023-07-10 05:59:46 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Assert that `input`, assumed to be plain text, gets escaped to `output`,
|
|
|
|
* which is valid markup.
|
|
|
|
*
|
|
|
|
* @param {string} input the input
|
|
|
|
* @param {string} output the output
|
|
|
|
*/
|
2011-05-18 18:54:05 +00:00
|
|
|
function assertEscapes(input, output) {
|
2017-05-18 19:35:54 +00:00
|
|
|
let fixed = MessageList._fixMarkup(input, false);
|
2011-05-18 18:54:05 +00:00
|
|
|
JsUnit.assertEquals(output, fixed);
|
|
|
|
|
|
|
|
let parsed = false;
|
|
|
|
try {
|
|
|
|
Pango.parse_markup(fixed, -1, '');
|
|
|
|
parsed = true;
|
|
|
|
} catch (e) {}
|
|
|
|
JsUnit.assertEquals(true, parsed);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CORRECT MARKUP
|
|
|
|
|
|
|
|
assertConverts('foo');
|
|
|
|
assertEscapes('foo', 'foo');
|
|
|
|
|
|
|
|
assertConverts('<b>foo</b>');
|
|
|
|
assertEscapes('<b>foo</b>', '<b>foo</b>');
|
|
|
|
|
|
|
|
assertConverts('something <i>foo</i>');
|
|
|
|
assertEscapes('something <i>foo</i>', 'something <i>foo</i>');
|
|
|
|
|
|
|
|
assertConverts('<u>foo</u> something');
|
|
|
|
assertEscapes('<u>foo</u> something', '<u>foo</u> something');
|
|
|
|
|
|
|
|
assertConverts('<b>bold</b> <i>italic <u>and underlined</u></i>');
|
|
|
|
assertEscapes('<b>bold</b> <i>italic <u>and underlined</u></i>', '<b>bold</b> <i>italic <u>and underlined</u></i>');
|
|
|
|
|
|
|
|
assertConverts('this & that');
|
|
|
|
assertEscapes('this & that', 'this &amp; that');
|
|
|
|
|
|
|
|
assertConverts('this < that');
|
|
|
|
assertEscapes('this < that', 'this &lt; that');
|
|
|
|
|
|
|
|
assertConverts('this < that > the other');
|
|
|
|
assertEscapes('this < that > the other', 'this &lt; that &gt; the other');
|
|
|
|
|
|
|
|
assertConverts('this <<i>that</i>>');
|
|
|
|
assertEscapes('this <<i>that</i>>', 'this &lt;<i>that</i>&gt;');
|
|
|
|
|
|
|
|
assertConverts('<b>this</b> > <i>that</i>');
|
|
|
|
assertEscapes('<b>this</b> > <i>that</i>', '<b>this</b> > <i>that</i>');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// PARTIALLY CORRECT MARKUP
|
|
|
|
// correct bits are kept, incorrect bits are escaped
|
|
|
|
|
|
|
|
// unrecognized entity
|
|
|
|
assertConverts('<b>smile</b> ☺!', '<b>smile</b> &#9786;!');
|
|
|
|
assertEscapes('<b>smile</b> ☺!', '<b>smile</b> &#9786;!');
|
|
|
|
|
|
|
|
// stray '&'; this is really a bug, but it's easier to do it this way
|
|
|
|
assertConverts('<b>this</b> & <i>that</i>', '<b>this</b> & <i>that</i>');
|
|
|
|
assertEscapes('<b>this</b> & <i>that</i>', '<b>this</b> & <i>that</i>');
|
|
|
|
|
|
|
|
// likewise with stray '<'
|
|
|
|
assertConverts('this < that', 'this < that');
|
|
|
|
assertEscapes('this < that', 'this < that');
|
|
|
|
|
|
|
|
assertConverts('<b>this</b> < <i>that</i>', '<b>this</b> < <i>that</i>');
|
|
|
|
assertEscapes('<b>this</b> < <i>that</i>', '<b>this</b> < <i>that</i>');
|
|
|
|
|
|
|
|
assertConverts('this < that > the other', 'this < that > the other');
|
|
|
|
assertEscapes('this < that > the other', 'this < that > the other');
|
|
|
|
|
|
|
|
assertConverts('this <<i>that</i>>', 'this <<i>that</i>>');
|
|
|
|
assertEscapes('this <<i>that</i>>', 'this <<i>that</i>>');
|
|
|
|
|
|
|
|
// unknown tags
|
|
|
|
assertConverts('<unknown>tag</unknown>', '<unknown>tag</unknown>');
|
|
|
|
assertEscapes('<unknown>tag</unknown>', '<unknown>tag</unknown>');
|
|
|
|
|
|
|
|
// make sure we check beyond the first letter
|
|
|
|
assertConverts('<bunknown>tag</bunknown>', '<bunknown>tag</bunknown>');
|
|
|
|
assertEscapes('<bunknown>tag</bunknown>', '<bunknown>tag</bunknown>');
|
|
|
|
|
|
|
|
// with mix of good and bad, we keep the good and escape the bad
|
|
|
|
assertConverts('<i>known</i> and <unknown>tag</unknown>', '<i>known</i> and <unknown>tag</unknown>');
|
|
|
|
assertEscapes('<i>known</i> and <unknown>tag</unknown>', '<i>known</i> and <unknown>tag</unknown>');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// FULLY INCORRECT MARKUP
|
|
|
|
// (fall back to escaping the whole thing)
|
|
|
|
|
|
|
|
// tags not matched up
|
|
|
|
assertConverts('<b>in<i>com</i>plete', '<b>in<i>com</i>plete');
|
|
|
|
assertEscapes('<b>in<i>com</i>plete', '<b>in<i>com</i>plete');
|
|
|
|
|
|
|
|
assertConverts('in<i>com</i>plete</b>', 'in<i>com</i>plete</b>');
|
|
|
|
assertEscapes('in<i>com</i>plete</b>', 'in<i>com</i>plete</b>');
|
|
|
|
|
|
|
|
// we don't support attributes, and it's too complicated to try
|
|
|
|
// to escape both start and end tags, so we just treat it as bad
|
|
|
|
assertConverts('<b>good</b> and <b style=\'bad\'>bad</b>', '<b>good</b> and <b style='bad'>bad</b>');
|
|
|
|
assertEscapes('<b>good</b> and <b style=\'bad\'>bad</b>', '<b>good</b> and <b style='bad'>bad</b>');
|
|
|
|
|
|
|
|
// this is just syntactically invalid
|
|
|
|
assertConverts('<b>unrecognized</b stuff>', '<b>unrecognized</b stuff>');
|
|
|
|
assertEscapes('<b>unrecognized</b stuff>', '<b>unrecognized</b stuff>');
|
|
|
|
|
|
|
|
// mismatched tags
|
|
|
|
assertConverts('<b>mismatched</i>', '<b>mismatched</i>');
|
|
|
|
assertEscapes('<b>mismatched</i>', '<b>mismatched</i>');
|
|
|
|
|
|
|
|
assertConverts('<b>mismatched/unknown</bunknown>', '<b>mismatched/unknown</bunknown>');
|
|
|
|
assertEscapes('<b>mismatched/unknown</bunknown>', '<b>mismatched/unknown</bunknown>');
|