Home Manual Reference Source Test Repository

src/moduleES6.js

'use strict';

import { assert }       from 'chai';

import parsers          from './parsers';
import * as testconfig  from './testconfig';

if (testconfig.modules['moduleES6'])
{
   parsers.forEach((parser) =>
   {
      suite(`(${parser.name}): module (ES6):`, () =>
      {
         suite('Functions', () =>
         {
            suite('generator functions:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('function* foo() {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, 'foo');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 0);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 1);
               });

               test('methodAggregate has generator function Halstead operator', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('function*'), 0);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 1);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 2);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 2);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 0.5);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 0);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 0);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 0);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 0);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });
         });

         suite('Statements', () =>
         {
            suite('for...of:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('for (let value of [10, 20, 30]) {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has forof Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('forof'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 148.199);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });
         });

         suite('Declarations', () =>
         {
            suite('let / const variable declarations', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('let foo = "bar"; const bar = "foo";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has let and const Halstead operator identifiers', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('let'), 0);
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('const'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 8);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 147.742);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });
         });

         suite('Expressions', () =>
         {
            suite('CallExpression (super):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo {}; class Bar extends Foo { constructor() { super(); } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[1].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.length, 2);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.vocabulary, 2);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.volume, 2);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.effort, 1);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.bugs, 0.001);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.time, 0.056);
               });

               test('methodAggregate has super Halstead operand identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operands.identifiers.indexOf('super'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.875);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('MemberExpression (super):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { constructor() { this.foobar = "foobar"; } }; '
                   + 'class Bar extends Foo { constructor() { let test = super.foobar; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 4);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[1].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 11.61);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 11.61);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.004);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.645);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.length, 6);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.vocabulary, 6);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.difficulty, 1.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.volume, 15.51);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.effort, 23.265);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.bugs, 0.005);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[1].methods[0].halstead.time, 1.292);
               });

               test('methodAggregate has super Halstead operand identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operands.identifiers.indexOf('super'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 9);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 11);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 8);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 20);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 13);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3.438);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 161.224);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ArrayExpression (spread)', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const iter = [2, 3, 4]; const spreadTest = [1, ...iter, 5];');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has `... (spread)` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('... (spread)'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 7);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 8);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 7);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 15);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 11);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.286);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 143.438);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('CallExpression (spread):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const iter = [2, 3, 4]; const foo = (b, a, r) => {}; foo(...iter);');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, '<anonymous>');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 0);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 3);
               });

               test('methodAggregate has `... (spread)` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('... (spread)'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 8);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 6);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 10);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 8);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 18);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 14);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3.75);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 3);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 3);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 4.755);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 0);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.002);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 3);
               });
            });

            suite('ArrowFunctionExpression (explicit):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('(x, y) => { return x + y; };');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, '<anonymous>');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 1);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 2);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 5);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 6);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 4);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 2);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 12);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 24);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.004);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 1.333);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 160.131);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 2);
               });
            });

            suite('ArrowFunctionExpression (implicit):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('(x, y) => x + y;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, '<anonymous>');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 0);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 2);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 6);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 4);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 5);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 3);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 1);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 7.925);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 7.925);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.003);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.44);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 2);
               });
            });

            suite('YieldExpression (yield):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('function* foo() { let index = 0; yield index++; }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 4);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, 'foo');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 3);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 8);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3.333);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 7);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 6);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 3);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 18.095);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 54.284);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.006);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 3.016);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 139.542);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('YieldExpression (yield*):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('function* foo() { yield* [1, 2, 3]; }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, 'foo');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 2);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has generator function Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('function*'), 0);
               });

               test('methodAggregate has delegate yield function Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('yield*'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 5);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 5);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 1);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 11.61);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 11.61);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.004);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.645);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 151.386);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });
         });

         suite('Template Literals', () =>
         {
            suite('TemplateLiteral / TemplateElement (basic):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const foo = `bar`;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 4);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 4);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 163.888);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('TemplateLiteral / TemplateElement (variable):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const baz = "bar"; const foo = `fuz${baz}`;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 6);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.25);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 148.245);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('TemplateLiteral / TemplateElement (function):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const baz = "bar"; const foo = `fuz${JSON.stringify(baz)}`;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 7);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 6);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 13);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.333);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 143.995);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('TaggedTemplateExpression:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const foo = tagged`bar`;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 5);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 5);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.615);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });
         });

         suite('Patterns', () =>
         {
            suite('ObjectPattern (destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const bar = { a: 1, b: 2, c: 3 }; const { a, b, c } = bar;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 8);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 9);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 14);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 7);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 23);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 11);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 4);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 117.604);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ObjectPattern (anonymous destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const { a, b, c } = { a: 1, b: 2, c: 3 };');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 7);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 7);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 12);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 6);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 19);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 4);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 120.559);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ObjectPattern (computed object property names and anonymous destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const id = "z"; const { [id]: foo } = { z: "bar" };');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 4);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 8);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 14);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.4);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 132.577);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ObjectPattern 2 (anonymous destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('let a, b; ({a, b} = { a:1, b:2 });');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 7);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 10);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 16);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 8);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 120.732);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ArrayPattern (destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const foo = [1, 2]; let [a, b] = foo;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate does not have <anonymous> (object) Halstead operand identifier', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.identifiers.indexOf('<anonymous>'), -1);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 12);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.4);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 144.333);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ArrayPattern (anonymous destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('let [a, b] = [1, 2];');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 4);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 8);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 158.971);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('ArrayPattern / RestElement (anonymous destructuring assignment):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const [a, b, ...restTest] = [1, 2, 3, 4, 5];');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has `... (rest)` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('... (rest)'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 8);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 8);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 13);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 12);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 155.491);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('FunctionDeclaration `defaults` (esprima) / AssignmentPattern (espree):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('function foo(first, bar = "baz", ...items) {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, 'foo');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 0);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 3);
               });

               test('methodAggregate has `... (rest)` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('... (rest)'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 5);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 5);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0.5);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 11.61);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 5.805);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.004);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.322);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 3);
               });
            });
         });

         suite('Classes', () =>
         {
            suite('class declaration:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 1);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 1);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 2);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 2);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 0.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ superclass:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Bar {} class Foo extends Bar {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 1);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 5);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 3);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 0.75);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 153.675);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ constructor:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { constructor() { this.bar = 1; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 11.61);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 11.61);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.004);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.645);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.615);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { bar() { this.baz = 1; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 11.61);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 11.61);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.004);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.645);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.615);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ computed generator function method and computed delegated yield:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze(`class Foo { *[foo + baz]() { yield 'x'; yield* [bar.biz](); yield 'y'; } }`);
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 7);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~foo + baz>');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 6);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 10);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 9);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 2.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 31.699);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 79.248);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.011);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 4.403);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 9);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 8);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 7);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 7);
               });

               test('methodAggregate has correct Halstead operand identifiers', () =>
               {
                  assert.strictEqual(JSON.stringify(report.methodAggregate.halstead.operands.identifiers),
                   '["Foo","foo","baz","\\"x\\"","bar","biz","\\"y\\""]');
               });

               test('methodAggregate has correct Halstead operator identifiers', () =>
               {
                  assert.strictEqual(JSON.stringify(report.methodAggregate.halstead.operators.identifiers),
                   '["class","+","function*","yield","yield*","()","[]","."]');
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 16);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 15);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 4);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 127.019);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ computed (string) method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze(`class Foo { ['bar']() { this.baz = 1; } }`);
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 11.61);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 11.61);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.004);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.645);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.615);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ computed (variable) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [bar]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~bar>');
               });
            });

            suite('class declaration w/ computed (2 variable concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo+bar]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~foo + bar>');
               });
            });

            suite('class declaration w/ computed (3 variable concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo+bar+biz]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~foo + bar + biz>');
               });
            });

            suite('class declaration w/ computed (2 variable + literal concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo+bar+'biz']() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, `<computed~foo + bar + 'biz'>`);
               });
            });

            suite('class declaration w/ computed (2 variable + numerical concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo+bar+2]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, `<computed~foo + bar + 2>`);
               });
            });

            suite('class declaration w/ computed (2 variable + numerical concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo+bar+true]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, `<computed~foo + bar + true>`);
               });
            });

            suite('class declaration w/ computed (2 variable + null concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo+bar+null]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, `<computed~foo + bar + null>`);
               });
            });

            suite('class declaration w/ computed (Symbol / 2 member expression) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [Symbol.iterator]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~Symbol.iterator>');
               });
            });

            suite('class declaration w/ computed (3 member expression) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo.bar.biz]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~foo.bar.biz>');
               });
            });

            suite('class declaration w/ computed (2 member expression + concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo.bar+biz]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~foo.bar + biz>');
               });
            });

            suite('class declaration w/ computed (2 member expression + concatenation with method called) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze(`class Foo { [foo.bar+biz.toLowerCase()]() { this.baz = 1; } }`);
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~foo.bar + biz.toLowerCase()>');
               });
            });

            suite('class declaration w/ computed (template literal) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze('class Foo { [`${foo}`]() { this.baz = 1; } }');
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~`${foo}`>');
               });
            });

            suite('class declaration w/ computed (template literal + concatenation) method:', () =>
            {
               test('class method has correct name', () =>
               {
                  const report = parser.analyze('class Foo { [`${foo}`+bar]() { this.baz = 1; } }');
                  assert.strictEqual(report.classes[0].methods[0].name, '<computed~`${foo}` + bar>');
               });
            });

            suite('class declaration w/ getter method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { get bar() { return "bar"; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 2);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 2);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 2);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 1);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.001);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.056);
               });

               test('methodAggregate has `get` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('get'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ setter method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { set bar(data) { this._bar = data; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 1);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 6);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1.333);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 13.932);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 18.575);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.005);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 1.032);
               });

               test('methodAggregate has `set` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('set'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 11);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 161.007);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 1);
               });
            });

            suite('class declaration w/ static method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { static bar() { return "bar"; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 2);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 2);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 2);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 1);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.001);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.056);
               });

               test('methodAggregate has `static` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('static'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class declaration w/ constructor + meta property:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('class Foo { constructor() { new.target.name; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 4);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 10);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 5);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.003);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.278);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 8);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 165.496);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 1);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 4);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 4);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 151.273);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression (named):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class Foo {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 1);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 5);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 4);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 148.139);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression w/ superclass:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Bar = class {}; const Foo = class extends Bar {};');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 4);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 5);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.25);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 135.373);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression (named) w/ superclass:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Bar = class Bar {}; const Foo = class Foo extends Bar {};');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 4);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 11);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 5);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3.75);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 132.94);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression w/ constructor:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class { constructor() { this.bar = 1; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 11.61);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 11.61);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.004);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.645);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 11);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.615);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression w/ method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class { bar() { this.baz = 1; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 11.61);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 11.61);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.004);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.645);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 11);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.615);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression w/ getter method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class { get bar() { return "bar"; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 2);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 2);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 2);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 1);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.001);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.056);
               });

               test('methodAggregate has `get` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('get'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 6);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression w/ setter method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class { set bar(data) { this._bar = data; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 1);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 6);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 5);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 1.333);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 13.932);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 18.575);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.005);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 1.032);
               });

               test('methodAggregate has `set` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('set'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 7);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 6);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 13);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 11);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3.6);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 161.007);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 1);
               });
            });

            suite('class expression w/ static method:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class { static bar() { return "bar"; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'bar');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 2);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 2);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 2);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 1);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.001);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.056);
               });

               test('methodAggregate has `static` Halstead operator identifier', () =>
               {
                  assert.isAtLeast(report.methodAggregate.halstead.operators.identifiers.indexOf('static'), 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 6);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 9);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('class expression w/ constructor + meta property:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const Foo = class { constructor() { new.target.name; } }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 3);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('class methods has correct length', () =>
               {
                  assert.lengthOf(report.classes[0].methods, 1);
               });

               test('class method has correct name', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].name, 'constructor');
               });

               test('class method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.physical, 1);
               });

               test('class method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].sloc.logical, 1);
               });

               test('class method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].cyclomatic, 1);
               });

               test('class method has correct parameter count', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].params, 0);
               });

               test('class method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.length, 5);
               });

               test('class method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.vocabulary, 4);
               });

               test('class method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.difficulty, 0.5);
               });

               test('class method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.volume, 10);
               });

               test('class method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.effort, 5);
               });

               test('class method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.bugs, 0.003);
               });

               test('class method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.classes[0].methods[0].halstead.time, 0.278);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 5);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 11);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 165.496);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });
         });

         suite('Modules', () =>
         {
            suite('export all from import:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('export * from "module";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 1);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 3);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 3);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export default class declaration:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('export default class Foo {}');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 1);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 1);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 1);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 4);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 4);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.5);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 162.502);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export default function declaration:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('export default function foo () { return "bar"; }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, 'foo');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 1);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 6);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 6);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 2);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 2);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0.5);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 2);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 1);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.001);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.056);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export named from import:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('export { foo, bar } from "module";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 5);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1.667);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export named function declaration:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('export function foo () { return "bar"; }');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, 'foo');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 1);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 6);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 6);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 2);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 2);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0.5);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 2);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 1);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.001);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.056);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export default arrow function declaration:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const s_FOO = () => { return "bar"; }; export default s_FOO;');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, '<anonymous>');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 1);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 6);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 9);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 8);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 4.5);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 2);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 2);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0.5);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 2);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 1);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.001);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.056);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export named arrow function declaration:', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const s_FOO = () => { return "bar"; }; export { s_FOO };');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, '<anonymous>');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 1);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 6);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 10);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 8);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 6);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 2);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 2);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0.5);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 2);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 1);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.001);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.056);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('export named arrow function declaration (aliased):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('const s_FOO = () => { return "bar"; }; export { s_FOO as s_BAR };');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 2);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 1);
               });

               test('method has correct name', () =>
               {
                  assert.strictEqual(report.methods[0].name, '<anonymous>');
               });

               test('method has correct physical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.physical, 1);
               });

               test('method has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methods[0].sloc.logical, 1);
               });

               test('method has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methods[0].cyclomatic, 1);
               });

               test('method has correct parameter count', () =>
               {
                  assert.strictEqual(report.methods[0].params, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 7);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 7);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 11);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 10);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 4.667);
               });

               test('method has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.length, 2);
               });

               test('method has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.vocabulary, 2);
               });

               test('method has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.difficulty, 0.5);
               });

               test('method has correct Halstead volume', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.volume, 2);
               });

               test('method has correct Halstead effort', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.effort, 1);
               });

               test('method has correct Halstead bugs', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.bugs, 0.001);
               });

               test('method has correct Halstead time', () =>
               {
                  assert.strictEqual(report.methods[0].halstead.time, 0.056);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct parameter count', () =>
               {
                  assert.strictEqual(report.methodAggregate.params, 0);
               });
            });

            suite('import default (1):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('import foo from "module";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 4);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 4);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct dependency length', () =>
               {
                  assert.lengthOf(report.dependencies, 1);
               });

               test('methodAggregate has correct dependency entry[0] line', () =>
               {
                  assert.strictEqual(report.dependencies[0].line, 1);
               });

               test('methodAggregate has correct dependency entry[0] path', () =>
               {
                  assert.strictEqual(report.dependencies[0].path, 'module');
               });

               test('methodAggregate has correct dependency entry[0] type', () =>
               {
                  assert.strictEqual(report.dependencies[0].type, 'esm');
               });
            });

            suite('import default (3):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze(
                     'import foo from "./foo.js";\nimport bar from "./bar.js";\nimport baz from "./baz.js";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 2);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 6);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 6);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 12);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 8);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 1);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct dependency length', () =>
               {
                  assert.lengthOf(report.dependencies, 3);
               });

               test('methodAggregate has correct dependency entry[0] line', () =>
               {
                  assert.strictEqual(report.dependencies[0].line, 1);
               });

               test('methodAggregate has correct dependency entry[0] path', () =>
               {
                  assert.strictEqual(report.dependencies[0].path, './foo.js');
               });

               test('methodAggregate has correct dependency entry[0] type', () =>
               {
                  assert.strictEqual(report.dependencies[0].type, 'esm');
               });

               test('methodAggregate has correct dependency entry[1] line', () =>
               {
                  assert.strictEqual(report.dependencies[1].line, 2);
               });

               test('methodAggregate has correct dependency entry[1] path', () =>
               {
                  assert.strictEqual(report.dependencies[1].path, './bar.js');
               });

               test('methodAggregate has correct dependency entry[1] type', () =>
               {
                  assert.strictEqual(report.dependencies[1].type, 'esm');
               });

               test('methodAggregate has correct dependency entry[2] line', () =>
               {
                  assert.strictEqual(report.dependencies[2].line, 3);
               });

               test('methodAggregate has correct dependency entry[2] path', () =>
               {
                  assert.strictEqual(report.dependencies[2].path, './baz.js');
               });

               test('methodAggregate has correct dependency entry[2] type', () =>
               {
                  assert.strictEqual(report.dependencies[2].type, 'esm');
               });
            });

            suite('import named (1):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('import {baz} from "module";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 3);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 6);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 5);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2.25);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct dependency length', () =>
               {
                  assert.lengthOf(report.dependencies, 1);
               });

               test('methodAggregate has correct dependency entry[0] line', () =>
               {
                  assert.strictEqual(report.dependencies[0].line, 1);
               });

               test('methodAggregate has correct dependency entry[0] path', () =>
               {
                  assert.strictEqual(report.dependencies[0].path, 'module');
               });

               test('methodAggregate has correct dependency entry[0] type', () =>
               {
                  assert.strictEqual(report.dependencies[0].type, 'esm');
               });
            });

            suite('import named as (1):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('import {foo as bar} from "module";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 4);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 3);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 3);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 7);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct dependency length', () =>
               {
                  assert.lengthOf(report.dependencies, 1);
               });

               test('methodAggregate has correct dependency entry[0] line', () =>
               {
                  assert.strictEqual(report.dependencies[0].line, 1);
               });

               test('methodAggregate has correct dependency entry[0] path', () =>
               {
                  assert.strictEqual(report.dependencies[0].path, 'module');
               });

               test('methodAggregate has correct dependency entry[0] type', () =>
               {
                  assert.strictEqual(report.dependencies[0].type, 'esm');
               });
            });

            suite('import namespace (1):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze('import * as foo from "mod.js";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 5);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 4);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 2);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 2);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 7);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 6);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 2);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct dependency length', () =>
               {
                  assert.lengthOf(report.dependencies, 1);
               });

               test('methodAggregate has correct dependency entry[0] line', () =>
               {
                  assert.strictEqual(report.dependencies[0].line, 1);
               });

               test('methodAggregate has correct dependency entry[0] path', () =>
               {
                  assert.strictEqual(report.dependencies[0].path, 'mod.js');
               });

               test('methodAggregate has correct dependency entry[0] type', () =>
               {
                  assert.strictEqual(report.dependencies[0].type, 'esm');
               });
            });

            suite('import mixed (4):', () =>
            {
               let report;

               setup(() =>
               {
                  report = parser.analyze(
                     'import foo from "./foo.js";\nimport {bar} from "./bar.js";\n'
                   + 'import {bar as baz} from "./bar.js";\nimport * as bam from "./bam.js";');
               });

               teardown(() =>
               {
                  report = undefined;
               });

               test('methodAggregate has correct logical lines of code', () =>
               {
                  assert.strictEqual(report.methodAggregate.sloc.logical, 0);
               });

               test('methodAggregate has correct cyclomatic complexity', () =>
               {
                  assert.strictEqual(report.methodAggregate.cyclomatic, 1);
               });

               test('functions has correct length', () =>
               {
                  assert.lengthOf(report.methods, 0);
               });

               test('methodAggregate has correct Halstead total operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.total, 14);
               });

               test('methodAggregate has correct Halstead distinct operators', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operators.distinct, 5);
               });

               test('methodAggregate has correct Halstead total operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.total, 10);
               });

               test('methodAggregate has correct Halstead distinct operands', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.operands.distinct, 7);
               });

               test('methodAggregate has correct Halstead length', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.length, 24);
               });

               test('methodAggregate has correct Halstead vocabulary', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.vocabulary, 12);
               });

               test('methodAggregate has correct Halstead difficulty', () =>
               {
                  assert.strictEqual(report.methodAggregate.halstead.difficulty, 3.571);
               });

               test('maintainability index is correct', () =>
               {
                  assert.strictEqual(report.maintainability, 171);
               });

               test('methodAggregate has correct dependency length', () =>
               {
                  assert.lengthOf(report.dependencies, 4);
               });

               test('methodAggregate has correct dependency entry[0] line', () =>
               {
                  assert.strictEqual(report.dependencies[0].line, 1);
               });

               test('methodAggregate has correct dependency entry[0] path', () =>
               {
                  assert.strictEqual(report.dependencies[0].path, './foo.js');
               });

               test('methodAggregate has correct dependency entry[0] type', () =>
               {
                  assert.strictEqual(report.dependencies[0].type, 'esm');
               });

               test('methodAggregate has correct dependency entry[1] line', () =>
               {
                  assert.strictEqual(report.dependencies[1].line, 2);
               });

               test('methodAggregate has correct dependency entry[1] path', () =>
               {
                  assert.strictEqual(report.dependencies[1].path, './bar.js');
               });

               test('methodAggregate has correct dependency entry[1] type', () =>
               {
                  assert.strictEqual(report.dependencies[1].type, 'esm');
               });

               test('methodAggregate has correct dependency entry[2] line', () =>
               {
                  assert.strictEqual(report.dependencies[2].line, 3);
               });

               test('methodAggregate has correct dependency entry[2] path', () =>
               {
                  assert.strictEqual(report.dependencies[2].path, './bar.js');
               });

               test('methodAggregate has correct dependency entry[2] type', () =>
               {
                  assert.strictEqual(report.dependencies[2].type, 'esm');
               });

               test('methodAggregate has correct dependency entry[3] line', () =>
               {
                  assert.strictEqual(report.dependencies[3].line, 4);
               });

               test('methodAggregate has correct dependency entry[3] path', () =>
               {
                  assert.strictEqual(report.dependencies[3].path, './bam.js');
               });

               test('methodAggregate has correct dependency entry[3] type', () =>
               {
                  assert.strictEqual(report.dependencies[3].type, 'esm');
               });
            });
         });
      });
   });
}