UNPKG

2.22 kBJavaScriptView Raw
1void function(){
2 var test = require('tape')
3 var rt = require('../index.js')
4
5 function expected_number_of_duplicates(n,d){
6 // http://en.wikipedia.org/wiki/Birthday_problem#Collision_counting
7 return n - d + d * Math.pow((d-1)/d,n)
8 }
9
10 test('type', function(t){
11 t.plan(1)
12 t.equal(typeof rt(1), 'string')
13 })
14
15 test('length', function(t){
16 var i = 4
17 t.plan(i+2)
18 while ( i -- ) {
19 var l = Math.pow(i,i)
20 t.equal(rt(l).length, l)
21 }
22 t.equal(rt(-1), undefined)
23 t.equal(rt([]), undefined)
24 })
25
26
27 // This test can sometimes fail if you are very unlucky. Especially for expected dups sizes.
28 // However I wanted to see how the number of duplicates change for different salt, and selection sizes.
29 function testDups(klen, count, salt){
30 var tokgen = rt.create(salt||rt.salt())
31 var exp_dups = expected_number_of_duplicates(count,Math.pow(tokgen.salt().length, klen))
32 // I expect a deviation less than 10% , but
33 // actual deviation in real life is much smaller because the generated sizes of the keys are much larger
34 // which of course results in much less duplicates compared to key generated size
35 var ndups = Math.ceil(exp_dups*1.1)
36 test('number of duplicates less than '+ndups+
37 ' (expected: '+exp_dups+') from '+count+
38 ' keys of length '+klen, function(t){
39 t.plan(1)
40 var i = count
41 var keys = []
42 var duplicates = []
43 var k = ''
44
45 function same(k,c){ return k == c }
46
47 while ( i -- ) {
48 k = tokgen(klen, salt)
49 if ( keys.some(same.bind(null,k)) ) duplicates.push(k)
50 keys.push(k)
51 }
52
53 var msg = '# actual number of duplicates ' + duplicates.length
54 if ( duplicates.length < ndups ) {
55 t.pass(msg)
56 } else {
57 t.fail(msg)
58 }
59 })
60 }
61
62 var abc = 'abcdefghijklmnopqrstuvwxyz'
63 var ABC = abc.toUpperCase()
64 testDups(3,3000)
65 testDups(3,3000, abc)
66 testDups(3,5000, rt.salt()+ABC)
67}()