Files
Wegwichtel/test/group-symbols.test.js
Florian Zumpe aff88eba1b
Sonarqube Scanner / Prepare environment (push) Successful in 20s
Sonarqube Scanner / Build and test (push) Failing after 36s
Sonarqube Scanner / SonarQube analysis (push) Skipped
Sonarqube Scanner / Deploy to Server (push) Successful in 9s
Internationalization
2026-10-01 09:41:01 +02:00

53 lines
2.4 KiB
JavaScript

import { loadI18n } from '../test-support/i18n.js';
import assert from 'node:assert/strict';
import fs from 'node:fs/promises';
import path from 'node:path';
import test from 'node:test';
import vm from 'node:vm';
const root = path.resolve(import.meta.dirname, '..');
async function catalogue(namespace) {
const filename = path.join(root, 'public/js/group-symbols.js');
const context = { Wegwichtel: namespace };
context.globalThis = context;
await loadI18n(context);
vm.runInNewContext(await fs.readFile(filename, 'utf8'), context, { filename });
return context.Wegwichtel.GroupSymbols;
}
test('group motifs resolve all nine configured Unicode symbols to existing PNG assets', async () => {
const existing = { Config: { apiBase: '/api' } };
const symbols = await catalogue(existing);
assert.equal(existing.Config.apiBase, '/api');
const expected = ['🪵', '🪨', '🏮', '🌼', '🚬', '🐦', '🍄', '🍓', '🎃'];
assert.deepEqual(Array.from(symbols.list(), entry => entry.unicode), expected);
assert.equal(new Set(symbols.list().map(entry => entry.unicode)).size, 9);
for (const entry of symbols.list()) {
assert.equal(symbols.get(entry.unicode), entry);
assert.equal(symbols.has(entry.unicode), true);
assert.equal(symbols.imageUrl(entry.unicode), entry.imageUrl);
assert.equal(entry.imageUrl, `/images/group-symbols/${entry.unicode}.png`);
assert.ok(entry.label.length > 0);
const png = await fs.readFile(path.join(root, 'public', entry.imageUrl));
assert.deepEqual(png.subarray(0, 8), Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]));
assert.equal(Object.isFrozen(entry), true);
}
assert.equal(Object.isFrozen(symbols.list()), true);
assert.throws(() => { symbols.list()[0].label = 'changed'; }, TypeError);
assert.throws(() => symbols.list().push({}), { name: 'TypeError' });
});
test('Unicode presentation selectors resolve to one motif and invalid inputs stay unknown', async () => {
const symbols = await catalogue();
for (const base of ['🪵', '🪨', '🏮', '🌼', '🚬', '🐦', '🍄', '🍓', '🎃']) {
assert.equal(symbols.get(base), symbols.get(`${base}\uFE0F`));
assert.equal(symbols.get(base), symbols.get(`${base}\uFE0E`));
}
for (const value of ['', '🪵🪨', 'unknown', ' 🪵 ', null, undefined, 42, {}]) {
assert.equal(symbols.get(value), null);
assert.equal(symbols.imageUrl(value), null);
assert.equal(symbols.has(value), false);
}
});