Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use parameter for declarations, argument for actual values #55

Merged
merged 1 commit into from
Jun 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 5 additions & 5 deletions lib/create-pattern-matchers.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@ const createPatternMatchers = (options) => {
const expression = signatureAst.body[0].expression;
matcher = new CallMatcher(expression, options);
}
const args = matcher.argumentSignatures().map((sig, idx) => {
if (typeof p === 'object' && p !== null && Array.isArray(p.args)) {
return Object.assign({}, sig, p.args[idx]);
const params = matcher.argumentSignatures().map((sig, idx) => {
if (typeof p === 'object' && p !== null && Array.isArray(p.params)) {
return Object.assign({}, sig, p.params[idx]);
}
return sig;
});
const lastParam = args[args.length - 1];
const lastParam = params[params.length - 1];
if (lastParam.name === 'message' && lastParam.kind === 'optional') {
lastParam.message = true;
}
return {
matcher,
index,
pattern,
args
params
};
});
};
Expand Down
68 changes: 64 additions & 4 deletions lib/default-options.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,70 @@ const defaultOptions = () => {
'assert.notEqual(actual, expected, [message])',
'assert.strictEqual(actual, expected, [message])',
'assert.notStrictEqual(actual, expected, [message])',
'assert.deepEqual(actual, expected, [message])',
'assert.notDeepEqual(actual, expected, [message])',
'assert.deepStrictEqual(actual, expected, [message])',
'assert.notDeepStrictEqual(actual, expected, [message])'
{
pattern: 'assert.deepEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.notDeepEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.deepStrictEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.notDeepStrictEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.throws(fn, [error], [message])',
params: [
{ name: 'fn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.doesNotThrow(fn, [error], [message])',
params: [
{ name: 'fn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.rejects(asyncFn, [error], [message])',
params: [
{ name: 'asyncFn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.doesNotReject(asyncFn, [error], [message])',
params: [
{ name: 'asyncFn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
}
]
};
};
Expand Down
6 changes: 3 additions & 3 deletions lib/templates/argument-recorder.json
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "argconf"
"name": "conf"
},
"init": {
"type": "MemberExpression",
Expand All @@ -644,7 +644,7 @@
},
"property": {
"type": "Identifier",
"name": "args"
"name": "params"
},
"computed": false
},
Expand Down Expand Up @@ -686,7 +686,7 @@
"type": "MemberExpression",
"object": {
"type": "Identifier",
"name": "argconf"
"name": "conf"
},
"property": {
"type": "Identifier",
Expand Down
24 changes: 12 additions & 12 deletions templates/argument-recorder.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ module.exports = function () {
* @property {number} line
* @property {number} version
* @property {string} pattern
* @property {array} args
* @property {array} params
* @property {boolean} [async] - true if enclosed in async function
* @property {boolean} [generator] - true if enclosed in generator function
* @property {string} [ast] - stringified AST
Expand All @@ -41,8 +41,8 @@ module.exports = function () {
/**
* record argument value and metadata silently
* @param {function} callee - callee of target argument
* @param {AssertionMetadata} am - tranpiler generated metadata for target assertion
* @param {number} matchIndex - match index of argument
* @param {AssertionMetadata} am - generated metadata for target assertion
* @param {number} matchIndex - index of matched parameter
*/
constructor (callee, am, matchIndex) {
this._callee = callee;
Expand All @@ -51,8 +51,8 @@ module.exports = function () {
this._recorded = null;
this._val = null;
this._idx = matchIndex;
const argconf = am.args[matchIndex];
this._isBlock = !!argconf.block;
const conf = am.params[matchIndex];
this._isBlock = !!conf.block;
}

/**
Expand All @@ -70,17 +70,17 @@ module.exports = function () {
}

/**
* @return {any} - recorded actual value of target argument
* @return {*} - recorded actual value of target argument
*/
val () {
return this._val;
}

/**
* tap capturable node value with its espath then store them as a Log
* @param {any} value - actual value of target node
* @param {*} value - actual value of target node
* @param {string} espath - espath of target node in AST
* @return {any} - the original value
* @return {*} - the original value
*/
_tap (value, espath) {
this._logs.push({
Expand All @@ -93,9 +93,9 @@ module.exports = function () {
/**
* record argument value silently then clear captured logs
* optionally, proxy block argument then store its result as a Log
* @param {any} value - actual value of target argument
* @param {*} value - actual value of target argument
* @param {string} [espath] - espath of target node in AST
* @return {any|ArgumentRecorder} - ArgumentRecorder or actual value of target argument
* @return {*|ArgumentRecorder} - ArgumentRecorder or actual value of target argument
*/
_rec (value, espath) {
const empowered = this._callee && this._callee._empowered;
Expand Down Expand Up @@ -139,13 +139,13 @@ module.exports = function () {

/**
* @typedef {Object} Log
* @property {any} value - recorded actual value of target node
* @property {*} value - recorded actual value of target node
* @property {string} espath - espath of target node in AST
*/

/**
* @typedef {Object} RecordedData
* @property {any} value - recorded actual value of target argument
* @property {*} value - recorded actual value of target argument
* @property {Log[]} logs - recorded Logs
*/

Expand Down
8 changes: 4 additions & 4 deletions templates/assertion-message.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ module.exports = function () {

/**
* @param {AssertionMetadata} am - AssertionMetadata for target assertion
* @param {number} matchIndex - match index of argument
* @param {number} matchIndex - index of matched parameter
* @param {string|ArgumentRecorder} [msgOrRec] - maybe enhanced message
*/
constructor (am, matchIndex, msgOrRec) {
Expand All @@ -44,7 +44,7 @@ module.exports = function () {
}

/**
* @return {any} - maybe enhanced message
* @return {*} - maybe enhanced message
*/
val () {
if (this._msgOrRec && typeof this._msgOrRec.val === 'function') {
Expand All @@ -56,13 +56,13 @@ module.exports = function () {

/**
* @typedef {Object} Log
* @property {any} value - recorded actual value of target node
* @property {*} value - recorded actual value of target node
* @property {string} espath - espath of target node in AST
*/

/**
* @typedef {Object} RecordedData
* @property {any} value - recorded actual value of target argument
* @property {*} value - recorded actual value of target argument
* @property {Log[]} logs - recorded Logs
*/

Expand Down
78 changes: 69 additions & 9 deletions test/espower_option_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,70 @@ describe('espower.defaultOptions()', function () {
'assert.notEqual(actual, expected, [message])',
'assert.strictEqual(actual, expected, [message])',
'assert.notStrictEqual(actual, expected, [message])',
'assert.deepEqual(actual, expected, [message])',
'assert.notDeepEqual(actual, expected, [message])',
'assert.deepStrictEqual(actual, expected, [message])',
'assert.notDeepStrictEqual(actual, expected, [message])'
{
pattern: 'assert.deepEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.notDeepEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.deepStrictEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.notDeepStrictEqual(actual, expected, [message])',
params: [
{ name: 'actual', options: { maxDepth: 2 } },
{ name: 'expected', options: { maxDepth: 2 } },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.throws(fn, [error], [message])',
params: [
{ name: 'fn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.doesNotThrow(fn, [error], [message])',
params: [
{ name: 'fn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.rejects(asyncFn, [error], [message])',
params: [
{ name: 'asyncFn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
},
{
pattern: 'assert.doesNotReject(asyncFn, [error], [message])',
params: [
{ name: 'asyncFn', block: true },
{ name: 'error', block: true },
{ name: 'message', message: true }
]
}
]);
});
});
Expand Down Expand Up @@ -108,7 +168,7 @@ describe('instrumentation tests for options', function () {
]
},
prelude: [
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'refute(value)',args:[{index:0,name:'value',kind:'mandatory'}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'refute(value)',params:[{index:0,name:'value',kind:'mandatory'}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
],
postlude: [
"var _am1=_pwmeta1(0,'refute(falsyStr)','path/to/some_test.js',1);",
Expand All @@ -126,7 +186,7 @@ describe('instrumentation tests for options', function () {
]
},
prelude: [
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'refute.equal(actual, expected)',args:[{index:0,name:'actual',kind:'mandatory'},{index:1,name:'expected',kind:'mandatory'}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'refute.equal(actual, expected)',params:[{index:0,name:'actual',kind:'mandatory'},{index:1,name:'expected',kind:'mandatory'}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
],
postlude: [
"var _am1=_pwmeta1(0,'refute.equal(foo, bar)','path/to/some_test.js',1);",
Expand All @@ -146,7 +206,7 @@ describe('instrumentation tests for options', function () {
]
},
prelude: [
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'browser.assert.element(selection, [message])',args:[{index:0,name:'selection',kind:'mandatory'},{index:1,name:'message',kind:'optional',message:true}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'browser.assert.element(selection, [message])',params:[{index:0,name:'selection',kind:'mandatory'},{index:1,name:'message',kind:'optional',message:true}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
],
postlude: [
"var _am1=_pwmeta1(0,'browser.assert.element(foo)','path/to/some_test.js',1);",
Expand Down Expand Up @@ -336,7 +396,7 @@ describe('lineSeparator', function () {
});

describe('incoming SourceMap support', function () {
const metagen = "var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'assert.equal(actual, expected, [message])',args:[{index:0,name:'actual',kind:'mandatory'},{index:1,name:'expected',kind:'mandatory'},{index:2,name:'message',kind:'optional',message:true}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};";
const metagen = "var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'assert.equal(actual, expected, [message])',params:[{index:0,name:'actual',kind:'mandatory'},{index:1,name:'expected',kind:'mandatory'},{index:2,name:'message',kind:'optional',message:true}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};";

function incomingSourceMapTest (testName, opts) {
it(testName, function () {
Expand Down Expand Up @@ -484,7 +544,7 @@ describe('sourceRoot option', function () {
sourceFile: config.incomingFilepath
},
prelude: [
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'assert(value)',args:[{index:0,name:'value',kind:'mandatory'}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
"var _pwmeta1=(ptnidx,content,filepath,line,extra)=>{const version=2,patterns=[{pattern:'assert(value)',params:[{index:0,name:'value',kind:'mandatory'}]}];return Object.assign({version,content,filepath,line},extra,patterns[ptnidx]);};"
],
postlude: [
`var _am1=_pwmeta1(0,'assert(falsyStr)','${config.filepathInGeneratedCode}',1);`,
Expand Down