import test from 'node:test'; import assert from 'node:assert/strict'; import { parseBetInput } from '../src/parser.js'; test('parses labeled multiline input in any order', () => { const parsed = parseBetInput({ stake: '$25', odds: '-110', prop: 'Jayson Tatum over 29.5 points', book: 'FanDuel', sport: 'NBA', }); assert.equal(parsed.ok, true); assert.equal(parsed.bet.book, 'FanDuel'); assert.equal(parsed.bet.oddsInput, '-110'); assert.equal(parsed.bet.stake, 25); }); test('parses decimal or american odds from structured fields', () => { const parsed = parseBetInput({ stake: '20', odds: '+135', prop: 'Celtics ML', book: 'DraftKings', sport: 'NBA', }); assert.equal(parsed.ok, true); assert.equal(parsed.bet.book, 'DraftKings'); assert.equal(parsed.bet.oddsInput, '+135'); assert.equal(parsed.bet.stake, 20); assert.match(parsed.bet.prop, /Celtics ML/i); }); test('accepts larger decimal odds values', () => { const parsed = parseBetInput({ stake: '10', odds: '11.0', prop: 'JJ WetherGoat 1+ HR', book: 'BetMGM', sport: 'MLB', }); assert.equal(parsed.ok, true); assert.equal(parsed.bet.oddsInput, '11.0'); assert.equal(parsed.bet.normalizedDecimalOdds, 11); }); test('accepts large american odds values', () => { const parsed = parseBetInput({ stake: '$2.50', odds: '+119484', prop: '4 leg home run parlay', book: 'FanDuel', sport: 'MLB', }); assert.equal(parsed.ok, true); assert.equal(parsed.bet.oddsInput, '+119484'); assert.equal(parsed.bet.stake, 2.5); assert.equal(parsed.bet.normalizedDecimalOdds, 1195.84); }); test('reports missing fields for incomplete input', () => { const parsed = parseBetInput({ stake: '', odds: '', prop: 'Knicks ML', book: 'FanDuel', sport: 'NBA', }); assert.equal(parsed.ok, false); assert.deepEqual(parsed.missingFields.sort(), ['odds', 'stake']); });