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