UNPKG

@bible-help/bible-book-data

Version:

Get the books of the Bible, their OSIS codes, and their chapters and verses.

271 lines (231 loc) 11.1 kB
import { bookNameToOsisBook, osisBookToBookName, isValidOsisBook, getAllOsisBooks, getAllBookNames, replaceBookNamesWithOsis } from './book-data.js'; describe('bookNameToOsisBook', () => { test('should return null for empty or null input', () => { expect(bookNameToOsisBook(null)).toBe(null); expect(bookNameToOsisBook('')).toBe(null); expect(bookNameToOsisBook(' ')).toBe(null); }); test('should convert standard book names to OSIS format', () => { expect(bookNameToOsisBook('Genesis')).toBe('Gen'); expect(bookNameToOsisBook('Exodus')).toBe('Exod'); expect(bookNameToOsisBook('1 Samuel')).toBe('1Sam'); expect(bookNameToOsisBook('2 Kings')).toBe('2Kgs'); expect(bookNameToOsisBook('Revelation')).toBe('Rev'); }); test('should handle case-insensitive input', () => { expect(bookNameToOsisBook('genesis')).toBe('Gen'); expect(bookNameToOsisBook('EXODUS')).toBe('Exod'); expect(bookNameToOsisBook('psalms')).toBe('Ps'); }); test('should handle book names with extra whitespace', () => { expect(bookNameToOsisBook(' Genesis ')).toBe('Gen'); expect(bookNameToOsisBook('\tExodus\n')).toBe('Exod'); }); test('should handle book names with colons and periods', () => { expect(bookNameToOsisBook('Genesis:1')).toBe('Gen'); expect(bookNameToOsisBook('Exodus.1')).toBe('Exod'); expect(bookNameToOsisBook('Leviticus 1')).toBe('Lev'); }); test('should handle osis references', () => { expect(bookNameToOsisBook('Gen.1.1')).toBe('Gen'); expect(bookNameToOsisBook('Exod.1-Exod.2')).toBe('Exod'); expect(bookNameToOsisBook('Heb.1.1-5')).toBe('Heb'); }); test('should handle overrides for common misspellings', () => { expect(bookNameToOsisBook('Phillipians')).toBe('Phil'); expect(bookNameToOsisBook('Philipians')).toBe('Phil'); expect(bookNameToOsisBook('Philippians')).toBe('Phil'); expect(bookNameToOsisBook('1Corinthians')).toBe('1Cor'); expect(bookNameToOsisBook('2Corinthians')).toBe('2Cor'); }); test('should handle short forms and abbreviations', () => { expect(bookNameToOsisBook('Act')).toBe('Acts'); expect(bookNameToOsisBook('Pss')).toBe('Ps'); expect(bookNameToOsisBook('Psa')).toBe('Ps'); expect(bookNameToOsisBook('Jam')).toBe('Jas'); }); test('should return null for invalid book names', () => { expect(bookNameToOsisBook('InvalidBook')).toBe(null); expect(bookNameToOsisBook('123')).toBe(null); expect(bookNameToOsisBook('Random Text')).toBe(null); }); }); describe('osisBookToBookName', () => { test('should return null for empty or null input', () => { expect(osisBookToBookName(null)).toBe(null); expect(osisBookToBookName('')).toBe(null); expect(osisBookToBookName(' ')).toBe(null); }); test('should convert OSIS codes to full book names', () => { expect(osisBookToBookName('Gen')).toBe('Genesis'); expect(osisBookToBookName('Exod')).toBe('Exodus'); expect(osisBookToBookName('1Sam')).toBe('1 Samuel'); expect(osisBookToBookName('2Kgs')).toBe('2 Kings'); expect(osisBookToBookName('Rev')).toBe('Revelation'); }); test('should handle OSIS codes with extra whitespace', () => { expect(osisBookToBookName(' Gen ')).toBe('Genesis'); expect(osisBookToBookName('\tExod\n')).toBe('Exodus'); }); test('should return null for invalid OSIS codes', () => { expect(osisBookToBookName('InvalidOsis')).toBe(null); expect(osisBookToBookName('123')).toBe(null); expect(osisBookToBookName('GEN')).toBe(null); }); }); describe('isValidOsisBook', () => { test('should return false for empty or null input', () => { expect(isValidOsisBook(null)).toBe(false); expect(isValidOsisBook('')).toBe(false); expect(isValidOsisBook(' ')).toBe(false); }); test('should return true for valid OSIS codes', () => { expect(isValidOsisBook('Gen')).toBe(true); expect(isValidOsisBook('Exod')).toBe(true); expect(isValidOsisBook('1Sam')).toBe(true); expect(isValidOsisBook('2Kgs')).toBe(true); expect(isValidOsisBook('Rev')).toBe(true); }); test('should handle OSIS codes with extra whitespace', () => { expect(isValidOsisBook(' Gen ')).toBe(true); expect(isValidOsisBook('\tExod\n')).toBe(true); }); test('should return false for invalid OSIS codes', () => { expect(isValidOsisBook('InvalidOsis')).toBe(false); expect(isValidOsisBook('123')).toBe(false); expect(isValidOsisBook('GEN')).toBe(false); expect(isValidOsisBook('genesis')).toBe(false); }); }); describe('getAllOsisBooks', () => { test('should return an array of all OSIS book codes', () => { const osisBooks = getAllOsisBooks(); expect(Array.isArray(osisBooks)).toBe(true); expect(osisBooks.length).toBeGreaterThan(0); expect(osisBooks).toContain('Gen'); expect(osisBooks).toContain('Exod'); expect(osisBooks).toContain('Rev'); }); test('should return a copy of the array (not reference)', () => { const osisBooks1 = getAllOsisBooks(); const osisBooks2 = getAllOsisBooks(); expect(osisBooks1).not.toBe(osisBooks2); expect(osisBooks1).toEqual(osisBooks2); }); test('should contain 66 books (standard Bible)', () => { const osisBooks = getAllOsisBooks(); expect(osisBooks.length).toBe(66); }); }); describe('getAllBookNames', () => { test('should return an array of all book names', () => { const bookNames = getAllBookNames(); expect(Array.isArray(bookNames)).toBe(true); expect(bookNames.length).toBeGreaterThan(0); expect(bookNames).toContain('Genesis'); expect(bookNames).toContain('Exodus'); expect(bookNames).toContain('Revelation'); }); test('should return book names as keys from the mapping', () => { const bookNames = getAllBookNames(); expect(bookNames).toContain('1 Samuel'); expect(bookNames).toContain('2 Kings'); expect(bookNames).toContain('1 Chronicles'); }); }); describe('integration tests', () => { test('should maintain consistency between conversion functions', () => { const bookNames = getAllBookNames(); bookNames.forEach(bookName => { const osisCode = bookNameToOsisBook(bookName); expect(osisCode).toBeTruthy(); expect(isValidOsisBook(osisCode)).toBe(true); const convertedBack = osisBookToBookName(osisCode); expect(convertedBack).toBe(bookName); }); }); test('should handle round-trip conversion correctly', () => { const testCases = [ 'Genesis', 'Exodus', '1 Samuel', '2 Kings', 'Psalm', 'Revelation' ]; testCases.forEach(bookName => { const osisCode = bookNameToOsisBook(bookName); const backToBookName = osisBookToBookName(osisCode); expect(backToBookName).toBe(bookName); }); }); }); describe('replaceBookNamesWithOsis', () => { test('should return unchanged text for empty or null input', () => { expect(replaceBookNamesWithOsis(null)).toBe(null); expect(replaceBookNamesWithOsis('')).toBe(''); expect(replaceBookNamesWithOsis(' ')).toBe(' '); }); test('should replace single book names with OSIS codes', () => { expect(replaceBookNamesWithOsis('Genesis')).toBe('Gen'); expect(replaceBookNamesWithOsis('Exodus')).toBe('Exod'); expect(replaceBookNamesWithOsis('Revelation')).toBe('Rev'); }); test('should replace multiple book names in text', () => { expect(replaceBookNamesWithOsis('Read Genesis and Exodus')).toBe('Read Gen and Exod'); expect(replaceBookNamesWithOsis('From Genesis to Revelation')).toBe('From Gen to Rev'); expect(replaceBookNamesWithOsis('1 Samuel and 2 Kings are historical books')).toBe('1Sam and 2Kgs are historical books'); }); test('should handle case-insensitive replacement', () => { expect(replaceBookNamesWithOsis('genesis')).toBe('Gen'); expect(replaceBookNamesWithOsis('EXODUS')).toBe('Exod'); expect(replaceBookNamesWithOsis('psalms')).toBe('Ps'); }); test('should replace book names with word boundaries', () => { expect(replaceBookNamesWithOsis('Genesis chapter 1')).toBe('Gen chapter 1'); expect(replaceBookNamesWithOsis('Read Genesis:1')).toBe('Read Gen:1'); expect(replaceBookNamesWithOsis('The book of Genesis')).toBe('The book of Gen'); expect(replaceBookNamesWithOsis('Genesis, Exodus, and Leviticus')).toBe('Gen, Exod, and Lev'); }); test('should not replace partial matches', () => { expect(replaceBookNamesWithOsis('Genesisology')).toBe('Genesisology'); expect(replaceBookNamesWithOsis('Exoduslike')).toBe('Exoduslike'); }); test('should replace override spellings', () => { expect(replaceBookNamesWithOsis('Phillipians')).toBe('Phil'); expect(replaceBookNamesWithOsis('Philipians')).toBe('Phil'); expect(replaceBookNamesWithOsis('1Corinthians')).toBe('1Cor'); expect(replaceBookNamesWithOsis('2Corinthians')).toBe('2Cor'); }); test('should replace book codes', () => { expect(replaceBookNamesWithOsis('Act')).toBe('Acts'); expect(replaceBookNamesWithOsis('Pss')).toBe('Ps'); expect(replaceBookNamesWithOsis('Psa')).toBe('Ps'); expect(replaceBookNamesWithOsis('Jam')).toBe('Jas'); }); test('should handle complex text with multiple replacements', () => { const input = 'Study Genesis 1, read Exodus 20, and meditate on Psalms 23. Also check 1 Samuel 17 and 2 Kings 5.'; const expected = 'Study Gen 1, read Exod 20, and meditate on Ps 23. Also check 1Sam 17 and 2Kgs 5.'; expect(replaceBookNamesWithOsis(input)).toBe(expected); }); test('should preserve text that is not book names', () => { expect(replaceBookNamesWithOsis('Hello world')).toBe('Hello world'); expect(replaceBookNamesWithOsis('123 numerical')).toBe('123 numerical'); expect(replaceBookNamesWithOsis('Random text with no books')).toBe('Random text with no books'); }); test('should handle mixed case and punctuation', () => { expect(replaceBookNamesWithOsis('Genesis, exodus; and REVELATION!')).toBe('Gen, Exod; and Rev!'); expect(replaceBookNamesWithOsis('Read "Genesis" and (Exodus)')).toBe('Read "Gen" and (Exod)'); }); test('should prioritize longer matches over shorter ones', () => { expect(replaceBookNamesWithOsis('1 Samuel')).toBe('1Sam'); expect(replaceBookNamesWithOsis('2 Chronicles')).toBe('2Chr'); }); });