var assert = require("node:assert/strict"); var fs = require("node:fs"); var path = require("node:path"); var test = require("node:test"); var url = require("node:url"); var sourcePath = path.join(__dirname, "..", "lib", "public", "modules", "avatar-imprint.js"); function loadModule() { var source = fs.readFileSync(sourcePath, "utf8"); return import("data:text/javascript;base64," + Buffer.from(source).toString("base64")); } test("Clay Imprints are deterministic and preserve the requested size", async function () { var module = await loadModule(); var first = module.imprintSvg({ style: "thumbs", seed: "sample-user", size: 24, color: "#7c3aed" }); var second = module.imprintSvg({ style: "thumbs", seed: "sample-user", size: 24, color: "#7c3aed" }); assert.equal(first, second); assert.match(first, /width="24" height="24"/); assert.match(first, /viewBox="0 0 7 7"/); assert.match(first, /stroke-width="0\.08"/); }); test("legacy avatar choices remain part of the identity hash", async function () { var module = await loadModule(); var thumbs = module.imprintSvg({ style: "thumbs", seed: "same-user", size: 64, color: "#5857fc" }); var bots = module.imprintSvg({ style: "bottts", seed: "same-user", size: 64, color: "#5857fc" }); var imprint = module.imprintSvg({ style: "imprint", seed: "same-user", size: 64, color: "#5857fc" }); assert.notEqual(thumbs, bots); assert.notEqual(thumbs, imprint); }); test("pixel avatars are symmetric and ignore caller color overrides", async function () { var module = await loadModule(); var purple = module.imprintSvg({ style: "imprint", seed: "sample-user", size: 64, color: "#7c3aed" }); var green = module.imprintSvg({ style: "imprint", seed: "sample-user", size: 64, color: "#07e5a3" }); assert.equal(purple, green); assert.match(purple, /viewBox="0 0 7 7"/); assert.match(purple, /shape-rendering="crispEdges"/); assert.doesNotMatch(purple, /#5857fc|#07e5a3/); var cells = module.identiconCells(123456); for (var i = 0; i < cells.length; i++) { assert.ok(cells.some(function (cell) { return cell[0] === 4 - cells[i][0] && cell[1] === cells[i][1]; })); } assert.doesNotMatch(purple, /A<\/text>/); assert.match(buzz, />B<\/text>/); assert.doesNotMatch(arch, /fill="#333330"/); assert.doesNotMatch(buzz, /fill="#333330"/); assert.notEqual(arch, module.imprintSvg({ seed: "Arch", size: 64 })); }); test("built-in Mate initials map to distinct muted source colors", async function () { var module = await loadModule(); var expected = { Arch: "#8a806a", Rush: "#887b91", Ward: "#6f8382", Pixel: "#92756d", Buzz: "#6f7489", }; var names = Object.keys(expected); for (var i = 0; i < names.length; i++) { var result = module.mateMarkSvg({ seed: names[i], size: 64 }); assert.match(result, new RegExp(expected[names[i]])); assert.doesNotMatch(result, /#5857fc|#07e5a3/); } }); test("Clay Mate marks are deterministic local SVG data URLs", async function () { var module = await loadModule(); var first = module.mateMarkDataUrl({ seed: "reviewer", size: 32 }); var second = module.mateMarkDataUrl({ seed: "reviewer", size: 32 }); assert.equal(first, second); assert.match(first, /^data:image\/svg\+xml;charset=utf-8,/); assert.doesNotMatch(first, /https?:/i); });