import { assert } from 'chai' import Ruler from '../lib/ruler.mjs' describe('Ruler', function () { it('should replace rule (.at)', function () { const ruler = new Ruler() let res = 0 ruler.push('test', function foo () { res = 1 }) ruler.at('test', function bar () { res = 2 }) const rules = ruler.getRules('') assert.strictEqual(rules.length, 1) rules[0]() assert.strictEqual(res, 2) }) it('should inject before/after rule', function () { const ruler = new Ruler() let res = 0 ruler.push('test', function foo () { res = 1 }) ruler.before('test', 'before_test', function fooBefore () { res = -10 }) ruler.after('test', 'after_test', function fooAfter () { res = 10 }) const rules = ruler.getRules('') assert.strictEqual(rules.length, 3) rules[0]() assert.strictEqual(res, -10) rules[1]() assert.strictEqual(res, 1) rules[2]() assert.strictEqual(res, 10) }) it('should enable/disable rule', function () { const ruler = new Ruler() let rules ruler.push('test', function foo () {}) ruler.push('test2', function bar () {}) rules = ruler.getRules('') assert.strictEqual(rules.length, 2) ruler.disable('test') rules = ruler.getRules('') assert.strictEqual(rules.length, 1) ruler.disable('test2') rules = ruler.getRules('') assert.strictEqual(rules.length, 0) ruler.enable('test') rules = ruler.getRules('') assert.strictEqual(rules.length, 1) ruler.enable('test2') rules = ruler.getRules('') assert.strictEqual(rules.length, 2) }) it('should enable/disable multiple rule', function () { const ruler = new Ruler() let rules ruler.push('test', function foo () {}) ruler.push('test2', function bar () {}) ruler.disable(['test', 'test2']) rules = ruler.getRules('') assert.strictEqual(rules.length, 0) ruler.enable(['test', 'test2']) rules = ruler.getRules('') assert.strictEqual(rules.length, 2) }) it('should enable rules by whitelist', function () { const ruler = new Ruler() ruler.push('test', function foo () {}) ruler.push('test2', function bar () {}) ruler.enableOnly('test') const rules = ruler.getRules('') assert.strictEqual(rules.length, 1) }) it('should support multiple chains', function () { const ruler = new Ruler() let rules ruler.push('test', function foo () {}) ruler.push('test2', function bar () {}, { alt: ['alt1'] }) ruler.push('test2', function bar () {}, { alt: ['alt1', 'alt2'] }) rules = ruler.getRules('') assert.strictEqual(rules.length, 3) rules = ruler.getRules('alt1') assert.strictEqual(rules.length, 2) rules = ruler.getRules('alt2') assert.strictEqual(rules.length, 1) }) it('should fail on invalid rule name', function () { const ruler = new Ruler() ruler.push('test', function foo () {}) assert.throws(function () { ruler.at('invalid name', function bar () {}) }) assert.throws(function () { ruler.before('invalid name', function bar () {}) }) assert.throws(function () { ruler.after('invalid name', function bar () {}) }) assert.throws(function () { ruler.enable('invalid name') }) assert.throws(function () { ruler.disable('invalid name') }) }) it('should not fail on invalid rule name in silent mode', function () { const ruler = new Ruler() ruler.push('test', function foo () {}) assert.doesNotThrow(function () { ruler.enable('invalid name', true) }) assert.doesNotThrow(function () { ruler.enableOnly('invalid name', true) }) assert.doesNotThrow(function () { ruler.disable('invalid name', true) }) }) })