@accounter/shaam-uniform-format-generator
Version:
Fully typed application that generates, parses, and validates SHAAM uniform format tax reports (INI.TXT and BKMVDATA.TXT).
125 lines (102 loc) • 4.04 kB
text/typescript
/**
* Tests for CRLF join logic in encoder
*/
import { describe, expect, it } from 'vitest';
import { CRLF } from '../../src/format/newline.js';
import {
assembleFile,
joinFields,
joinLinesWithCRLF,
joinRecords,
} from '../../src/generator/format/encoder.js';
describe('CRLF Join Logic', () => {
describe('joinFields', () => {
it('should join field values and add CRLF', () => {
const fields = ['ABC', '123', 'XYZ'];
const result = joinFields(fields);
expect(result).toBe('ABC123XYZ' + CRLF);
expect(result.endsWith(CRLF)).toBe(true);
});
it('should handle empty fields array', () => {
const result = joinFields([]);
expect(result).toBe(CRLF);
});
it('should handle single field', () => {
const result = joinFields(['SINGLE']);
expect(result).toBe('SINGLE' + CRLF);
});
});
describe('joinRecords', () => {
it('should join records without adding extra CRLF', () => {
const records = ['A100' + CRLF, 'B100' + CRLF, 'Z900' + CRLF];
const result = joinRecords(records);
expect(result).toBe('A100' + CRLF + 'B100' + CRLF + 'Z900' + CRLF);
expect(result.split(CRLF)).toHaveLength(4); // 3 records + 1 empty string at end
});
it('should handle empty records array', () => {
const result = joinRecords([]);
expect(result).toBe('');
});
});
describe('joinLinesWithCRLF', () => {
it('should add CRLF to each line and join them', () => {
const lines = ['LINE1', 'LINE2', 'LINE3'];
const result = joinLinesWithCRLF(lines);
expect(result).toBe('LINE1' + CRLF + 'LINE2' + CRLF + 'LINE3' + CRLF);
});
it('should handle empty lines array', () => {
const result = joinLinesWithCRLF([]);
expect(result).toBe('');
});
});
describe('assembleFile', () => {
it('should assemble complete SHAAM file from records', () => {
const records = [
'A000HEADER_RECORD' + CRLF,
'A100BUSINESS_DATA' + CRLF,
'C100DOCUMENT_HDR' + CRLF,
'Z900CLOSING_REC' + CRLF,
];
const result = assembleFile(records);
expect(result).toBe(records.join(''));
expect(result.startsWith('A000HEADER_RECORD')).toBe(true);
expect(result.endsWith('Z900CLOSING_REC' + CRLF)).toBe(true);
});
it('should handle single record', () => {
const records = ['A100SINGLE' + CRLF];
const result = assembleFile(records);
expect(result).toBe('A100SINGLE' + CRLF);
});
});
describe('Integration with actual record encoding', () => {
it('should work with actual field arrays like records use', () => {
// Simulate how A100 record builds its fields array
const fields = [
'A100', // Record code (4)
'000000001', // Record number (9)
'123456789', // VAT ID (9)
'12345678901234567890', // Primary ID (20 chars)
'&OF1.31&', // System constant (8)
' '.repeat(50), // Reserved field (50)
];
const recordLine = joinFields(fields);
expect(recordLine).toContain('A100');
expect(recordLine).toContain('123456789');
expect(recordLine.endsWith(CRLF)).toBe(true);
// Calculate actual field lengths: 4 + 9 + 9 + 20 + 8 + 50 = 100 chars + CRLF
const expectedLength = 4 + 9 + 9 + 20 + 8 + 50 + CRLF.length;
expect(recordLine.length).toBe(expectedLength);
});
it('should create valid multi-record file', () => {
const record1 = joinFields(['A100', '000000001', '123456789']);
const record2 = joinFields(['C100', '000000002', '123456789']);
const record3 = joinFields(['Z900', '000000003', '123456789']);
const fileContent = assembleFile([record1, record2, record3]);
const lines = fileContent.split(CRLF).filter(line => line.length > 0);
expect(lines).toHaveLength(3);
expect(lines[0].startsWith('A100')).toBe(true);
expect(lines[1].startsWith('C100')).toBe(true);
expect(lines[2].startsWith('Z900')).toBe(true);
});
});
});