| 'use strict'; | 
|   | 
| var assert = require('assert'); | 
| var crypto = require('crypto'); | 
| var stream = require('stream'); | 
| var hash = require('../index'); | 
| var validSha1 = /^[0-9a-f]{40}$/i; | 
|   | 
| describe('hash() objects with custom class names', function() { | 
|   var builtinToString; | 
|   beforeEach(function() { | 
|     builtinToString = Object.prototype.toString; | 
|     Object.prototype.toString = function() { | 
|       if (this && typeof this.__className !== 'undefined') { | 
|         return this.__className; | 
|       } | 
|        | 
|       return builtinToString.apply(this, arguments); | 
|     }; | 
|   }); | 
|    | 
|   afterEach(function() { | 
|     Object.prototype.toString = builtinToString; | 
|   }); | 
|    | 
|   it('should throw when trying to hash an unknown object', function() { | 
|     assert.throws(function() { | 
|       hash({a:1, __className: '[object Foo]'}); | 
|     }, /Unknown object type "foo"/); | 
|      | 
|     assert.throws(function() { | 
|       hash({a:1, __className: 'Foo'}); | 
|     }, /Unknown object type/); | 
|   }); | 
|   | 
|   it('should not throw when trying to hash an unknown object with ignoreUnknown', function() { | 
|     var opt = {ignoreUnknown: true}; | 
|      | 
|     assert.ok(validSha1.test(hash({a:1, __className: '[object Foo]'}, opt))); | 
|   }); | 
|   | 
|   it('should not throw when trying to hash a weirdly-named object with ignoreUnknown', function() { | 
|     var opt = {ignoreUnknown: true}; | 
|      | 
|     assert.ok(validSha1.test(hash({a:1, __className: 'Foo'}, opt))); | 
|   }); | 
|    | 
|   it('should not delve further into a number of native types', function() { | 
|     var nativeTypes = [ | 
|       'domwindow', | 
|       'process', 'timer', 'pipe', 'tcp', 'udp', 'tty', 'statwatcher', | 
|       'securecontext', 'connection', 'zlib', 'context', 'nodescript', | 
|       'httpparser', 'dataview', 'signal', 'fsevent', 'tlswrap' | 
|     ]; | 
|      | 
|     for (var i = 0; i < nativeTypes.length; i++) { | 
|       var obj = { foobar: 1, __className: '[object ' + nativeTypes[i] + ']' }; | 
|       var serialized = hash(obj, { algorithm: 'passthrough', encoding: 'utf8' }); | 
|       assert.strictEqual(serialized, nativeTypes[i]); | 
|     } | 
|   }); | 
|    | 
|   it('should hash xml based on its string representation', function() { | 
|     var obj = { | 
|       __className: '[object xml]', | 
|       toString: function() { return 'Bananä' } | 
|     }; | 
|      | 
|     var serialized = hash(obj, { algorithm: 'passthrough', encoding: 'utf8' }); | 
|     assert.strictEqual(serialized, 'xml:Bananä'); | 
|   }); | 
|    | 
|   it('should hash URLs based on its string representation', function() { | 
|     var obj = { | 
|       __className: '[object url]', | 
|       toString: function() { return 'https://example.com/' } | 
|     }; | 
|      | 
|     var serialized = hash(obj, { algorithm: 'passthrough', encoding: 'utf8' }); | 
|     assert.strictEqual(serialized, 'url:https://example.com/'); | 
|   }); | 
|    | 
|   it('should not hash blobs without ignoreUnknown', function() { | 
|     var obj = { | 
|       __className: '[object blob]' | 
|     }; | 
|      | 
|     assert.throws(function() { | 
|       hash(obj); | 
|     }, /not supported/); | 
|   }); | 
|    | 
|   it('should ignore blobs with ignoreUnknown', function() { | 
|     var obj = { | 
|       __className: '[object blob]' | 
|     }; | 
|      | 
|     var serialized = hash(obj, { | 
|       algorithm: 'passthrough', | 
|       encoding: 'utf8', | 
|       ignoreUnknown: true | 
|     }); | 
|      | 
|     assert.strictEqual(serialized, '[blob]'); | 
|   }); | 
| }); |