test(morse): add missing coverage for DEFAULT_WPM, DEFAULT_TIMING, and derived timing fields
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,8 @@ import {
|
||||
NOVICE_LETTERS,
|
||||
OPERATOR_WORDS,
|
||||
wpmToTiming,
|
||||
DEFAULT_WPM,
|
||||
DEFAULT_TIMING,
|
||||
validatePhrase,
|
||||
pickChallenge,
|
||||
} from './morse'
|
||||
@@ -37,6 +39,13 @@ describe('OPERATOR_WORDS', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('DEFAULT_WPM and DEFAULT_TIMING', () => {
|
||||
it('DEFAULT_WPM is 10', () => expect(DEFAULT_WPM).toBe(10))
|
||||
it('DEFAULT_TIMING equals wpmToTiming(10)', () => {
|
||||
expect(DEFAULT_TIMING).toEqual(wpmToTiming(10))
|
||||
})
|
||||
})
|
||||
|
||||
describe('wpmToTiming', () => {
|
||||
it('10 WPM gives dot=120ms', () => {
|
||||
expect(wpmToTiming(10).dot).toBe(120)
|
||||
@@ -48,6 +57,18 @@ describe('wpmToTiming', () => {
|
||||
it('20 WPM gives dot=60ms', () => {
|
||||
expect(wpmToTiming(20).dot).toBe(60)
|
||||
})
|
||||
it('elementGap equals dot', () => {
|
||||
const t = wpmToTiming(10)
|
||||
expect(t.elementGap).toBe(t.dot)
|
||||
})
|
||||
it('charGap is 3x dot', () => {
|
||||
const t = wpmToTiming(10)
|
||||
expect(t.charGap).toBe(t.dot * 3)
|
||||
})
|
||||
it('wordGap is 7x dot', () => {
|
||||
const t = wpmToTiming(10)
|
||||
expect(t.wordGap).toBe(t.dot * 7)
|
||||
})
|
||||
})
|
||||
|
||||
describe('validatePhrase', () => {
|
||||
|
||||
@@ -85,7 +85,7 @@ export function pickChallenge(
|
||||
|
||||
const weights = available.map(item => {
|
||||
const s = stats[item]
|
||||
if (!s || s.attempts === 0) return 2
|
||||
if (!s || s.attempts === 0) return 2 // unseen: prioritise over even 0%-accuracy items
|
||||
const accuracy = s.correct / s.attempts
|
||||
return Math.max(0.1, 1 - accuracy) + 0.1
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user