lawyered.js
A simple lightweight module that allows design by contract.
Installing
npm install lawyered
Summary
This module allows you to run code before and after your methods, giving you the possibility to verify that certain conditions are met. The module relies on conventions to determine which methods should be run as pre/post conditions for a particular method.
- Preconditions methods are expected to append "_pre" to the name of the original method.
- Postconditions methods are expected to append "_post" to the name of the original method.
- The invariant method should be named "_invariant".
Simple cases
var law = require('lawyered');var Assert = require('assert'); var value = 0; var o = law.instrument({ m_pre: function(){ Assert.equal(value, 0); }, m: function(){ value++; }, m_post: function(){ Assert.equal(value, 1); },}); o.m();
Complete scenario
Features:
- All methods (pre, original and post) receive original method parameters.
- Post condition methods receives value returned from original method as last parameter.
- The invariant method runs after every method. It is invoked after the postcondition or the method itself if the method does not have a postcondition.
"use strict"; var law = require('lawyered');var Assert = require('assert'); var value = 0; var positiveNumberAdder = { total: 0, add_pre: function(a, b){ Assert.ok(a > 0); Assert.ok(b > 0); }, add: function(a, b){ var partial = a + b; this.total = partial; return partial; }, add_post: function(a, b, returnValue){ Assert.ok(returnValue > a); Assert.ok(returnValue > b); Assert.equal(a + b, returnValue); }, _invariant: function(){ Assert.ok(this.total > 0); }}; law.instrument(positiveNumberAdder); console.log(positiveNumberAdder.add(10, 15)); // outputs 25console.log(positiveNumberAdder.add(1, 2)); // outputs 3