Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
const { ArchiveUtils } = ChromeUtils.importESModule(
"resource:///modules/backup/ArchiveUtils.sys.mjs"
);
const string = "🌞🌞🌞🌞";
// F0 9F 8C 9E F0 9F 8C 9E F0 9F 8C 9E F0 9F 8C 9E
const buffer = new TextEncoder().encode(string);
const decoder = new TextDecoder();
add_task(async function test_no_issues_decoding_back() {
let decoded = decoder.decode(buffer);
let count = ArchiveUtils.countReplacementCharacters(decoded);
Assert.equal(
decoded,
string,
"The string should decode back to the original"
);
Assert.equal(count, 0, "There should have been no decoding issues");
});
add_task(async function test_3_replacements_if_cut_off_1() {
let decoded = decoder.decode(buffer.slice(1));
let count = ArchiveUtils.countReplacementCharacters(decoded);
Assert.equal(
count,
3,
"The three bytes of the first character should have been replaced with �"
);
Assert.equal(
decoded,
"\uFFFD\uFFFD\uFFFD🌞🌞🌞",
"The string should retain the characters that could be decoded"
);
});
add_task(async function test_2_replacements_if_cut_off_2() {
let decoded = decoder.decode(buffer.slice(2));
let count = ArchiveUtils.countReplacementCharacters(decoded);
Assert.equal(
count,
2,
"The two bytes of the first character should have been replaced with �"
);
Assert.equal(
decoded,
"\uFFFD\uFFFD🌞🌞🌞",
"The string should retain the characters that could be decoded"
);
});
add_task(async function test_1_replacement_if_cut_off_3() {
let decoded = decoder.decode(buffer.slice(3));
let count = ArchiveUtils.countReplacementCharacters(decoded);
Assert.equal(
count,
1,
"The last byte of the first character should have been replaced with �"
);
Assert.equal(
decoded,
"\uFFFD🌞🌞🌞",
"The string should retain the characters that could be decoded"
);
});
add_task(async function test_no_issues_cutting_off_whole_character() {
let decoded = decoder.decode(buffer.slice(4));
let count = ArchiveUtils.countReplacementCharacters(decoded);
Assert.equal(count, 0, "There should be no replacement characters");
Assert.equal(
decoded,
"🌞🌞🌞",
"The string should retain the characters that could be decoded"
);
});
add_task(async function test_robust_to_empty_string() {
let count = ArchiveUtils.countReplacementCharacters("");
Assert.equal(count, 0, "There should be no replacement characters");
});