'use strict';

delete require.cache[require.resolve('../../build')];
delete require.cache[require.resolve('../../build/lib/core')];

const fs = require('fs').promises;
const hljs = require('../../build');
hljs.debugMode(); // tests run in debug mode so errors are raised
const path = require('path');
const utility = require('../utility');
const { getThirdPartyPackages } = require('../../tools/lib/external_language');

function testAutoDetection(language, { detectPath }) {
  const languagePath = detectPath || utility.buildPath('detect', language);

  it(`should be detected as ${language}`, async() => {
    const dir = await fs.stat(languagePath);
    dir.isDirectory().should.be.true();

    const filenames = await fs.readdir(languagePath);
    await Promise.all(filenames
      .map(async function(example) {
        const filename = path.join(languagePath, example);

        const content = await fs.readFile(filename, 'utf-8');
        const detectedLanguage = hljs.highlightAuto(content).language;

        detectedLanguage.should.equal(language,
          `${path.basename(filename)} should be detected as ${language}, but was ${detectedLanguage}`);
      }));
  });
}

describe('hljs.highlightAuto()', () => {
  before(async function() {
    const thirdPartyPackages = await getThirdPartyPackages();

    const languages = hljs.listLanguages();
    describe(`hljs.highlightAuto()`, function() {
      languages.filter(hljs.autoDetection).forEach((language) => {
        const detectPath = detectTestDir(language);
        testAutoDetection(language, { detectPath });
      });
    });

    // assumes only one package provides the requested module name
    function detectTestDir(name) {
      for (let i = 0; i < thirdPartyPackages.length; ++i) {
        const pkg = thirdPartyPackages[i];
        const idx = pkg.names.indexOf(name);
        if (idx !== -1) return pkg.detectTestPaths[idx];
      }
      return null; // test not found
    }
  });

  it("compiling the grammars", async function() {
    const languages = hljs.listLanguages();
    languages.forEach(lang => hljs.highlight("", { language: lang} ))
  }); // this is also required for the dynamic test generation above to work
});