97 lines
2.6 KiB
JavaScript
97 lines
2.6 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
||
https://creativecommons.org/publicdomain/zero/1.0/ */
|
||
|
||
"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 <20>"
|
||
);
|
||
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 <20>"
|
||
);
|
||
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 <20>"
|
||
);
|
||
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");
|
||
});
|