// @vitest-environment happy-dom
import { describe, expect, it } from 'vitest';
import { createLatexCodeMirror } from '../editor';

function highlightedTokenClasses(parent: HTMLElement): string[] {
  return [...parent.querySelectorAll('.cm-line span')]
    .map((element) => element.getAttribute('class') ?? '')
    .filter(Boolean);
}

describe('Learnitive Source syntax highlighting', () => {
  it('renders visible token spans for LaTeX source', () => {
    const parent = document.createElement('div');
    document.body.append(parent);
    const session = createLatexCodeMirror({
      doc: String.raw`\section{Method}
We estimate $E = mc^2$ with \cite{kim2026robust}. % important`,
      parent,
      language: 'latex',
      ariaLabel: 'LaTeX source',
      onSave: () => {},
      onUndo: () => {},
      onRedo: () => {},
    });

    try {
      const classes = highlightedTokenClasses(parent);
      expect(classes.length).toBeGreaterThan(4);
      expect(new Set(classes).size).toBeGreaterThan(2);
    } finally {
      session.destroy();
      parent.remove();
    }
  });

  it('uses BibTeX highlighting for bibliography source', () => {
    const parent = document.createElement('div');
    document.body.append(parent);
    const session = createLatexCodeMirror({
      doc: String.raw`@article{kim2026robust,
  title = {Robust \LaTeX{} Research},
  year = 2026,
  author = "Kim, A. and Lee, B."
}`,
      parent,
      language: 'bibtex',
      ariaLabel: 'BibTeX source',
      onSave: () => {},
      onUndo: () => {},
      onRedo: () => {},
    });

    try {
      const classes = highlightedTokenClasses(parent);
      expect(classes.length).toBeGreaterThan(6);
      expect(new Set(classes).size).toBeGreaterThan(3);
      expect(parent.querySelector('.cm-line')?.textContent).toContain('@article');
    } finally {
      session.destroy();
      parent.remove();
    }
  });
});
