import fs from 'fs';
import path from 'path';

import { parse } from '../src';
import { loadYamlCases } from './loaders/yaml';

const fixturesDir = path.resolve(__dirname, 'fixtures');
const maybe = (condition: Boolean) => (condition ? test : test.skip);

describe('parsing into intermediate representation using grammar', () => {
  test('block.tlb can be parsed', () => {
    expect.hasAssertions();

    const input = fs.readFileSync(path.resolve(fixturesDir, 'tlb', 'block.tlb'), 'utf-8');
    const parsed = parse(input);

    expect(parsed.shortMessage).toBe(undefined);
    expect(parsed.succeeded()).toBe(true);
  });

  for (let caseDef of loadYamlCases(fixturesDir, 'grammar', 'invalid-one-liners.yml')) {
    maybe(!caseDef.skip)(`Generated invalid example: ${caseDef.case}`, () => {
      expect.hasAssertions();

      const parsed = parse(caseDef.code);

      if (caseDef.error !== undefined) {
        expect(parsed.shortMessage).toEqual(caseDef.error);
      } else if (caseDef.errorStart !== undefined) {
        expect(parsed.shortMessage).toMatch(caseDef.errorStart);
      }
      expect(parsed.succeeded()).toBe(false);
    });
  }

  for (let caseDef of loadYamlCases(fixturesDir, 'grammar', 'valid-one-liners.yml')) {
    test(`Generated valid example: ${caseDef.case}`, () => {
      expect.hasAssertions();

      const parsed = parse(caseDef.code);

      expect(parsed.shortMessage).toBe(undefined);
      expect(parsed.succeeded()).toBe(true);
    });
  }
});
