/
nacha
/
pseado
Обзор
Документация
Войти
/
nacha
/
pseado
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
master
scripts/test_hatch_dimension.js
194 строки
6 KB
alex
feat: add CLI test script for Hatch and Dimension
04 авг 2026, 09:17
Верифицирован
04 авг 2026, 09:17
a5880cb
Код
Авторство
О чём код?
#!/usr/bin/env node /** * CLI для тестирования штриховок и размеров * Использует Node.js и headless canvas (node-canvas или fallback) */ import { Parser } from './src/core/parser.js'; import { Validator } from './src/core/validator.js'; // Mock canvas для Node.js const mockCtx = { fillRect: () => {}, strokeRect: () => {}, beginPath: () => {}, moveTo: () => {}, lineTo: () => {}, arc: () => {}, stroke: () => {}, fill: () => {}, clip: () => {}, save: () => {}, restore: () => {}, translate: () => {}, rotate: () => {}, rect: () => {}, measureText: () => ({ width: 50 }), }; function testHatchParsing() { console.log('\n🧱 Тестирование штриховок (Hatch):\n'); const parser = new Parser(); const tests = [ { code: 'штриховка область=(100,100,200,150) тип=line', expected: 'line' }, { code: 'штриховка область=(50,50,100,100) тип=cross', expected: 'cross' }, { code: 'штриховка область=(10,10,50,50) тип=dots', expected: 'dots' }, { code: 'штриховка область=(0,0,100,100) тип=angles', expected: 'angles' }, ]; let passed = 0; for (const test of tests) { const ast = parser.parse(test.code); const hatch = ast.body[0]; if (hatch.type === 'Hatch' && hatch.pattern === test.expected) { console.log(` ✅ ${test.code}`); passed++; } else { console.log(` ❌ ${test.code}`); console.log(` Ожидало: ${test.expected}, получено: ${hatch?.pattern || 'не распознано'}`); } } console.log(`\n Результат: ${passed}/${tests.length} пройдено\n`); return passed === tests.length; } function testDimensionParsing() { console.log('\n📏 Тестирование размеров (Dimension):\n'); const parser = new Parser(); const tests = [ { code: 'размер начало=(100,100) конец=(300,100) смещение=20 значение="150"', expected: { x1: 100, y1: 100, x2: 300, y2: 100, offset: 20, text: '150' } }, { code: 'размер начало=(100,100) конец=(100,300) смещение=20 значение="200"', expected: { x1: 100, y1: 100, x2: 100, y2: 300 } }, ]; let passed = 0; for (const test of tests) { const ast = parser.parse(test.code); const dim = ast.body[0]; let match = true; for (const [key, value] of Object.entries(test.expected)) { if (dim[key] !== value) { match = false; console.log(` ❌ ${test.code}`); console.log(` ${key}: ожидало ${value}, получено ${dim[key]}`); break; } } if (match && dim.type === 'Dimension') { console.log(` ✅ ${test.code}`); passed++; } } console.log(`\n Результат: ${passed}/${tests.length} пройдено\n`); return passed === tests.length; } function testGostExample() { console.log('\n📐 Тестирование полного ГОСТ примера:\n'); const code = ` -- Полный чертёж по ГОСТ (v1.5.0) !id=uuid-2026-gost !revision=3 !status=design -- Основной контур прямоугольник положение=(50,50) ширина=350 высота=250 -- Штриховка сечения штриховка область=(60,60,150,100) тип=line штриховка область=(240,60,150,100) тип=cross -- Отверстия окружность центр=(135,110) радиус=15 -- Размеры размер начало=(50,50) конец=(400,50) смещение=30 значение="350" размер начало=(400,50) конец=(400,300) смещение=30 значение="250" `; const parser = new Parser(); const ast = parser.parse(code); const validator = new Validator(); const validation = validator.validate(ast); console.log(` Метаданные:`); console.log(` ID: ${ast.meta.id}`); console.log(` Ревизия: ${ast.meta.revision}`); console.log(` Статус: ${ast.meta.status}`); console.log(` Команды:`); const counts = {}; ast.body.forEach(n => { counts[n.type] = (counts[n.type] || 0) + 1; }); Object.entries(counts).forEach(([type, count]) => { console.log(` ${type}: ${count}`); }); console.log(` Всего команд: ${ast.body.length}`); console.log(` Валидация: ${validation.valid ? '✅ пройдена' : '❌ ошибки'}`); const expected = { Rectangle: 1, Hatch: 2, Circle: 1, Dimension: 2, }; let passed = true; for (const [type, count] of Object.entries(expected)) { if ((counts[type] || 0) !== count) { passed = false; console.log(` ❌ ${type}: ожидало ${count}, получено ${counts[type] || 0}`); } } if (passed) { console.log(`\n ✅ Полный ГОСТ пример валиден\n`); } else { console.log(`\n ❌ Полный ГОСТ пример содержит ошибки\n`); } return passed; } // Запуск тестов console.log('═══════════════════════════════════════'); console.log(' Тестирование графических примитивов'); console.log(' Штриховки + Размеры (ГОСТ) v1.5.0'); console.log('═══════════════════════════════════════'); const results = [ testHatchParsing(), testDimensionParsing(), testGostExample(), ]; const allPassed = results.every(r => r); console.log('\n═══════════════════════════════════════'); if (allPassed) { console.log(' ✅ Все тесты пройдены!'); } else { console.log(' ❌ Некоторые тесты не пройдены'); } console.log('═══════════════════════════════════════\n'); process.exit(allPassed ? 0 : 1);