import { afterAll, beforeEach, describe, expect, it } from '@jest/globals';
import { getTokens, setupTex, tex2mml, expectTexError } from '#helpers';
import '#js/input/tex/braket/BraketConfiguration';

beforeEach(() => setupTex(['base', 'braket']));

/**********************************************************************************/

describe('Braket', () => {
  it('Braket-bra', () => {
    expect(tex2mml('\\bra{x}')).toMatchSnapshot();
  });

  it('Braket-bra-large', () => {
    expect(tex2mml('\\bra{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-Bra', () => {
    expect(tex2mml('\\Bra{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-ket', () => {
    expect(tex2mml('\\ket{x}')).toMatchSnapshot();
  });

  it('Braket-ket-large', () => {
    expect(tex2mml('\\ket{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-Ket', () => {
    expect(tex2mml('\\Ket{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-braket', () => {
    expect(tex2mml('\\braket{x}')).toMatchSnapshot();
  });

  it('Braket-braket-large', () => {
    expect(tex2mml('\\braket{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-Braket', () => {
    expect(tex2mml('\\Braket{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-ketbra', () => {
    expect(tex2mml('\\ketbra{x}{y}')).toMatchSnapshot();
  });

  it('Braket-ketbra-large', () => {
    expect(tex2mml('\\ketbra{\\frac{x}{y}}{z}')).toMatchSnapshot();
  });

  it('Braket-Ketbra', () => {
    expect(tex2mml('\\Ketbra{\\frac{x}{y}}{z}')).toMatchSnapshot();
  });

  it('Braket-Set-small', () => {
    expect(tex2mml('\\set{x}')).toMatchSnapshot();
  });

  it('Braket-Set', () => {
    expect(tex2mml('\\Set{x}')).toMatchSnapshot();
  });

  it('Braket-Set-large', () => {
    expect(tex2mml('\\Set{\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-Set-Bar', () => {
    expect(tex2mml('\\Set{x|\\frac{x}{y}}')).toMatchSnapshot();
  });

  it('Braket-Set-over', () => {
    expect(tex2mml('\\Set{x\\over y}')).toMatchSnapshot();
  });

  it('Braket-bar-small', () => {
    expect(tex2mml('\\braket{x|y}')).toMatchSnapshot();
  });

  it('Braket-bar-large', () => {
    expect(tex2mml('\\braket{\\frac{x}{y}|z}')).toMatchSnapshot();
  });

  it('Braket-Bar', () => {
    expect(tex2mml('\\Braket{\\frac{x}{y}|z}')).toMatchSnapshot();
  });

  it('Braket-Bar1', () => {
    expect(tex2mml('\\Braket{\\frac{x}{y}||z||y}')).toMatchSnapshot();
  });

  it('Braket-Bar2', () => {
    expect(tex2mml('\\Braket{\\frac{x}{y}\\||z||y}')).toMatchSnapshot();
  });

  it('Braket-Bar3', () => {
    expect(tex2mml('\\Braket{\\frac{x}{y}|||z||y}')).toMatchSnapshot();
  });

  it('Braket-Bar4', () => {
    expect(tex2mml('\\Braket{\\frac{x}{y}|||z|||y}')).toMatchSnapshot();
  });

  it('Braket-Bar-Set', () => {
    expect(tex2mml('\\Set{\\frac{x}{y}||y||z}')).toMatchSnapshot();
  });

  it('Braket-Bar-Set2', () => {
    expect(tex2mml('\\Set{\\frac{x}{y}\\||y\\||z}')).toMatchSnapshot();
  });

  it('Braket-Space', () => {
    expect(tex2mml('\\braket {a|b}')).toMatchSnapshot();
  });

  it('Braket-No-Braces-Simple', () => {
    expect(tex2mml('\\braket a|b')).toMatchSnapshot();
  });

  it('Braket-No-Braces-Complex', () => {
    expect(tex2mml('\\braket \\frac{a}{c}|b')).toMatchSnapshot();
  });

  it('Braket-Nested', () => {
    expect(tex2mml('\\braket {\\braket{a|b}c}')).toMatchSnapshot();
  });

  it('Braket-error', () => {
    expectTexError('\\braket').toBe('Missing argument for \\braket');
  });

  it('Braket-braces', () => {
    expectTexError('\\braket{').toBe('Missing close brace');
  });

  it('Braket-braces', () => {
    expectTexError('\\braket}').toBe('Extra close brace or missing open brace');
  });
});

/**********************************************************************************/

afterAll(() => getTokens('braket'));
