Files
PrismMaze/tests/profile/profile.test.cjs

27 lines
2.2 KiB
JavaScript

const fs = require('fs'), vm = require('vm'), assert = require('assert').strict;
const ts = require('C:/ProgramData/cocos/editors/Creator/3.8.7/resources/app.asar.unpacked/node_modules/typescript');
const data = new Map(); let current = { username: 'player001' }, fail = false;
const store = { get length(){ return data.size; }, key: i => [...data.keys()][i], getItem: k => data.get(k) ?? null,
setItem: (k, v) => { if(fail) throw Error('storage unavailable'); data.set(k,v); } };
function load(){const exports={};vm.runInNewContext(ts.transpileModule(fs.readFileSync('assets/games/profile/ProfileData.ts','utf8'),
// Exercise legacy array-only spread lowering used by mini-game builds.
{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES5,downlevelIteration:false}}).outputText,
{exports,require: p => p==='cc'?{sys:{localStorage:store}}:{authService:()=>({requireSession:()=>{if(!current)throw Error('login required');return current}})}});return exports;}
const profile=load();
assert.equal(profile.playerName('player001'),'player001');
assert.equal(profile.playerName('星河旅人'),'星河旅人');
data.set('prism.profile.player001','旧昵称');
assert.equal(load().playerName('player001'),'player001');
assert.equal(profile.savePlayerName,undefined);
current={username:'player002'};
data.set('prism.auth.save.player001',JSON.stringify({baseData:{maxScore:900}}));
data.set('prism.auth.save.player002',JSON.stringify({baseData:{maxScore:1200}}));
data.set('prism.auth.save.corrupt','invalid');
data.set('prism.auth.save.negative',JSON.stringify({baseData:{maxScore:-1}}));
let rank=profile.localRanking();assert.equal(rank.list.length,62);assert.equal(rank.my.rank,60);assert.equal(rank.my.score,1200);
current={username:'player001'};rank=profile.localRanking();assert.equal(rank.my.nickname,'player001');assert.equal(rank.my.rank,61);
current=null;assert.throws(()=>profile.localRanking());
const ui=fs.readFileSync('assets/games/profile/ProfileUI.ts','utf8');
assert.ok(!/EditBox|ProfileDialog|Button.EventType.CLICK|savePlayerName/.test(ui));
console.log('PASS: registration names, legacy nickname ignored, preserved opponents, score sorting and display-only profile');