1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- '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;
|