This repository has been archived on 2024-07-27. You can view files and clone it, but cannot push or open issues or pull requests.
keksAccountGUI/node_modulesOLD/object-hash/test/types.js

175 lines
6.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
var assert = require('assert');
var crypto = require('crypto');
var hash = require('../index');
var validSha1 = /^[0-9a-f]{40}$/i;
describe('hash()ing different types', function() {
it('hashes non-object types', function() {
var func = function(a){ return a + 1; };
assert.ok(validSha1.test(hash('Shazbot!')), 'hash string');
assert.ok(validSha1.test(hash(42)), 'hash number');
assert.ok(validSha1.test(hash(NaN)), 'hash bool');
assert.ok(validSha1.test(hash(true)), 'hash bool');
assert.ok(validSha1.test(hash(func)), 'hash function');
});
it('hashes special object types', function() {
var dt = new Date();
dt.setDate(dt.getDate() + 1);
assert.ok(validSha1.test(hash([1,2,3,4])), 'hash array');
assert.notEqual(hash([1,2,3,4]), hash([4,3,2,1]), 'different arrays not equal');
assert.ok(validSha1.test(hash(new Date())), 'hash date');
assert.notEqual(hash(new Date()), hash(dt), 'different dates not equal');
assert.ok(validSha1.test(hash(null)), 'hash Null');
assert.ok(validSha1.test(hash(Number.NaN)), 'hash NaN');
assert.ok(validSha1.test(hash({ foo: undefined })), 'hash Undefined value');
assert.ok(validSha1.test(hash(new RegExp())), 'hash regex');
assert.ok(validSha1.test(hash(new Error())), 'hash error');
});
it('hashes node.js-internal object types', function() {
if (typeof process !== 'undefined') {
assert.ok(validSha1.test(hash(process)), 'hash process');
}
var timer = setTimeout(function() {}, 0);
assert.ok(validSha1.test(hash(timer)), 'hash timer');
});
if (typeof Symbol !== 'undefined') {
it('hashes Symbols', function() {
assert.ok(validSha1.test(hash(Symbol('Banana'))), 'hash error');
});
}
if (typeof Buffer !== 'undefined') {
it("Buffers can be hashed", function() {
assert.ok(validSha1.test(hash(new Buffer('Banana'))), 'hashes Buffers');
});
}
if (typeof Uint8Array !== 'undefined') {
it("Typed arrays can be hashed", function() {
assert.ok(validSha1.test(hash(new Uint8Array([1,2,3,4]))), 'hashes Uint8Array');
assert.ok(validSha1.test(hash(new Int8Array([1,2,3,4]))), 'hashes Int8Array');
assert.ok(validSha1.test(hash(new Uint16Array([1,2,3,4]))), 'hashes Uint16Array');
assert.ok(validSha1.test(hash(new Int16Array([1,2,3,4]))), 'hashes Int16Array');
assert.ok(validSha1.test(hash(new Uint32Array([1,2,3,4]))), 'hashes Uint32Array');
assert.ok(validSha1.test(hash(new Int32Array([1,2,3,4]))), 'hashes Int32Array');
assert.ok(validSha1.test(hash(new Float32Array([1,2,3,4]))), 'hashes Float32Array');
if (typeof Float64Array !== 'undefined')
assert.ok(validSha1.test(hash(new Float64Array([1,2,3,4]))), 'hashes Float64Array');
if (typeof Uint8ClampedArray !== 'undefined')
assert.ok(validSha1.test(hash(new Uint8ClampedArray([1,2,3,4]))), 'hashes Uint8ClampedArray');
assert.ok(validSha1.test(hash(new Uint8Array([1,2,3,4]).buffer)), 'hashes ArrayBuffer');
});
}
if (typeof Map !== 'undefined') {
it("Maps can be hashed", function() {
var map = new Map([['a',1],['b',2]]);
assert.ok(validSha1.test(hash(map)), 'hashes Maps');
});
}
if (typeof WeakMap !== 'undefined') {
it("WeakMaps cant be hashed", function() {
var map = new WeakMap([[{foo: 'bar'},1]]);
assert.throws(function() {
validSha1.test(hash(map))
}, 'does not hash WeakMaps');
});
}
if (typeof Set !== 'undefined') {
it("Sets can be hashed", function() {
var set = new Set(['you', 'du', 'tu', 'あなた', '您']);
assert.ok(validSha1.test(hash(set)), 'hashes Sets');
});
}
if (typeof WeakSet !== 'undefined') {
it("WeakSets cant be hashed", function() {
var obj = {foo: 'bar'};
var set = new WeakSet([obj]);
assert.throws(function() {
validSha1.test(hash(set))
}, 'does not hash WeakSets');
});
}
it("Builtin types themselves can be hashed", function() {
var hashcount = {};
var types = [Object, Date, Number, String, Function, RegExp,
Error, 0, null, NaN];
if (typeof WeakSet !== 'undefined') types.push(WeakSet);
if (typeof Set !== 'undefined') types.push(Set);
if (typeof WeakMap !== 'undefined') types.push(WeakMap);
if (typeof Map !== 'undefined') types.push(Map);
if (typeof Symbol !== 'undefined') types.push(Symbol);
if (typeof Uint8Array !== 'undefined') types.push(Uint8Array);
// Hash each type
for (var idx in types) {
var h = hash(types[idx]);
assert.ok(validSha1.test(h));
hashcount[h] = (hashcount[h] || 0) + 1;
}
// Check for collisions
var no = 0;
for (var h in hashcount) {
assert.equal(hashcount[h], 1);
no++;
}
// Self check; did we really hash all the types?
assert.equal(no, types.length);
});
it("Builtin types might result in identical hashes with respectFunctionNames = false", function() {
var hashcount = {};
var types = [Object, Date, Number, String, Function, RegExp,
Error, 0, null, NaN];
if (typeof WeakSet !== 'undefined') types.push(WeakSet);
if (typeof Set !== 'undefined') types.push(Set);
if (typeof WeakMap !== 'undefined') types.push(WeakMap);
if (typeof Map !== 'undefined') types.push(Map);
if (typeof Symbol !== 'undefined') types.push(Symbol);
if (typeof Uint8Array !== 'undefined') types.push(Uint8Array);
// Hash each type
for (var idx in types) {
var h = hash(types[idx], { respectFunctionNames: false });
assert.ok(validSha1.test(h));
hashcount[h] = (hashcount[h] || 0) + 1;
}
// Check for collisions
var no = 0;
for (var h in hashcount) {
assert.ok(hashcount[h] >= 1);
no += hashcount[h];
}
// Self check; did we really hash all the types?
assert.equal(no, types.length);
});
it("Functions with identical bodies and different names result in identical hashes with respectFunctionNames = false", function() {
var fn1 = function a() {};
var fn2 = function b() {};
var toStringDummy = function() { return '...'; };
fn1.toString = toStringDummy;
fn2.toString = toStringDummy;
var h1 = hash(fn1, { respectFunctionNames: false });
var h2 = hash(fn2, { respectFunctionNames: false });
assert.strictEqual(h1, h2);
});
});