Skip to content

Instantly share code, notes, and snippets.

@jbenner-radham
Last active February 11, 2024 23:04
Show Gist options
  • Save jbenner-radham/61e576081f17fc5d02b84c87551850c6 to your computer and use it in GitHub Desktop.
Save jbenner-radham/61e576081f17fc5d02b84c87551850c6 to your computer and use it in GitHub Desktop.
An opinionated Jasmine spec generator for AMD modules.

Jasmine Spec Generator

An opinionated Jasmine spec generator for AMD modules.

Installation

$ npm install && chmod +x cli.js

Usage

./cli.js ~/Documents/path/to/an/amd/module.js

Testing

$ npm test

License

The MIT License (Expat).

#!/usr/bin/env node
'use strict';
require('./')();
const acorn = require('acorn');
const fs = require('fs');
module.exports = function () {
'use strict';
let filename = process.argv[2];
let source;
if (!filename) {
console.error('A filename argument is required.');
process.exit(1);
}
try {
source = fs.readFileSync(filename).toString();
} catch (error) {
console.error(error);
process.exit(1);
}
let ast = acorn.parse(source);
let module = ast.body[0].expression.arguments.filter(argument => argument.type === 'FunctionExpression')[0];
let blockStatement = module.body;
let variableDeclarations = blockStatement.body.filter(node => node.type === 'VariableDeclaration')[0];
let publicMembers = variableDeclarations.declarations.filter(declaration => declaration.id.name === 'publicMembers')[0];
let properties = publicMembers.init.properties.filter(property => property.value.type !== 'FunctionExpression');
let methods = publicMembers.init.properties.filter(property => property.value.type === 'FunctionExpression');
let moduleName = source.match(/ @exports ([\w\/]+)/).slice(1, 2).shift();
let propertyNames = properties.map(property => property.key.value).sort();
let methodNames = methods.map(method => method.key.value).sort();
let head = `define(["${moduleName}"], function (module) {` + "\n" +
"\t" + `"use strict"` + "\n";
let specs = methodNames.map(methodName => {
let methodSpec = "\t" + `describe("${methodName}", function () {` + "\n" +
"\t\tit(\"is a function\", function () {\n" +
"\t\t\t" + `expect(module.${methodName}).toEqual(jasmine.any(Function));` + "\n" +
"\t\t});\n" +
"\t});";
return methodSpec;
});
let foot = "});";
console.log(head);
console.log(specs.join("\n\n"));
console.log(foot);
};
{
"name": "jasmine-spec-factory",
"version": "0.0.0",
"dependencies": {
"acorn": {
"version": "3.3.0",
"from": "acorn@latest",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz"
},
"assertion-error": {
"version": "1.0.2",
"from": "assertion-error@>=1.0.1 <2.0.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz"
},
"balanced-match": {
"version": "0.4.2",
"from": "balanced-match@>=0.4.1 <0.5.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz"
},
"brace-expansion": {
"version": "1.1.6",
"from": "brace-expansion@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz"
},
"browser-stdout": {
"version": "1.3.0",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz"
},
"commander": {
"version": "2.9.0",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
},
"concat-map": {
"version": "0.0.1",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
},
"debug": {
"version": "2.2.0",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
},
"deep-eql": {
"version": "0.1.3",
"from": "deep-eql@>=0.1.3 <0.2.0",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
"dependencies": {
"type-detect": {
"version": "0.1.1",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz"
}
}
},
"diff": {
"version": "1.4.0",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz"
},
"escape-string-regexp": {
"version": "1.0.5",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
},
"fs.realpath": {
"version": "1.0.0",
"from": "fs.realpath@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
},
"glob": {
"version": "7.0.5",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz"
},
"graceful-readlink": {
"version": "1.0.1",
"from": "graceful-readlink@>=1.0.0",
"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
},
"growl": {
"version": "1.9.2",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz"
},
"has-flag": {
"version": "1.0.0",
"from": "has-flag@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz"
},
"inflight": {
"version": "1.0.5",
"from": "inflight@>=1.0.4 <2.0.0",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz"
},
"inherits": {
"version": "2.0.1",
"from": "inherits@>=2.0.0 <3.0.0",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
},
"json3": {
"version": "3.3.2",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz"
},
"lodash._baseassign": {
"version": "3.2.0",
"from": "lodash._baseassign@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz"
},
"lodash._basecopy": {
"version": "3.0.1",
"from": "lodash._basecopy@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz"
},
"lodash._basecreate": {
"version": "3.0.3",
"from": "lodash._basecreate@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz"
},
"lodash._getnative": {
"version": "3.9.1",
"from": "lodash._getnative@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz"
},
"lodash._isiterateecall": {
"version": "3.0.9",
"from": "lodash._isiterateecall@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz"
},
"lodash.create": {
"version": "3.1.1",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz"
},
"lodash.isarguments": {
"version": "3.1.0",
"from": "lodash.isarguments@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz"
},
"lodash.isarray": {
"version": "3.0.4",
"from": "lodash.isarray@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz"
},
"lodash.keys": {
"version": "3.1.2",
"from": "lodash.keys@>=3.0.0 <4.0.0",
"resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz"
},
"minimatch": {
"version": "3.0.3",
"from": "minimatch@>=3.0.2 <4.0.0",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz"
},
"minimist": {
"version": "0.0.8",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
},
"mkdirp": {
"version": "0.5.1",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz"
},
"ms": {
"version": "0.7.1",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
},
"once": {
"version": "1.3.3",
"from": "once@>=1.3.0 <2.0.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz"
},
"path-is-absolute": {
"version": "1.0.0",
"from": "path-is-absolute@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz"
},
"supports-color": {
"version": "3.1.2",
"from": "[email protected]",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz"
},
"type-detect": {
"version": "1.0.0",
"from": "type-detect@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz"
},
"wrappy": {
"version": "1.0.2",
"from": "wrappy@>=1.0.0 <2.0.0",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
}
}
}
{
"name": "jasmine-spec-factory",
"bin": {
"jasmine-spec-factory": "./cli.js"
},
"version": "0.0.0",
"description": "An opinionated Jasmine spec generator for AMD modules.",
"main": "index.js",
"scripts": {
"test": "mocha"
},
"author": "James Benner",
"license": "MIT",
"dependencies": {
"acorn": "^3.3.0"
},
"devDependencies": {
"chai": "^3.5.0",
"mocha": "^3.0.2"
}
}
'use strict';
const expect = require('chai').expect;
const jasmineSpecFactory = require('./');
describe('Jasmine Spec Factory', function () {
it('is a function', function () {
expect(jasmineSpecFactory).to.be.a('function');
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment