Skip to content

Commit 368885c

Browse files
committed
Expand Vietnamese number reading test cases
Added extensive test cases for various number patterns, including leading zeros, tens, hundreds, and boundary values. These improvements enhance the coverage and reliability of the Vietnamese number reading functionality. Updated logic to handle corner cases more accurately.
1 parent ea58f12 commit 368885c

File tree

2 files changed

+213
-6
lines changed

2 files changed

+213
-6
lines changed

src/read/index.test.ts

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,214 @@ describe('readVnNumber', () => {
317317
expect(readVnNumber(3121)).to.equal('ba nghìn một trăm hai mươi mốt')
318318
})
319319
})
320+
321+
describe('groups with leading zeros (0XX patterns)', () => {
322+
it('should handle 001 pattern in various positions', () => {
323+
expect(readVnNumber(1001)).to.equal('một nghìn không trăm lẻ một')
324+
expect(readVnNumber(1001001)).to.equal(
325+
'một triệu không trăm lẻ một nghìn không trăm lẻ một',
326+
)
327+
})
328+
329+
it('should handle 068 pattern (0 + tens + ones)', () => {
330+
expect(readVnNumber(1068)).to.equal('một nghìn không trăm sáu mươi tám')
331+
expect(readVnNumber(10068)).to.equal('mười nghìn không trăm sáu mươi tám')
332+
expect(readVnNumber(100068)).to.equal(
333+
'một trăm nghìn không trăm sáu mươi tám',
334+
)
335+
})
336+
337+
it('should handle 060 pattern (0 + tens + 0)', () => {
338+
expect(readVnNumber(1060)).to.equal('một nghìn không trăm sáu mươi')
339+
expect(readVnNumber(2060)).to.equal('hai nghìn không trăm sáu mươi')
340+
})
341+
342+
it('should handle 010 through 090 patterns', () => {
343+
expect(readVnNumber(1010)).to.equal('một nghìn không trăm mười')
344+
expect(readVnNumber(1020)).to.equal('một nghìn không trăm hai mươi')
345+
expect(readVnNumber(1030)).to.equal('một nghìn không trăm ba mươi')
346+
expect(readVnNumber(1090)).to.equal('một nghìn không trăm chín mươi')
347+
})
348+
349+
it('should handle 011 through 019 patterns', () => {
350+
expect(readVnNumber(1011)).to.equal('một nghìn không trăm mười một')
351+
expect(readVnNumber(1015)).to.equal('một nghìn không trăm mười lăm')
352+
expect(readVnNumber(1019)).to.equal('một nghìn không trăm mười chín')
353+
})
354+
355+
it('should handle 021, 031, etc. (0 + tens + 1 with mốt)', () => {
356+
expect(readVnNumber(1021)).to.equal('một nghìn không trăm hai mươi mốt')
357+
expect(readVnNumber(1031)).to.equal('một nghìn không trăm ba mươi mốt')
358+
expect(readVnNumber(1091)).to.equal('một nghìn không trăm chín mươi mốt')
359+
})
360+
361+
it('should handle 025, 035, etc. (0 + tens + 5 with lăm)', () => {
362+
expect(readVnNumber(1025)).to.equal('một nghìn không trăm hai mươi lăm')
363+
expect(readVnNumber(1035)).to.equal('một nghìn không trăm ba mươi lăm')
364+
expect(readVnNumber(1095)).to.equal('một nghìn không trăm chín mươi lăm')
365+
})
366+
367+
it('should handle 002 through 009 patterns', () => {
368+
expect(readVnNumber(1002)).to.equal('một nghìn không trăm lẻ hai')
369+
expect(readVnNumber(1003)).to.equal('một nghìn không trăm lẻ ba')
370+
expect(readVnNumber(1005)).to.equal('một nghìn không trăm lẻ năm')
371+
expect(readVnNumber(1009)).to.equal('một nghìn không trăm lẻ chín')
372+
})
373+
})
374+
375+
describe('all tens patterns (X0, X1-X9)', () => {
376+
it('should handle all X0 patterns correctly', () => {
377+
expect(readVnNumber(10)).to.equal('mười')
378+
expect(readVnNumber(20)).to.equal('hai mươi')
379+
expect(readVnNumber(30)).to.equal('ba mươi')
380+
expect(readVnNumber(40)).to.equal('bốn mươi')
381+
expect(readVnNumber(50)).to.equal('năm mươi')
382+
expect(readVnNumber(60)).to.equal('sáu mươi')
383+
expect(readVnNumber(70)).to.equal('bảy mươi')
384+
expect(readVnNumber(80)).to.equal('tám mươi')
385+
expect(readVnNumber(90)).to.equal('chín mươi')
386+
})
387+
388+
it('should handle all X1 patterns correctly', () => {
389+
expect(readVnNumber(11)).to.equal('mười một')
390+
expect(readVnNumber(21)).to.equal('hai mươi mốt')
391+
expect(readVnNumber(31)).to.equal('ba mươi mốt')
392+
expect(readVnNumber(41)).to.equal('bốn mươi mốt')
393+
expect(readVnNumber(51)).to.equal('năm mươi mốt')
394+
expect(readVnNumber(61)).to.equal('sáu mươi mốt')
395+
expect(readVnNumber(71)).to.equal('bảy mươi mốt')
396+
expect(readVnNumber(81)).to.equal('tám mươi mốt')
397+
expect(readVnNumber(91)).to.equal('chín mươi mốt')
398+
})
399+
400+
it('should handle all X5 patterns correctly', () => {
401+
expect(readVnNumber(15)).to.equal('mười lăm')
402+
expect(readVnNumber(25)).to.equal('hai mươi lăm')
403+
expect(readVnNumber(35)).to.equal('ba mươi lăm')
404+
expect(readVnNumber(45)).to.equal('bốn mươi lăm')
405+
expect(readVnNumber(55)).to.equal('năm mươi lăm')
406+
expect(readVnNumber(65)).to.equal('sáu mươi lăm')
407+
expect(readVnNumber(75)).to.equal('bảy mươi lăm')
408+
expect(readVnNumber(85)).to.equal('tám mươi lăm')
409+
expect(readVnNumber(95)).to.equal('chín mươi lăm')
410+
})
411+
412+
it('should handle X2, X3, X4, X6, X7, X8, X9 patterns', () => {
413+
expect(readVnNumber(22)).to.equal('hai mươi hai')
414+
expect(readVnNumber(33)).to.equal('ba mươi ba')
415+
expect(readVnNumber(44)).to.equal('bốn mươi bốn')
416+
expect(readVnNumber(66)).to.equal('sáu mươi sáu')
417+
expect(readVnNumber(77)).to.equal('bảy mươi bảy')
418+
expect(readVnNumber(88)).to.equal('tám mươi tám')
419+
expect(readVnNumber(99)).to.equal('chín mươi chín')
420+
})
421+
})
422+
423+
describe('hundreds patterns (X00, X01-X09, X10-X99)', () => {
424+
it('should handle all X00 patterns', () => {
425+
expect(readVnNumber(100)).to.equal('một trăm')
426+
expect(readVnNumber(200)).to.equal('hai trăm')
427+
expect(readVnNumber(300)).to.equal('ba trăm')
428+
expect(readVnNumber(400)).to.equal('bốn trăm')
429+
expect(readVnNumber(500)).to.equal('năm trăm')
430+
expect(readVnNumber(600)).to.equal('sáu trăm')
431+
expect(readVnNumber(700)).to.equal('bảy trăm')
432+
expect(readVnNumber(800)).to.equal('tám trăm')
433+
expect(readVnNumber(900)).to.equal('chín trăm')
434+
})
435+
436+
it('should handle all X01-X09 patterns with "lẻ"', () => {
437+
expect(readVnNumber(101)).to.equal('một trăm lẻ một')
438+
expect(readVnNumber(202)).to.equal('hai trăm lẻ hai')
439+
expect(readVnNumber(303)).to.equal('ba trăm lẻ ba')
440+
expect(readVnNumber(404)).to.equal('bốn trăm lẻ bốn')
441+
expect(readVnNumber(505)).to.equal('năm trăm lẻ năm')
442+
expect(readVnNumber(606)).to.equal('sáu trăm lẻ sáu')
443+
expect(readVnNumber(707)).to.equal('bảy trăm lẻ bảy')
444+
expect(readVnNumber(808)).to.equal('tám trăm lẻ tám')
445+
expect(readVnNumber(909)).to.equal('chín trăm lẻ chín')
446+
})
447+
448+
it('should handle X10 patterns', () => {
449+
expect(readVnNumber(110)).to.equal('một trăm mười')
450+
expect(readVnNumber(210)).to.equal('hai trăm mười')
451+
expect(readVnNumber(310)).to.equal('ba trăm mười')
452+
expect(readVnNumber(910)).to.equal('chín trăm mười')
453+
})
454+
455+
it('should handle X11-X19 patterns', () => {
456+
expect(readVnNumber(111)).to.equal('một trăm mười một')
457+
expect(readVnNumber(215)).to.equal('hai trăm mười lăm')
458+
expect(readVnNumber(319)).to.equal('ba trăm mười chín')
459+
})
460+
461+
it('should handle X21, X31, etc. with "mốt"', () => {
462+
expect(readVnNumber(121)).to.equal('một trăm hai mươi mốt')
463+
expect(readVnNumber(231)).to.equal('hai trăm ba mươi mốt')
464+
expect(readVnNumber(341)).to.equal('ba trăm bốn mươi mốt')
465+
})
466+
467+
it('should handle X25, X35, etc. with "lăm"', () => {
468+
expect(readVnNumber(125)).to.equal('một trăm hai mươi lăm')
469+
expect(readVnNumber(235)).to.equal('hai trăm ba mươi lăm')
470+
expect(readVnNumber(345)).to.equal('ba trăm bốn mươi lăm')
471+
})
472+
})
473+
474+
describe('mixed magnitude numbers', () => {
475+
it('should handle numbers spanning all magnitudes', () => {
476+
expect(readVnNumber(1234)).to.equal('một nghìn hai trăm ba mươi bốn')
477+
expect(readVnNumber(12345)).to.equal(
478+
'mười hai nghìn ba trăm bốn mươi lăm',
479+
)
480+
expect(readVnNumber(123456)).to.equal(
481+
'một trăm hai mươi ba nghìn bốn trăm năm mươi sáu',
482+
)
483+
expect(readVnNumber(1234567)).to.equal(
484+
'một triệu hai trăm ba mươi bốn nghìn năm trăm sáu mươi bảy',
485+
)
486+
expect(readVnNumber(12345678)).to.equal(
487+
'mười hai triệu ba trăm bốn mươi lăm nghìn sáu trăm bảy mươi tám',
488+
)
489+
expect(readVnNumber(123456789)).to.equal(
490+
'một trăm hai mươi ba triệu bốn trăm năm mươi sáu nghìn bảy trăm tám mươi chín',
491+
)
492+
})
493+
494+
it('should handle numbers with zeros in different positions', () => {
495+
expect(readVnNumber(100001)).to.equal('một trăm nghìn không trăm lẻ một')
496+
expect(readVnNumber(1000010)).to.equal('một triệu không trăm mười')
497+
expect(readVnNumber(10000100)).to.equal('mười triệu một trăm')
498+
})
499+
})
500+
501+
describe('boundary values', () => {
502+
it('should handle single digit boundaries', () => {
503+
expect(readVnNumber(9)).to.equal('chín')
504+
})
505+
506+
it('should handle two digit boundaries', () => {
507+
expect(readVnNumber(99)).to.equal('chín mươi chín')
508+
})
509+
510+
it('should handle three digit boundaries', () => {
511+
expect(readVnNumber(999)).to.equal('chín trăm chín mươi chín')
512+
})
513+
514+
it('should handle thousand boundaries', () => {
515+
expect(readVnNumber(9999)).to.equal('chín nghìn chín trăm chín mươi chín')
516+
})
517+
518+
it('should handle million boundaries', () => {
519+
expect(readVnNumber(999999)).to.equal(
520+
'chín trăm chín mươi chín nghìn chín trăm chín mươi chín',
521+
)
522+
})
523+
524+
it('should handle billion boundaries', () => {
525+
expect(readVnNumber(999999999)).to.equal(
526+
'chín trăm chín mươi chín triệu chín trăm chín mươi chín nghìn chín trăm chín mươi chín',
527+
)
528+
})
529+
})
320530
})

src/read/index.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,10 @@ export function readVnNumber(number: string | number | bigint): string {
189189
} else {
190190
parts.push(`${groupReading} nghìn`)
191191
}
192+
} else if (needsBillionSuffix) { // Units
193+
parts.push(`${groupReading} tỷ`)
192194
} else {
193-
// Units
194-
if (needsBillionSuffix) {
195-
parts.push(`${groupReading} tỷ`)
196-
} else {
197-
parts.push(groupReading)
198-
}
195+
parts.push(groupReading)
199196
}
200197
}
201198
}

0 commit comments

Comments
 (0)