bend_puzzle/test/economy-simulation-test.js

22 lines
1.8 KiB
JavaScript
Raw Normal View History

2026-07-30 15:13:53 +09:00
'use strict';
const {assert,loadAppLogic}=require('./helpers/app-source');
const AppLogic=loadAppLogic(),samples=[],storeCoefficients=[];
for(let seed=1;seed<=5000;seed++){
const level=1+(seed%10),baseScore=20+level*level*4,meta={id:`B${seed}`,seed,generatorVersion:5},
state={paths:[{startGate:0,endGate:1,cells:[[0,0],[0,1],[1,1],[1,2]]}]},
reward=AppLogic.deterministicBoardReward(baseScore,{worldSeed:0x51a7f00d,meta,state});
assert(reward.coefficient>=.8&&reward.coefficient<=1.2,'Board coefficient escaped its bound');
samples.push(reward.award);
const prices=[700,1400,1800,2400].map(base=>AppLogic.deterministicStorePrice(base,0x51a7f00d,seed%97,Math.floor(seed/97),1));
assert(prices.every(entry=>entry.coefficient===prices[0].coefficient),'Products in one store received different coefficients');
storeCoefficients.push(prices[0].coefficient);
}
const mean=values=>values.reduce((sum,value)=>sum+value,0)/values.length,
rewardMean=mean(samples),storeMean=mean(storeCoefficients);
assert(storeMean>.99&&storeMean<1.01,'Store coefficient distribution is materially biased');
assert(rewardMean>100&&rewardMean<230,'Reward rebalance left the measured progression band');
assert(700<1400&&1400<1800&&1800<2400,'Cosmetics/lens/field price ladder is invalid');
assert(1400/rewardMean>5&&1400/rewardMean<15,'Score lens is either trivial or effectively mandatory');
assert(2400/rewardMean<24,'MAX field is outside a meaningful attainable score-sink range');
assert(AppLogic.deterministicBoardReward(100,{meta:{id:'B1',seed:1,generatorVersion:5},state:{paths:[]},scoreLensCount:100}).lensMultiplier===1.5,'Repeated lenses create unbounded score inflation');
console.log(`Economy simulation passed: mean reward ${rewardMean.toFixed(2)}, mean coefficient ${storeMean.toFixed(4)}`);