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