1 | 'use strict';
|
2 |
|
3 | const is = require('is-type-of');
|
4 | const assert = require('assert');
|
5 | const show = require('./show');
|
6 |
|
7 | class 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 |
|
43 | module.exports = Rule;
|