|
|
- 'use strict';
-
- const where = require('ramda/src/where');
- const includes = require('ramda/src/includes');
- const intersection = require('ramda/src/intersection');
- const pipe = require('ramda/src/pipe');
- const isEmpty = require('ramda/src/isEmpty');
- const complement = require('ramda/src/complement');
- const flip = require('ramda/src/flip');
- const filter = require('ramda/src/filter');
- const over = require('ramda/src/over');
- const lensProp = require('ramda/src/lensProp');
- const map = require('ramda/src/map');
- const view = require('ramda/src/view');
- const assoc = require('ramda/src/assoc');
- const allPass = require('ramda/src/allPass');
-
- const INTERFACES = {
- BDD: 'BDD',
- TDD: 'TDD',
- QUnit: 'QUnit'
- };
-
- const TYPES = {
- suite: 'suite',
- testCase: 'testCase',
- hook: 'hook'
- };
-
- const MODIFIERS = {
- skip: 'skip',
- only: 'only'
- };
-
- const baseNames = [
- { name: 'describe', interfaces: [ INTERFACES.BDD ], type: TYPES.suite },
- { name: 'context', interfaces: [ INTERFACES.BDD ], type: TYPES.suite },
- { name: 'suite', interfaces: [ INTERFACES.TDD, INTERFACES.QUnit ], type: TYPES.suite },
- { name: 'it', interfaces: [ INTERFACES.BDD ], type: TYPES.testCase },
- { name: 'specify', interfaces: [ INTERFACES.BDD ], type: TYPES.testCase },
- { name: 'test', interfaces: [ INTERFACES.TDD, INTERFACES.QUnit ], type: TYPES.testCase },
- { name: 'before', interfaces: [ INTERFACES.BDD, INTERFACES.QUnit ], type: TYPES.hook },
- { name: 'after', interfaces: [ INTERFACES.BDD, INTERFACES.QUnit ], type: TYPES.hook },
- { name: 'beforeEach', interfaces: [ INTERFACES.BDD, INTERFACES.QUnit ], type: TYPES.hook },
- { name: 'afterEach', interfaces: [ INTERFACES.BDD, INTERFACES.QUnit ], type: TYPES.hook },
- { name: 'suiteSetup', interfaces: [ INTERFACES.TDD ], type: TYPES.hook },
- { name: 'suiteTeardown', interfaces: [ INTERFACES.TDD ], type: TYPES.hook },
- { name: 'setup', interfaces: [ INTERFACES.TDD ], type: TYPES.hook },
- { name: 'teardown', interfaces: [ INTERFACES.TDD ], type: TYPES.hook }
- ];
-
- const includesSublist = (sublist) => pipe(intersection(sublist), complement(isEmpty));
- const isIncludedIn = flip(includes);
- const hasMatchingType = (typesToMatch) => where({ type: isIncludedIn(typesToMatch) });
- const hasMatchingInterfaces = (interfacesToMatch) => where({ interfaces: includesSublist(interfacesToMatch) });
- const hasMatchingModifier = (modifierToMatch) => where({ modifier: isIncludedIn(modifierToMatch) });
- const filterTestCasesAndSuites = filter(hasMatchingType([ TYPES.suite, TYPES.testCase ]));
-
- const nameLens = lensProp('name');
- const mapNames = (fn) => map(over(nameLens, fn));
- const extractNames = map(view(nameLens));
- const addModifier = (modifier) => map(assoc('modifier', modifier));
-
- function formatXVariant(name) {
- return `x${name}`;
- }
-
- function formatSkipVariant(name) {
- return `${name}.${MODIFIERS.skip}`;
- }
-
- function formatExclusiveVariant(name) {
- return `${name}.${MODIFIERS.only}`;
- }
-
- const buildXVariants = pipe(
- filterTestCasesAndSuites,
- filter(hasMatchingInterfaces([ INTERFACES.BDD ])),
- mapNames(formatXVariant),
- addModifier(MODIFIERS.skip)
- );
-
- const buildSkipVariants = pipe(
- filterTestCasesAndSuites,
- mapNames(formatSkipVariant),
- addModifier(MODIFIERS.skip)
- );
-
- const buildExclusiveVariants = pipe(
- filterTestCasesAndSuites,
- mapNames(formatExclusiveVariant),
- addModifier(MODIFIERS.only)
- );
-
- function buildAllNames(additionalNames) {
- const names = addModifier(null)([ ...baseNames, ...additionalNames ]);
-
- return [
- ...names,
- ...buildSkipVariants(names),
- ...buildXVariants(names),
- ...buildExclusiveVariants(names)
- ];
- }
-
- function getNamesByType(type, filterOptions = {}) {
- const { modifiers = [], modifiersOnly = false, additionalCustomNames = [] } = filterOptions;
- const allNames = buildAllNames(additionalCustomNames);
- const predicates = [
- hasMatchingType([ type ]),
- hasMatchingModifier([ ...modifiers, ...modifiersOnly ? [] : [ null ] ])
- ];
- const filteredNames = filter(allPass(predicates), allNames);
-
- return extractNames(filteredNames);
- }
-
- function getTestCaseNames(options) {
- return getNamesByType(TYPES.testCase, options);
- }
-
- function getSuiteNames(options) {
- return getNamesByType(TYPES.suite, options);
- }
-
- module.exports = {
- getTestCaseNames,
- getSuiteNames
- };
|