rule.js 1.1 KB

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