mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-10-01 17:29:29 +05:30
feat(ascii-art): 19 named ASCII art templates with snapshot tests
Per Task 3 of the 2026-09-14 ASCII art upgrade plan. - New module: src/main/AsciiArt.templates.js exporting ASCII_TEMPLATES (19 entries) and getTemplate(name) accessor (returns '' for unknown). - New test: tests/main/ascii-art.templates.test.js with 19 per-template snapshots + unknown-name + keys-match assertions (21 tests total). - 17 templates verbatim from src/ascii-generator.html:596-626 (arrow-right, arrow-down, decision, process, flowchart, sequence, network, hierarchy, header, note, warning, info, divider, separator, banner, checklist + the brief's own TEMPLATE_NAMES order). - 2 templates verbatim from src/renderer.js:6542-6697 (progress-bar, table-simple). - 1 newly authored: arrow-up (completes the arrow triplet; does not exist in either source). Amit Haridas
This commit is contained in:
@@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* ASCII art templates — named pre-drawn diagrams and frames.
|
||||||
|
*
|
||||||
|
* Sourced from src/ascii-generator.html:596-626 and src/renderer.js:6542-6697
|
||||||
|
* (the `getASCIITemplate()` function). 19 entries; unknown names resolve to ''.
|
||||||
|
* `arrow-up` is the only template authored for this module — it completes the
|
||||||
|
* arrow triplet (right, down, up) and does not exist verbatim in either source.
|
||||||
|
*
|
||||||
|
* @module AsciiArt.templates
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const ASCII_TEMPLATES = {
|
||||||
|
// ----- arrows -----
|
||||||
|
'arrow-right':
|
||||||
|
' ┌─────────────────────┐\n──▶│ Process or Action │──▶\n └─────────────────────┘',
|
||||||
|
'arrow-down':
|
||||||
|
' │\n ▼\n┌───────────────┐\n│ Process │\n└───────────────┘\n │\n ▼',
|
||||||
|
// Newly authored to complete the arrow triplet. Mirrors arrow-down with
|
||||||
|
// upward flow direction.
|
||||||
|
'arrow-up':
|
||||||
|
' ▲\n │\n┌───────────────┐\n│ Process │\n└───────────────┘\n │\n ▲',
|
||||||
|
|
||||||
|
// ----- shapes -----
|
||||||
|
decision:
|
||||||
|
' ╱╲\n ╱ ╲\n ╱ ? ╲\n ╱ ╲\n ╱────────╲\n ╱ ╲\n YES NO\n │ │\n ▼ ▼',
|
||||||
|
process: '┌─────┐ ┌─────┐ ┌─────┐\n│ 1 │──▶│ 2 │──▶│ 3 │\n└─────┘ └─────┘ └─────┘',
|
||||||
|
flowchart:
|
||||||
|
'┌─────────────┐\n│ START │\n└──────┬──────┘\n │\n ▼\n┌─────────────┐\n│ Process A │\n└──────┬──────┘\n │\n ▼\n ╱────────╲\n ╱ Decision ╲\n ╲ ? ╱\n ╲────────╱\n │ │\n YES NO\n │ │\n ▼ ▼\n┌──────┐ ┌──────┐\n│ B │ │ C │\n└──────┘ └──────┘',
|
||||||
|
sequence:
|
||||||
|
' User System Database\n │ │ │\n │ Request │ │\n ├──────────►│ │\n │ │ Query │\n │ ├──────────►│\n │ │ │\n │ │ Result │\n │ │◄──────────┤\n │ Response │ │\n │◄──────────┤ │\n │ │ │',
|
||||||
|
network:
|
||||||
|
' ┌─────────┐\n │ Server │\n └────┬────┘\n │\n ┌─────────┼─────────┐\n │ │ │\n┌────┴────┐ ┌──┴──┐ ┌────┴────┐\n│ Client1 │ │ DB │ │ Client2 │\n└─────────┘ └─────┘ └─────────┘',
|
||||||
|
hierarchy:
|
||||||
|
' ┌─────────┐\n │ CEO │\n └────┬────┘\n ┌─────────┼─────────┐\n │ │ │\n ┌───┴───┐ ┌───┴───┐ ┌───┴───┐\n │ VP1 │ │ VP2 │ │ VP3 │\n └───┬───┘ └───┬───┘ └───┬───┘\n │ │ │\n ┌───┴───┐ ┌───┴───┐ ┌───┴───┐\n │ Team1 │ │ Team2 │ │ Team3 │\n └───────┘ └───────┘ └───────┘',
|
||||||
|
|
||||||
|
// ----- frames -----
|
||||||
|
header:
|
||||||
|
'╔════════════════════════════════════╗\n║ SECTION TITLE ║\n╚════════════════════════════════════╝',
|
||||||
|
note: '┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n┃ NOTE: ┃\n┃ This is an important note ┃\n┃ that requires attention! ┃\n┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛',
|
||||||
|
warning:
|
||||||
|
'╔════════════════════════════════════╗\n║ ⚠️ WARNING ║\n║ ║\n║ Critical information here! ║\n╚════════════════════════════════════╝',
|
||||||
|
info: '╭────────────────────────────────────╮\n│ ℹ️ INFO │\n│ │\n│ Helpful information here. │\n╰────────────────────────────────────╯',
|
||||||
|
divider: '════════════════════════════════════════',
|
||||||
|
separator:
|
||||||
|
'╭──────────────────────────────────────╮\n│ │\n╰──────────────────────────────────────╯',
|
||||||
|
banner:
|
||||||
|
'★══════════════════════════════════════★\n║ YOUR TITLE HERE ║\n★══════════════════════════════════════★',
|
||||||
|
checklist:
|
||||||
|
'☐ Task 1 - Not completed\n☑ Task 2 - Completed \n☐ Task 3 - Not completed\n☐ Task 4 - Not completed',
|
||||||
|
|
||||||
|
// ----- bars / tables (only in src/renderer.js) -----
|
||||||
|
'progress-bar': '\nProgress: [████████████░░░░░░░░] 60%\n 0% 100%',
|
||||||
|
'table-simple':
|
||||||
|
'\n┌──────────┬──────────┬──────────┐\n│ Header 1 │ Header 2 │ Header 3 │\n├──────────┼──────────┼──────────┤\n│ Data 1 │ Data 2 │ Data 3 │\n├──────────┼──────────┼──────────┤\n│ Data 4 │ Data 5 │ Data 6 │\n└──────────┴──────────┴──────────┘',
|
||||||
|
};
|
||||||
|
|
||||||
|
function getTemplate(name) {
|
||||||
|
if (typeof name !== 'string') return '';
|
||||||
|
return ASCII_TEMPLATES[name] || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { ASCII_TEMPLATES, getTemplate };
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates arrow-down 1`] = `
|
||||||
|
" │
|
||||||
|
▼
|
||||||
|
┌───────────────┐
|
||||||
|
│ Process │
|
||||||
|
└───────────────┘
|
||||||
|
│
|
||||||
|
▼"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates arrow-right 1`] = `
|
||||||
|
" ┌─────────────────────┐
|
||||||
|
──▶│ Process or Action │──▶
|
||||||
|
└─────────────────────┘"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates arrow-up 1`] = `
|
||||||
|
" ▲
|
||||||
|
│
|
||||||
|
┌───────────────┐
|
||||||
|
│ Process │
|
||||||
|
└───────────────┘
|
||||||
|
│
|
||||||
|
▲"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates banner 1`] = `
|
||||||
|
"★══════════════════════════════════════★
|
||||||
|
║ YOUR TITLE HERE ║
|
||||||
|
★══════════════════════════════════════★"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates checklist 1`] = `
|
||||||
|
"☐ Task 1 - Not completed
|
||||||
|
☑ Task 2 - Completed
|
||||||
|
☐ Task 3 - Not completed
|
||||||
|
☐ Task 4 - Not completed"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates decision 1`] = `
|
||||||
|
" ╱╲
|
||||||
|
╱ ╲
|
||||||
|
╱ ? ╲
|
||||||
|
╱ ╲
|
||||||
|
╱────────╲
|
||||||
|
╱ ╲
|
||||||
|
YES NO
|
||||||
|
│ │
|
||||||
|
▼ ▼"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates divider 1`] = `"════════════════════════════════════════"`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates flowchart 1`] = `
|
||||||
|
"┌─────────────┐
|
||||||
|
│ START │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────┐
|
||||||
|
│ Process A │
|
||||||
|
└──────┬──────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
╱────────╲
|
||||||
|
╱ Decision ╲
|
||||||
|
╲ ? ╱
|
||||||
|
╲────────╱
|
||||||
|
│ │
|
||||||
|
YES NO
|
||||||
|
│ │
|
||||||
|
▼ ▼
|
||||||
|
┌──────┐ ┌──────┐
|
||||||
|
│ B │ │ C │
|
||||||
|
└──────┘ └──────┘"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates header 1`] = `
|
||||||
|
"╔════════════════════════════════════╗
|
||||||
|
║ SECTION TITLE ║
|
||||||
|
╚════════════════════════════════════╝"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates hierarchy 1`] = `
|
||||||
|
" ┌─────────┐
|
||||||
|
│ CEO │
|
||||||
|
└────┬────┘
|
||||||
|
┌─────────┼─────────┐
|
||||||
|
│ │ │
|
||||||
|
┌───┴───┐ ┌───┴───┐ ┌───┴───┐
|
||||||
|
│ VP1 │ │ VP2 │ │ VP3 │
|
||||||
|
└───┬───┘ └───┬───┘ └───┬───┘
|
||||||
|
│ │ │
|
||||||
|
┌───┴───┐ ┌───┴───┐ ┌───┴───┐
|
||||||
|
│ Team1 │ │ Team2 │ │ Team3 │
|
||||||
|
└───────┘ └───────┘ └───────┘"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates info 1`] = `
|
||||||
|
"╭────────────────────────────────────╮
|
||||||
|
│ ℹ️ INFO │
|
||||||
|
│ │
|
||||||
|
│ Helpful information here. │
|
||||||
|
╰────────────────────────────────────╯"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates network 1`] = `
|
||||||
|
" ┌─────────┐
|
||||||
|
│ Server │
|
||||||
|
└────┬────┘
|
||||||
|
│
|
||||||
|
┌─────────┼─────────┐
|
||||||
|
│ │ │
|
||||||
|
┌────┴────┐ ┌──┴──┐ ┌────┴────┐
|
||||||
|
│ Client1 │ │ DB │ │ Client2 │
|
||||||
|
└─────────┘ └─────┘ └─────────┘"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates note 1`] = `
|
||||||
|
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
||||||
|
┃ NOTE: ┃
|
||||||
|
┃ This is an important note ┃
|
||||||
|
┃ that requires attention! ┃
|
||||||
|
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates process 1`] = `
|
||||||
|
"┌─────┐ ┌─────┐ ┌─────┐
|
||||||
|
│ 1 │──▶│ 2 │──▶│ 3 │
|
||||||
|
└─────┘ └─────┘ └─────┘"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates progress-bar 1`] = `
|
||||||
|
"
|
||||||
|
Progress: [████████████░░░░░░░░] 60%
|
||||||
|
0% 100%"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates separator 1`] = `
|
||||||
|
"╭──────────────────────────────────────╮
|
||||||
|
│ │
|
||||||
|
╰──────────────────────────────────────╯"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates sequence 1`] = `
|
||||||
|
" User System Database
|
||||||
|
│ │ │
|
||||||
|
│ Request │ │
|
||||||
|
├──────────►│ │
|
||||||
|
│ │ Query │
|
||||||
|
│ ├──────────►│
|
||||||
|
│ │ │
|
||||||
|
│ │ Result │
|
||||||
|
│ │◄──────────┤
|
||||||
|
│ Response │ │
|
||||||
|
│◄──────────┤ │
|
||||||
|
│ │ │"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates table-simple 1`] = `
|
||||||
|
"
|
||||||
|
┌──────────┬──────────┬──────────┐
|
||||||
|
│ Header 1 │ Header 2 │ Header 3 │
|
||||||
|
├──────────┼──────────┼──────────┤
|
||||||
|
│ Data 1 │ Data 2 │ Data 3 │
|
||||||
|
├──────────┼──────────┼──────────┤
|
||||||
|
│ Data 4 │ Data 5 │ Data 6 │
|
||||||
|
└──────────┴──────────┴──────────┘"
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`AsciiArt.templates warning 1`] = `
|
||||||
|
"╔════════════════════════════════════╗
|
||||||
|
║ ⚠️ WARNING ║
|
||||||
|
║ ║
|
||||||
|
║ Critical information here! ║
|
||||||
|
╚════════════════════════════════════╝"
|
||||||
|
`;
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/**
|
||||||
|
* @jest-environment node
|
||||||
|
*
|
||||||
|
* Per-template snapshot tests. Templates are static strings; the snapshot
|
||||||
|
* catches accidental edits during refactors.
|
||||||
|
*/
|
||||||
|
const AsciiArtTemplates = require('../../src/main/AsciiArt.templates');
|
||||||
|
|
||||||
|
const TEMPLATE_NAMES = [
|
||||||
|
'arrow-right',
|
||||||
|
'arrow-down',
|
||||||
|
'arrow-up',
|
||||||
|
'decision',
|
||||||
|
'process',
|
||||||
|
'flowchart',
|
||||||
|
'sequence',
|
||||||
|
'network',
|
||||||
|
'hierarchy',
|
||||||
|
'header',
|
||||||
|
'note',
|
||||||
|
'warning',
|
||||||
|
'info',
|
||||||
|
'divider',
|
||||||
|
'separator',
|
||||||
|
'banner',
|
||||||
|
'checklist',
|
||||||
|
'progress-bar',
|
||||||
|
'table-simple',
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('AsciiArt.templates', () => {
|
||||||
|
test.each(TEMPLATE_NAMES)('%s', (name) => {
|
||||||
|
expect(AsciiArtTemplates.getTemplate(name)).toMatchSnapshot();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns empty string for unknown name', () => {
|
||||||
|
expect(AsciiArtTemplates.getTemplate('nope')).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ASCII_TEMPLATES object exposes all 19 names', () => {
|
||||||
|
expect(Object.keys(AsciiArtTemplates.ASCII_TEMPLATES).sort()).toEqual(
|
||||||
|
TEMPLATE_NAMES.slice().sort()
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user