src/transform/format.js
import fs                  from 'fs-extra';
import { assert }          from 'chai';
import ClassReport         from '../../../src/module/report/ClassReport';
import ClassMethodReport   from '../../../src/module/report/ClassMethodReport';
import ModuleMethodReport  from '../../../src/module/report/ModuleMethodReport';
import ModuleReport        from '../../../src/module/report/ModuleReport';
import ProjectReport       from '../../../src/project/report/ProjectReport';
import TransformFormat     from '../../../src/transform/TransformFormat';
import * as testconfig     from '../testconfig';
// Uncomment to generate matching format test data.
// generateFormatData();
runTests();
/**
 * Runs the tests
 */
function runTests()
{
   if (testconfig.modules['transformFormat'])
   {
      suite('transform:', () =>
      {
         suite('TransformFormat:', () =>
         {
            suite('forEach / formatReport (large-module/module):', () =>
            {
               const largeModuleJSON = require('typhonjs-escomplex-test-data/files/large-module/json/module');
               const moduleReport = ModuleReport.parse(largeModuleJSON);
               TransformFormat.forEach((format, formatName) =>
               {
                  if (TransformFormat.isSupported(formatName, moduleReport.type))
                  {
                     test(`formatName: ${formatName}`, () =>
                     {
                        const output = format.formatReport(moduleReport);
                        const original = fs.readFileSync(
                         `./test/fixture/files/large-module/module/module-${formatName}.${format.extension}`, 'utf8');
                        assert.strictEqual(output, original);
                     });
                  }
               });
            });
            suite('forEach / formatReport (large-project/project-no-modules):', () =>
            {
               const largeProjectJSON = require(
                'typhonjs-escomplex-test-data/files/large-project/json/project-no-modules');
               const projectResult = ProjectReport.parse(largeProjectJSON);
               TransformFormat.forEach((format, formatName) =>
               {
                  if (TransformFormat.isSupported(formatName, projectResult.type))
                  {
                     test(`formatName: ${formatName}`, () =>
                     {
                        const output = format.formatReport(projectResult);
                        const original = fs.readFileSync(
                         `./test/fixture/files/large-project/project-no-modules/project-${formatName}.${
                          format.extension}`, 'utf8');
                        assert.strictEqual(output, original);
                     });
                  }
               });
            });
         });
         suite('ClassReport:', () =>
         {
            suite('toFormat (large-class/class):', () =>
            {
               const largeClassJSON = require('typhonjs-escomplex-test-data/files/large-class/json/class');
               const classReport = ClassReport.parse(largeClassJSON);
               ClassReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = classReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-class/class/class-${format.name}.${format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-module/class-with-errors):', () =>
            {
               const largeClassJSON = require(
                'typhonjs-escomplex-test-data/files/large-class/json/class-with-errors');
               const classReport = ClassReport.parse(largeClassJSON);
               ClassReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = classReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-class/class-with-errors/class-${format.name}.${format.extension}`,
                       'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
         });
         suite('MethodReport:', () =>
         {
            suite('toFormat (large-method/classmethod):', () =>
            {
               const largeMethodJSON = require('typhonjs-escomplex-test-data/files/large-method/json/classmethod');
               const methodReport = ClassMethodReport.parse(largeMethodJSON);
               ClassMethodReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = methodReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-method/classmethod/classmethod-${format.name}.${format.extension}`,
                       'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-method/classmethod-with-errors):', () =>
            {
               const largeMethodJSON = require(
                'typhonjs-escomplex-test-data/files/large-method/json/classmethod-with-errors');
               const methodReport = ClassMethodReport.parse(largeMethodJSON);
               ClassMethodReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = methodReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-method/classmethod-with-errors/classmethod-${format.name}.${
                       format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-method/modulemethod):', () =>
            {
               const largeMethodJSON = require('typhonjs-escomplex-test-data/files/large-method/json/modulemethod');
               const methodReport = ModuleMethodReport.parse(largeMethodJSON);
               ModuleMethodReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = methodReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-method/modulemethod/modulemethod-${format.name}.${format.extension}`,
                       'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-method/modulemethod-with-errors):', () =>
            {
               const largeMethodJSON = require(
                'typhonjs-escomplex-test-data/files/large-method/json/modulemethod-with-errors');
               const methodReport = ModuleMethodReport.parse(largeMethodJSON);
               ModuleMethodReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = methodReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-method/modulemethod-with-errors/modulemethod-${format.name}.${
                       format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
         });
         suite('ModuleReport:', () =>
         {
            suite('toFormat (large-module/module):', () =>
            {
               const largeModuleJSON = require('typhonjs-escomplex-test-data/files/large-module/json/module');
               const moduleReport = ModuleReport.parse(largeModuleJSON);
               ModuleReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = moduleReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-module/module/module-${format.name}.${format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-module/module-with-errors):', () =>
            {
               const largeModuleJSON = require(
                'typhonjs-escomplex-test-data/files/large-module/json/module-with-errors');
               const moduleReport = ModuleReport.parse(largeModuleJSON);
               ModuleReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = moduleReport.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-module/module-with-errors/module-${format.name}.${format.extension}`,
                       'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
         });
         suite('ProjectReport:', () =>
         {
            suite('toFormat (large-project/project):', () =>
            {
               const largeProjectJSON = require('typhonjs-escomplex-test-data/files/large-project/json/project');
               const projectResult = ProjectReport.parse(largeProjectJSON);
               ProjectReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = projectResult.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-project/project/project-${format.name}.${format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-project/project-no-modules):', () =>
            {
               const largeProjectJSON = require(
                'typhonjs-escomplex-test-data/files/large-project/json/project-no-modules');
               const projectResult = ProjectReport.parse(largeProjectJSON);
               ProjectReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = projectResult.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-project/project-no-modules/project-${format.name}.${
                       format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
            suite('toFormat (large-project/project-with-errors):', () =>
            {
               const largeProjectJSON = require(
                'typhonjs-escomplex-test-data/files/large-project/json/project-with-errors');
               const projectResult = ProjectReport.parse(largeProjectJSON);
               ProjectReport.getFormats().forEach((format) =>
               {
                  test(`formatName: ${format.name}`, () =>
                  {
                     const output = projectResult.toFormat(format.name);
                     const original = fs.readFileSync(
                      `./test/fixture/files/large-project/project-with-errors/project-${format.name}.${
                       format.extension}`, 'utf8');
                     assert.strictEqual(output, original);
                  });
               });
            });
         });
      });
   }
}
/**
 * Generates the original module report / project result test data.
 */
/*
function generateFormatData()
{
   // Empty formatted result / report matching test data.
   fs.emptyDirSync('./test/fixture/files/large-class/class');
   fs.emptyDirSync('./test/fixture/files/large-class/class-with-errors');
   fs.emptyDirSync('./test/fixture/files/large-method/classmethod');
   fs.emptyDirSync('./test/fixture/files/large-method/classmethod-with-errors');
   fs.emptyDirSync('./test/fixture/files/large-method/modulemethod');
   fs.emptyDirSync('./test/fixture/files/large-method/modulemethod-with-errors');
   fs.emptyDirSync('./test/fixture/files/large-module/module');
   fs.emptyDirSync('./test/fixture/files/large-module/module-with-errors');
   fs.emptyDirSync('./test/fixture/files/large-project/project');
   fs.emptyDirSync('./test/fixture/files/large-project/project-no-modules');
   fs.emptyDirSync('./test/fixture/files/large-project/project-with-errors');
   // Generate project result formatted test data.
   const largeClassJSON = require('typhonjs-escomplex-test-data/files/large-class/json/class');
   const classReport = ClassReport.parse(largeClassJSON);
   ClassReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(classReport);
         fs.writeFileSync(
          `./test/fixture/files/large-class/class/class-${format.name}.${format.extension}`, output, 'utf8');
      });
   });
   const largeClassJSON2 = require('typhonjs-escomplex-test-data/files/large-class/json/class-with-errors');
   const classReport2 = ClassReport.parse(largeClassJSON2);
   ClassReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(classReport2);
         fs.writeFileSync(
          `./test/fixture/files/large-class/class-with-errors/class-${format.name}.${format.extension}`, output,
           'utf8');
      });
   });
   const largeClassMethodJSON = require('typhonjs-escomplex-test-data/files/large-method/json/classmethod');
   const classMethodReport = ClassMethodReport.parse(largeClassMethodJSON);
   ClassMethodReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(classMethodReport);
         fs.writeFileSync(
          `./test/fixture/files/large-method/classmethod/classmethod-${format.name}.${format.extension}`, output,
           'utf8');
      });
   });
   const largeClassMethodJSON2 = require(
    'typhonjs-escomplex-test-data/files/large-method/json/classmethod-with-errors');
   const classMethodReport2 = ClassMethodReport.parse(largeClassMethodJSON2);
   ClassMethodReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(classMethodReport2);
         fs.writeFileSync(
          `./test/fixture/files/large-method/classmethod-with-errors/classmethod-${format.name}.${format.extension}`,
           output, 'utf8');
      });
   });
   const largeModuleMethodJSON = require('typhonjs-escomplex-test-data/files/large-method/json/modulemethod');
   const moduleMethodReport = ModuleMethodReport.parse(largeModuleMethodJSON);
   ModuleMethodReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(moduleMethodReport);
         fs.writeFileSync(
          `./test/fixture/files/large-method/modulemethod/modulemethod-${format.name}.${format.extension}`, output,
           'utf8');
      });
   });
   const largeModuleMethodJSON2 = require(
    'typhonjs-escomplex-test-data/files/large-method/json/modulemethod-with-errors');
   const moduleMethodReport2 = ModuleMethodReport.parse(largeModuleMethodJSON2);
   ModuleMethodReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(moduleMethodReport2);
         fs.writeFileSync(
          `./test/fixture/files/large-method/modulemethod-with-errors/modulemethod-${format.name}.${format.extension}`,
           output, 'utf8');
      });
   });
   const largeModuleJSON = require('typhonjs-escomplex-test-data/files/large-module/json/module');
   const moduleReport = ModuleReport.parse(largeModuleJSON);
   ModuleReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(moduleReport);
         fs.writeFileSync(
          `./test/fixture/files/large-module/module/module-${format.name}.${format.extension}`, output, 'utf8');
      });
   });
   const largeModuleJSON2 = require('typhonjs-escomplex-test-data/files/large-module/json/module-with-errors');
   const moduleReport2 = ModuleReport.parse(largeModuleJSON2);
   ModuleReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(moduleReport2);
         fs.writeFileSync(
          `./test/fixture/files/large-module/module-with-errors/module-${format.name}.${format.extension}`, output,
           'utf8');
      });
   });
   // Generate module report formatted test data.
   const largeProjectJSON = require('typhonjs-escomplex-test-data/files/large-project/json/project');
   const projectResult = ProjectReport.parse(largeProjectJSON);
   ProjectReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(projectResult);
         fs.writeFileSync(
          `./test/fixture/files/large-project/project/project-${format.name}.${format.extension}`, output, 'utf8');
      });
   });
   const largeProjectJSON2 = require('typhonjs-escomplex-test-data/files/large-project/json/project-no-modules');
   const projectResult2 = ProjectReport.parse(largeProjectJSON2);
   ProjectReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(projectResult2);
         fs.writeFileSync(
          `./test/fixture/files/large-project/project-no-modules/project-${format.name}.${format.extension}`, output,
           'utf8');
      });
   });
   const largeProjectJSON3 = require('typhonjs-escomplex-test-data/files/large-project/json/project-with-errors');
   const projectResult3 = ProjectReport.parse(largeProjectJSON3);
   ProjectReport.getFormats().forEach((format) =>
   {
      test(`generate formatName: ${format.name}`, () =>
      {
         const output = format.formatReport(projectResult3);
         fs.writeFileSync(
          `./test/fixture/files/large-project/project-with-errors/project-${format.name}.${format.extension}`, output,
           'utf8');
      });
   });
}
*/