UNPKG

1.13 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, isOpposite }) {
9 this.ctx = ctx;
10 this.type = type;
11 this.expected = [].concat(expected);
12 this.isOpposite = isOpposite === true;
13 }
14
15 validate(message) {
16 const actual = this.ctx[this.type];
17 for (const expected of this.expected) {
18 message = this.formatMessage(actual, expected, message);
19 this.assert(actual, expected, message);
20 }
21 }
22
23 assert(actual, expected, message) {
24 const assertFn = assert[this.isOpposite ? 'notStrictEqual' : 'strictEqual'];
25
26 if (is.regexp(expected)) {
27 return assertFn(expected.test(actual), true, message);
28 }
29
30 return assertFn(actual, expected, message);
31 }
32
33 formatMessage(actual, expected, message) {
34 message = message || `match ${this.type}`;
35 return `should ${this.isOpposite ? 'not ' : ''}${message} expected \`${this.inspectObj(expected)}\` but actual \`${this.inspectObj(actual)}\``;
36 }
37
38 inspectObj(obj) {
39 return show(obj);
40 }
41}
42
43module.exports = Rule;