Files
core2026/app/game-engine/test/nationBettingSettlement.test.ts
T

59 lines
2.4 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import {
calculateNationBettingRewards,
purifyNationBettingSelection,
} from '../src/betting/nationBettingSettlement.js';
describe('nation betting settlement', () => {
it('sorts selections and rejects duplicates', () => {
expect(purifyNationBettingSelection([2, 0, 1], 3)).toEqual([0, 1, 2]);
expect(() => purifyNationBettingSelection([1, 1], 2)).toThrow('중복된 값이 있습니다.');
});
it('distributes an exclusive pool proportionally including the system bonus', () => {
expect(
calculateNationBettingRewards({
selectCount: 1,
isExclusive: null,
winner: [0],
stakes: [
{ generalId: 0, userId: null, selection: [-1], amount: 100 },
{ generalId: 1, userId: 'one', selection: [0], amount: 100 },
{ generalId: 2, userId: 'two', selection: [1], amount: 100 },
],
})
).toEqual([{ generalId: 1, userId: 'one', amount: 300, matchPoint: 1 }]);
});
it('preserves the legacy no-refund bug when an exclusive bet has no winner', () => {
expect(
calculateNationBettingRewards({
selectCount: 1,
isExclusive: null,
winner: [0],
stakes: [{ generalId: 2, userId: 'two', selection: [1], amount: 100 }],
})
).toEqual([]);
});
it('rolls empty tiers down and assigns the remainder to the highest winning tier', () => {
const rewards = calculateNationBettingRewards({
selectCount: 3,
isExclusive: false,
winner: [0, 1, 2],
stakes: [
{ generalId: 0, userId: null, selection: [-1], amount: 400 },
{ generalId: 1, userId: 'exact', selection: [0, 1, 2], amount: 100 },
{ generalId: 2, userId: 'partial-a', selection: [0, 1, 4], amount: 100 },
{ generalId: 3, userId: 'partial-b', selection: [0, 5, 6], amount: 100 },
],
});
expect(rewards).toEqual([
{ generalId: 1, userId: 'exact', amount: 437.5, matchPoint: 3 },
{ generalId: 2, userId: 'partial-a', amount: 175, matchPoint: 2 },
{ generalId: 3, userId: 'partial-b', amount: 87.5, matchPoint: 1 },
]);
});
});