mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
- Normalize pandoc command parsing with path.basename() to support bundled binary paths - Use bundled pandoc binary in convertWithPandoc instead of relying on PATH - Forward includeSubfolders checkbox state from renderer to main process - Add pandoc availability check before batch conversion - Re-enable Start button when batch conversion completes - Clean up obsolete dist build artifact causing test snapshot warning - Bump version to 4.4.4
142 lines
4.4 KiB
JavaScript
142 lines
4.4 KiB
JavaScript
/**
|
|
* Tests for Utility Functions
|
|
* Tests helper functions that can be extracted and tested
|
|
*/
|
|
|
|
describe('Utility Functions', () => {
|
|
describe('parseCommand', () => {
|
|
// This function parses command strings into command and args
|
|
function parseCommand(cmdString) {
|
|
const parts = [];
|
|
let current = '';
|
|
let inQuotes = false;
|
|
let quoteChar = '';
|
|
|
|
for (let i = 0; i < cmdString.length; i++) {
|
|
const char = cmdString[i];
|
|
if ((char === '"' || char === "'") && !inQuotes) {
|
|
inQuotes = true;
|
|
quoteChar = char;
|
|
} else if (char === quoteChar && inQuotes) {
|
|
inQuotes = false;
|
|
quoteChar = '';
|
|
} else if (char === ' ' && !inQuotes) {
|
|
if (current) {
|
|
parts.push(current);
|
|
current = '';
|
|
}
|
|
} else {
|
|
current += char;
|
|
}
|
|
}
|
|
if (current) {
|
|
parts.push(current);
|
|
}
|
|
|
|
return {
|
|
command: parts[0],
|
|
args: parts.slice(1),
|
|
};
|
|
}
|
|
|
|
test('should parse simple command', () => {
|
|
const result = parseCommand('pandoc input.md -o output.pdf');
|
|
expect(result.command).toBe('pandoc');
|
|
expect(result.args).toEqual(['input.md', '-o', 'output.pdf']);
|
|
});
|
|
|
|
test('should handle double-quoted paths', () => {
|
|
const result = parseCommand('pandoc "C:/path with spaces/file.md" -o output.pdf');
|
|
expect(result.command).toBe('pandoc');
|
|
expect(result.args).toEqual(['C:/path with spaces/file.md', '-o', 'output.pdf']);
|
|
});
|
|
|
|
test('should handle single-quoted paths', () => {
|
|
const result = parseCommand("pandoc 'file name.md' -o output.pdf");
|
|
expect(result.command).toBe('pandoc');
|
|
expect(result.args).toEqual(['file name.md', '-o', 'output.pdf']);
|
|
});
|
|
|
|
test('should handle multiple options', () => {
|
|
const result = parseCommand(
|
|
'pandoc input.md --pdf-engine=xelatex -V geometry:margin=1in -o output.pdf'
|
|
);
|
|
expect(result.command).toBe('pandoc');
|
|
expect(result.args).toContain('--pdf-engine=xelatex');
|
|
expect(result.args).toContain('-V');
|
|
});
|
|
|
|
test('should handle empty command', () => {
|
|
const result = parseCommand('');
|
|
expect(result.command).toBeUndefined();
|
|
expect(result.args).toEqual([]);
|
|
});
|
|
});
|
|
|
|
describe('hexToRgb', () => {
|
|
// This function converts hex colors to RGB
|
|
function hexToRgb(hex) {
|
|
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
return result
|
|
? {
|
|
r: parseInt(result[1], 16) / 255,
|
|
g: parseInt(result[2], 16) / 255,
|
|
b: parseInt(result[3], 16) / 255,
|
|
}
|
|
: null;
|
|
}
|
|
|
|
test('should convert black hex to RGB', () => {
|
|
const result = hexToRgb('#000000');
|
|
expect(result).toEqual({ r: 0, g: 0, b: 0 });
|
|
});
|
|
|
|
test('should convert white hex to RGB', () => {
|
|
const result = hexToRgb('#ffffff');
|
|
expect(result).toEqual({ r: 1, g: 1, b: 1 });
|
|
});
|
|
|
|
test('should convert red hex to RGB', () => {
|
|
const result = hexToRgb('#ff0000');
|
|
expect(result.r).toBeCloseTo(1);
|
|
expect(result.g).toBeCloseTo(0);
|
|
expect(result.b).toBeCloseTo(0);
|
|
});
|
|
|
|
test('should handle hex without hash', () => {
|
|
const result = hexToRgb('00ff00');
|
|
expect(result.r).toBeCloseTo(0);
|
|
expect(result.g).toBeCloseTo(1);
|
|
expect(result.b).toBeCloseTo(0);
|
|
});
|
|
|
|
test('should return null for invalid hex', () => {
|
|
expect(hexToRgb('invalid')).toBeNull();
|
|
expect(hexToRgb('#xyz')).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('File Path Utilities', () => {
|
|
test('should extract file extension', () => {
|
|
const getExtension = (filepath) => {
|
|
const match = filepath.match(/\.([^/.]+)$/);
|
|
return match ? match[1].toLowerCase() : '';
|
|
};
|
|
|
|
expect(getExtension('file.md')).toBe('md');
|
|
expect(getExtension('document.PDF')).toBe('pdf');
|
|
expect(getExtension('path/to/file.docx')).toBe('docx');
|
|
expect(getExtension('noextension')).toBe('');
|
|
});
|
|
|
|
test('should replace file extension', () => {
|
|
const replaceExtension = (filepath, newExt) => {
|
|
return filepath.replace(/\.[^/.]+$/, `.${newExt}`);
|
|
};
|
|
|
|
expect(replaceExtension('file.md', 'pdf')).toBe('file.pdf');
|
|
expect(replaceExtension('path/to/doc.docx', 'html')).toBe('path/to/doc.html');
|
|
});
|
|
});
|
|
});
|