diff --git a/source/lib/predicates/number.ts b/source/lib/predicates/number.ts index 33aeb32..a29c33f 100644 --- a/source/lib/predicates/number.ts +++ b/source/lib/predicates/number.ts @@ -167,4 +167,17 @@ export class NumberPredicate extends Predicate { validator: value => is.integer(value) && is.inRange(value, [start, end]) }); } + + /** + * Test a number to be in a valid range for a uint32. + */ + get uint32() { + const start = 0; + const end = 4294967295; + + return this.addValidator({ + message: (value, label) => `Expected ${label} to be an integer in range [${start}..${end}], got ${value}`, + validator: value => is.integer(value) && is.inRange(value, [start, end]) + }); + } } diff --git a/source/test/number.ts b/source/test/number.ts index 38a269d..3d02c84 100644 --- a/source/test/number.ts +++ b/source/test/number.ts @@ -98,3 +98,11 @@ test('number.uint16', t => { t.throws(() => m(1.5, m.number.uint16), 'Expected number to be an integer in range [0..65535], got 1.5'); t.throws(() => m(65536, m.number.uint16), 'Expected number to be an integer in range [0..65535], got 65536'); }); + +test('number.uint32', t => { + t.notThrows(() => m(0, m.number.uint32)); + t.notThrows(() => m(4294967295, m.number.uint32)); + t.throws(() => m(-1, m.number.uint32), 'Expected number to be an integer in range [0..4294967295], got -1'); + t.throws(() => m(1.5, m.number.uint32), 'Expected number to be an integer in range [0..4294967295], got 1.5'); + t.throws(() => m(4294967296, m.number.uint32), 'Expected number to be an integer in range [0..4294967295], got 4294967296'); +});