// Java's readers of the e-mail account files: every case in // email-server.cases.txt and email-client.cases.txt was read by Java // (EmailServer.kontenLaden, EmailAnwendung.laden; *.java.json, // tools/java-oracle) and must come out the same here. import { readFileSync } from 'node:fs'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { describe, expect, it } from 'vitest'; import { addressEntry, readJavaEmailClientFile, readJavaEmailServerFile } from '../src/javaEmail.js'; import { javaEmailAccount } from './javaEmailNames.js'; const here = dirname(fileURLToPath(import.meta.url)); /** The cases file's escapes: a backslash, `u` and four hex digits for one UTF-16 unit. */ function unescape(line: string): string { return line.replace(/\\u([0-9a-fA-F]{4})/g, (_, hex: string) => String.fromCharCode(Number.parseInt(hex, 16))); } function measured(kind: 'server' | 'client'): [string, unknown][] { const cases = JSON.parse(readFileSync(join(here, `email-${kind}.java.json`), 'utf8')) as [string, unknown][]; const lines = readFileSync(join(here, `email-${kind}.cases.txt`), 'ascii').split('\n').slice(0, -1); it('covers every line of the cases file', () => { expect(cases.map(([line]) => line)).toEqual(lines); }); return cases; } describe('readJavaEmailServerFile against Java', () => { for (const [line, expected] of measured('server')) { it(JSON.stringify(line), () => { const accounts = readJavaEmailServerFile(unescape(line)); expect(Array.isArray(accounts) ? accounts.map(javaEmailAccount) : `!${accounts.exception}`).toEqual(expected); }); } }); describe('readJavaEmailClientFile against Java', () => { for (const [line, expected] of measured('client')) { it(JSON.stringify(line), () => { const account = readJavaEmailClientFile(unescape(line)); expect(account === null ? null : javaEmailAccount(account)).toEqual(expected); }); } }); describe('addressEntry', () => { it('reads a name and an address, an address alone, or a name alone', () => { expect(addressEntry(' Alice ')).toEqual({ name: 'Alice', mailAddress: 'alice@senior.de' }); expect(addressEntry('')).toEqual({ name: null, mailAddress: 'alice@senior.de' }); expect(addressEntry('alice@senior.de')).toEqual({ name: null, mailAddress: 'alice@senior.de' }); expect(addressEntry('Alice