Browse Source

add preconditions to opcode

patch-2
Manuel Araoz 10 years ago
parent
commit
81f1469f9a
  1. 11
      lib/opcode.js
  2. 31
      test/opcode.js

11
lib/opcode.js

@ -1,6 +1,7 @@
'use strict'; 'use strict';
var _ = require('lodash'); var _ = require('lodash');
var $ = require('./util/preconditions');
function Opcode(num) { function Opcode(num) {
if (!(this instanceof Opcode)) { if (!(this instanceof Opcode)) {
@ -19,11 +20,13 @@ function Opcode(num) {
} }
Opcode.prototype.set = function(obj) { Opcode.prototype.set = function(obj) {
$.checkArgument(_.isObject(obj));
this.num = typeof obj.num !== 'undefined' ? obj.num : this.num; this.num = typeof obj.num !== 'undefined' ? obj.num : this.num;
return this; return this;
}; };
Opcode.prototype.fromNumber = function(num) { Opcode.prototype.fromNumber = function(num) {
$.checkArgument(_.isNumber(num));
this.num = num; this.num = num;
return this; return this;
}; };
@ -33,9 +36,11 @@ Opcode.prototype.toNumber = function() {
}; };
Opcode.prototype.fromString = function(str) { Opcode.prototype.fromString = function(str) {
$.checkArgument(_.isString(str));
var num = Opcode.map[str]; var num = Opcode.map[str];
if (typeof num === 'undefined') if (typeof num === 'undefined') {
throw new Error('Invalid opcodestr'); throw new Error('Invalid opcodestr');
}
this.num = num; this.num = num;
return this; return this;
}; };
@ -49,9 +54,7 @@ Opcode.prototype.toString = function() {
}; };
Opcode.smallInt = function(n) { Opcode.smallInt = function(n) {
if (!(n >= 0 && n <= 16)) { $.checkArgument(n >= 0 && n <= 16, 'Invalid Argument: n must be between 0 and 16');
throw new Error('Invalid Argument: n must be between 0 and 16');
}
if (n === 0) { if (n === 0) {
return Opcode('OP_0'); return Opcode('OP_0');
} }

31
test/opcode.js

@ -25,52 +25,61 @@ describe('Opcode', function() {
}); });
describe('#fromNumber', function() { describe('#fromNumber', function() {
it('should work for 0', function() { it('should work for 0', function() {
Opcode().fromNumber(0).num.should.equal(0); Opcode().fromNumber(0).num.should.equal(0);
}); });
it('should fail for non-number', function() {
Opcode().fromNumber.bind(null, 'a string').should.throw('Invalid Argument');
});
});
describe('#set', function() {
it('should work for object', function() {
Opcode().set({
num: 42
}).num.should.equal(42);
});
it('should fail for non-object', function() {
Opcode().set.bind(null, 'non-object').should.throw('Invalid Argument');
});
}); });
describe('#toNumber', function() { describe('#toNumber', function() {
it('should work for 0', function() { it('should work for 0', function() {
Opcode().fromNumber(0).toNumber().should.equal(0); Opcode().fromNumber(0).toNumber().should.equal(0);
}); });
}); });
describe('#fromString', function() { describe('#fromString', function() {
it('should work for OP_0', function() { it('should work for OP_0', function() {
Opcode().fromString('OP_0').num.should.equal(0); Opcode().fromString('OP_0').num.should.equal(0);
}); });
it('should fail for invalid string', function() {
Opcode().fromString.bind(null, 'OP_SATOSHI').should.throw('Invalid opcodestr');
Opcode().fromString.bind(null, 'BANANA').should.throw('Invalid opcodestr');
});
it('should fail for non-string', function() {
Opcode().fromString.bind(null, 123).should.throw('Invalid Argument');
});
}); });
describe('#toString', function() { describe('#toString', function() {
it('should work for OP_0', function() { it('should work for OP_0', function() {
Opcode().fromString('OP_0').toString().should.equal('OP_0'); Opcode().fromString('OP_0').toString().should.equal('OP_0');
}); });
}); });
describe('@map', function() { describe('@map', function() {
it('should have a map containing 116 elements', function() { it('should have a map containing 116 elements', function() {
_.size(Opcode.map).should.equal(116); _.size(Opcode.map).should.equal(116);
}); });
}); });
describe('@reverseMap', function() { describe('@reverseMap', function() {
it('should exist and have op 185', function() { it('should exist and have op 185', function() {
should.exist(Opcode.reverseMap); should.exist(Opcode.reverseMap);
Opcode.reverseMap[185].should.equal('OP_NOP10'); Opcode.reverseMap[185].should.equal('OP_NOP10');
}); });
}); });
var smallints = [ var smallints = [
Opcode('OP_0'), Opcode('OP_0'),

Loading…
Cancel
Save