45 lines
2.5 KiB
TypeScript
45 lines
2.5 KiB
TypeScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { readFileSync } from 'node:fs';
|
|
import { leaderOutfitCards } from './leader-outfits.ts';
|
|
import { calculateUnitPower, type UnitPowerCard } from './unit-power.ts';
|
|
|
|
function outfitCard(id: string, rarity: number, name: string, characterId = 'leader') {
|
|
return { id, rarity, characterId, details: { costume: { name, description: '전원의 전체 파라미터가 35% UP' } } };
|
|
}
|
|
|
|
test('리더의 4·5성 의상만 선택하고 기존 5성 순서와 이름 중복 제거를 유지한다', () => {
|
|
const cards = [outfitCard('four', 4, '드리미 드롭'), outfitCard('five', 5, '기본 의상'),
|
|
outfitCard('duplicate', 5, '기본 의상'), outfitCard('other', 4, '다른 멤버', 'other'),
|
|
outfitCard('three', 3, '제외'), { ...outfitCard('none', 4, ''), details: { costume: null } }];
|
|
assert.deepEqual(leaderOutfitCards(cards, 'leader').map((card) => card.id), ['five', 'four']);
|
|
assert.deepEqual(leaderOutfitCards(cards, 'unknown'), []);
|
|
assert.equal(cards[0].id, 'four');
|
|
});
|
|
|
|
test('4성 의상만 있는 멤버도 선택할 수 있다', () => {
|
|
assert.equal(leaderOutfitCards([outfitCard('four', 4, '드리미 드롭')], 'leader')[0].id, 'four');
|
|
});
|
|
|
|
test('실제 4성 의상을 선택해 파라미터와 스코어 서포트에 반영한다', () => {
|
|
type DataCard = ReturnType<typeof outfitCard>;
|
|
const { cards }: { cards: DataCard[] } = JSON.parse(readFileSync(new URL('../data/cards-summary.json', import.meta.url), 'utf8'));
|
|
const outfits = cards.filter((card) => card.rarity === 4 && card.details.costume);
|
|
assert.ok(outfits.length > 0);
|
|
for (const card of outfits) {
|
|
assert.ok(leaderOutfitCards(cards, card.characterId).some((option) => option.id === card.id));
|
|
}
|
|
const members = ['a', 'b', 'c', 'd', 'e'].map((id) => ({
|
|
card: { id, characterId: id, name: id, type: '큐트', generation: '0기생',
|
|
power: { maxLevel: 80, statsAtMaxLevel: { performance: 100, technique: 100, sense: 100 } },
|
|
details: { passive: [] } } satisfies UnitPowerCard,
|
|
awakening: 0
|
|
}));
|
|
const parameter = outfits.find((card) => card.details.costume.description.trim() === '전원의 전체 파라미터가 35% UP');
|
|
assert.ok(parameter);
|
|
assert.equal(calculateUnitPower(members, parameter.details.costume).outfitTotal, 525);
|
|
const support = outfits.find((card) => card.details.costume.description.trim() === '전원의 스코어 서포트 효과 50%');
|
|
assert.ok(support);
|
|
assert.equal(calculateUnitPower(members, support.details.costume).outfitScoreSupportPercent, 50);
|
|
});
|