// Run: node desktop/island/test_scene_icons.js // // Copyright (C) 2026 Danilo M. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // SceneIcons.js is a QML library, so its .pragma line is stripped before node // evaluates it. const fs = require("fs"); const assert = require("assert"); const src = fs.readFileSync(__dirname + "/SceneIcons.js", "utf8") .replace(/^\.pragma library$/m, ""); const I = new Function(src + "\nreturn { defaults, validGlyph, validMap, normalize, parse, serialize, iconFor };")(); // One code point, even when it is a surrogate pair (U+F02DC, md-home). assert.strictEqual(I.validGlyph("\u{f02dc}"), true); assert.strictEqual(I.validGlyph("a"), true); assert.strictEqual(I.validGlyph(""), false); assert.strictEqual(I.validGlyph("ab"), false); // A missing or unparseable file is the starter map, not an empty one. assert.deepStrictEqual(I.parse(""), I.defaults); assert.deepStrictEqual(I.parse("not json"), I.defaults); // A valid file is used as-is: no merge with the defaults. const one = I.parse('{"generic":"\\udb80\\uded7","scenes":{"Desktop":"\\udb80\\udf79"}}'); assert.deepStrictEqual(one, { generic: "\udb80\uded7", scenes: { Desktop: "\udb80\udf79" } }); assert.strictEqual(I.iconFor(one, "Desktop"), "\udb80\udf79"); assert.strictEqual(I.iconFor(one, "Webcam Only"), "\udb80\uded7"); // Invalid values are dropped; the generic falls back. const bad = I.parse('{"generic":"","scenes":{"A":"ab","B":"\\udb80\\udf79"}}'); assert.deepStrictEqual(bad, { generic: I.defaults.generic, scenes: { B: "\udb80\udf79" } }); // A non-string value is dropped, never passed to charCodeAt. assert.deepStrictEqual(I.parse('{"scenes":{"A":42}}'), { generic: I.defaults.generic, scenes: {} }); // normalize is what Save writes: empty generic -> default, invalid scene dropped. assert.deepStrictEqual( I.normalize({ generic: "", scenes: { A: I.defaults.scenes.Desktop, B: "ab" } }), { generic: I.defaults.generic, scenes: { A: I.defaults.scenes.Desktop } }); // Whole-draft validity: an empty generic is allowed (Save substitutes the default). assert.strictEqual(I.validMap({ generic: "", scenes: { A: "\u{f02dc}" } }), true); assert.strictEqual(I.validMap({ generic: I.defaults.generic, scenes: { A: "ab" } }), false); // Round-trip. assert.deepStrictEqual(I.parse(I.serialize(one)), one); assert.ok(I.serialize(one).endsWith("\n")); console.log("ok");