import assert from "node:assert/strict"; import test from "node:test"; import { estimateFeature, membershipCost, weightedAverageMessages } from "../src/lib/pricing-simulation.ts"; const metric = (value: number | null) => ({ runs: value === null ? 0 : 1, avg: value, p50: value, p95: value, max: value }); test("normalizes a distribution whose weights do not sum to one", () => { assert.equal(weightedAverageMessages([{ weight: 1, monthlyMessages: 10 }, { weight: 1, monthlyMessages: 20 }]), 15); }); test("billingLimit null is explicitly unlimited rather than zero", () => { const result = membershipCost([{ weight: 1, monthlyMessages: 10 }], 2, null); assert.equal(result.worstCostCny, null); assert.equal(result.unlimitedWorstCase, true); }); test("zero model prices remain a measured zero cost", () => { const result = estimateFeature({ featureKey: "chat.standard", creditCost: 10, usdToCny: 7, model: { modelTier: "standard", inputCostMicrousdPerMillion: 0, outputCostMicrousdPerMillion: 0 }, usage: { hasData: true, metrics: { costMicrousd: metric(0), inputTokens: metric(100), outputTokens: metric(20), durationMs: metric(1000) } }, }); assert.equal(result.costMicrousd, 0); assert.equal(result.costCny, 0); assert.equal(result.marginPercent, 100); assert.equal(result.source, "ledger"); }); test("ledger with no data is not silently converted to zero", () => { const result = estimateFeature({ featureKey: "report.full", creditCost: null, usdToCny: 7, model: null, usage: { hasData: false, metrics: { costMicrousd: metric(null), inputTokens: metric(null), outputTokens: metric(null), durationMs: metric(null) } }, }); assert.equal(result.costMicrousd, null); assert.equal(result.source, "unavailable"); });