UNPKG

1.16 kBJavaScriptView Raw
1'use strict';
2
3const is = require('is-type-of');
4const assert = require('assert');
5const show = require('./show');
6
7class Rule {
8 constructor({ ctx, type, expected, args, isOpposite }) {
9 this.ctx = ctx;
10 this.type = type;
11 this.expected = [].concat(expected);
12 this.args = args;
13 this.isOpposite = isOpposite === true;
14 }
15
16 validate(message) {
17 const actual = this.ctx[this.type];
18 for (const expected of this.expected) {
19 message = this.formatMessage(actual, expected, message);
20 this.assert(actual, expected, message);
21 }
22 }
23
24 assert(actual, expected, message) {
25 const assertFn = assert[this.isOpposite ? 'notStrictEqual' : 'strictEqual'];
26
27 if (is.regexp(expected)) {
28 return assertFn(expected.test(actual), true, message);
29 }
30
31 return assertFn(actual, expected, message);
32 }
33
34 formatMessage(actual, expected, message) {
35 message = message || `match ${this.type}`;
36 return `should ${this.isOpposite ? 'not ' : ''}${message} expected \`${this.inspectObj(expected)}\` but actual \`${this.inspectObj(actual)}\``;
37 }
38
39 inspectObj(obj) {
40 return show(obj);
41 }
42}
43
44module.exports = Rule;