eda-parser.spec.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { readFile } from 'node:fs/promises'
  2. import { describe, expect, it } from 'vitest'
  3. import { parseEdaFile } from '../packages/core/src'
  4. describe('EDA parser', () => {
  5. it('parses generated OLB CFB fixtures into symbol entities and properties', async () => {
  6. const data = await readFile('apps/viewer-demo/public/example/sample.olb')
  7. const parsed = await parseEdaFile(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength), 'olb')
  8. expect(parsed.parser).toBe('cfb')
  9. expect(parsed.type).toBe('olb')
  10. expect(parsed.tree.length).toBeGreaterThan(0)
  11. expect(parsed.stats.confidence).toBe('high')
  12. expect(parsed.stats.symbolCount).toBe(2)
  13. expect(parsed.streams.some(stream => stream.path.includes('RESISTOR'))).toBe(true)
  14. expect(parsed.strings.join('\n')).toContain('Demo resistor symbol')
  15. const resistor = parsed.entities.find(entity => entity.name === 'RESISTOR')
  16. expect(resistor?.role).toBe('symbol')
  17. expect(resistor?.pins).toEqual(['1', '2'])
  18. expect(resistor?.footprint).toBe('R_0603')
  19. expect(resistor?.description).toBe('Demo resistor symbol')
  20. expect(resistor?.properties.some(property => property.key === 'Footprint')).toBe(true)
  21. expect(parsed.diagnostics.some(diagnostic => diagnostic.code === 'coverage')).toBe(true)
  22. })
  23. it('parses generated DRA CFB fixtures into drawing, footprint and padstack hints', async () => {
  24. const data = await readFile('apps/viewer-demo/public/example/sample.dra')
  25. const parsed = await parseEdaFile(data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength), 'dra')
  26. expect(parsed.parser).toBe('cfb')
  27. expect(parsed.type).toBe('dra')
  28. expect(parsed.stats.footprintCount).toBe(1)
  29. expect(parsed.stats.padstackCount).toBe(1)
  30. expect(parsed.entities.some(entity => entity.role === 'footprint' && entity.path.includes('Footprint'))).toBe(true)
  31. const padstack = parsed.entities.find(entity => entity.role === 'padstack')
  32. expect(padstack?.name).toBe('SMD_RECT')
  33. expect(padstack?.properties.some(property => property.key === 'Drill' && property.value === '0')).toBe(true)
  34. const header = parsed.streams.find(stream => stream.path.includes('Header.txt'))
  35. expect(header?.properties.some(property => property.key === 'Layers')).toBe(true)
  36. })
  37. it('falls back safely for non-CFB DRA data', async () => {
  38. const buffer = new TextEncoder().encode('DRA fallback fixture with PADSTACK and ROUTE').buffer
  39. const parsed = await parseEdaFile(buffer, 'dra')
  40. expect(parsed.parser).toBe('binary')
  41. expect(parsed.type).toBe('dra')
  42. expect(parsed.warnings[0]).toContain('不是标准 CFB')
  43. expect(parsed.diagnostics.some(diagnostic => diagnostic.code === 'parser')).toBe(true)
  44. expect(parsed.streams[0].role).toBe('padstack')
  45. expect(parsed.strings.join('\n')).toContain('PADSTACK')
  46. })
  47. })