Skip to content

src/input.test.ts

21 lines · 1.3 KB · TypeScript
Raw
import assert from 'node:assert/strict'
import test from 'node:test'
import { oneOf } from './input.ts'

test('oneOf matches case-insensitively and returns the canonical spelling', () => {
	const difficulties = ['Easy', 'Medium', 'Hard'] as const
	assert.equal(oneOf({ difficulty: 'medium' }, 'difficulty', difficulties, 'x'), 'Medium')
	assert.equal(oneOf({ difficulty: ' HARD ' }, 'difficulty', difficulties, 'x'), 'Hard')
	assert.equal(oneOf({ d: 'Accepted' }, 'd', ['ignored', 'accepted'] as const, 'x'), 'accepted')
	assert.equal(oneOf({}, 'difficulty', difficulties, 'x'), undefined)
	assert.throws(() => oneOf({ d: 'done' }, 'd', ['ignored', 'skipped', 'wontfix', 'accepted'] as const, 'x', true), /must be one of ignored \| skipped \| wontfix \| accepted; got "done"/)
})

test('oneOf canonicalizes risk and disposition casing the same way', () => {
	assert.equal(oneOf({ risk: 'MEDIUM' }, 'risk', ['low', 'medium', 'high'] as const, 'x', true), 'medium')
	assert.equal(oneOf({ disposition: 'WONTFIX' }, 'disposition', ['ignored', 'skipped', 'wontfix', 'accepted'] as const, 'x', true), 'wontfix')
	assert.throws(
		() => oneOf({ difficulty: 'extreme' }, 'difficulty', ['Easy', 'Medium', 'Hard'] as const, 'send-summary', true),
		/must be one of Easy \| Medium \| Hard; got "extreme"/,
	)
})