blob: 6230629bc917b6f9e6be5057b7a856b175e3dbbb [file] [log] [blame]
// Copyright 2008 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
goog.provide('goog.crypt.hash32Test');
goog.setTestOnly('goog.crypt.hash32Test');
goog.require('goog.crypt.hash32');
goog.require('goog.testing.TestCase');
goog.require('goog.testing.jsunit');
// NOTE: This test uses a custom test case, see end of script block
// Test data based on known input/output pairs generated using
// http://go/hash.java
function testEncodeInteger() {
assertEquals(898813988, goog.crypt.hash32.encodeInteger(305419896));
}
function testEncodeByteArray() {
assertEquals(-1497024495,
goog.crypt.hash32.encodeByteArray([10, 20, 30, 40]));
assertEquals(-961586214,
goog.crypt.hash32.encodeByteArray([3, 1, 4, 1, 5, 9]));
assertEquals(-1482202299,
goog.crypt.hash32.encodeByteArray([127, 0, 0, 0, 123, 45]));
assertEquals(170907881,
goog.crypt.hash32.encodeByteArray([9, 1, 1]));
}
function testKnownByteArrays() {
for (var i = 0; i < byteArrays.length; i++) {
assertEquals(byteArrays[i],
goog.crypt.hash32.encodeByteArray(createByteArray(i)));
}
}
function testEncodeString() {
assertEquals(-937588052, goog.crypt.hash32.encodeString('Hello, world'));
assertEquals(62382810, goog.crypt.hash32.encodeString('Sch\xF6n'));
}
function testEncodeStringUtf8() {
assertEquals(-937588052,
goog.crypt.hash32.encodeStringUtf8('Hello, world'));
assertEquals(-833263351, goog.crypt.hash32.encodeStringUtf8('Sch\xF6n'));
assertEquals(-1771620293, goog.crypt.hash32.encodeStringUtf8(
'\u043A\u0440'));
}
function testEncodeString_ascii() {
assertEquals('For ascii characters UTF8 should be the same',
goog.crypt.hash32.encodeStringUtf8('abc123'),
goog.crypt.hash32.encodeString('abc123'));
assertEquals('For ascii characters UTF8 should be the same',
goog.crypt.hash32.encodeStringUtf8('The,quick.brown-fox'),
goog.crypt.hash32.encodeString('The,quick.brown-fox'));
assertNotEquals('For non-ascii characters UTF-8 encoding is different',
goog.crypt.hash32.encodeStringUtf8('Sch\xF6n'),
goog.crypt.hash32.encodeString('Sch\xF6n'));
}
function testEncodeString_poe() {
var poe = "Once upon a midnight dreary, while I pondered weak and weary," +
"Over many a quaint and curious volume of forgotten lore," +
"While I nodded, nearly napping, suddenly there came a tapping," +
"As of some one gently rapping, rapping at my chamber door." +
"`'Tis some visitor,' I muttered, `tapping at my chamber door -" +
"Only this, and nothing more.'" +
"Ah, distinctly I remember it was in the bleak December," +
"And each separate dying ember wrought its ghost upon the floor." +
"Eagerly I wished the morrow; - vainly I had sought to borrow" +
"From my books surcease of sorrow - sorrow for the lost Lenore -" +
"For the rare and radiant maiden whom the angels named Lenore -" +
"Nameless here for evermore." +
"And the silken sad uncertain rustling of each purple curtain" +
"Thrilled me - filled me with fantastic terrors never felt before;" +
"So that now, to still the beating of my heart, I stood repeating" +
"`'Tis some visitor entreating entrance at my chamber door -" +
"Some late visitor entreating entrance at my chamber door; -" +
"This it is, and nothing more,'" +
"Presently my soul grew stronger; hesitating then no longer," +
"`Sir,' said I, `or Madam, truly your forgiveness I implore;" +
"But the fact is I was napping, and so gently you came rapping," +
"And so faintly you came tapping, tapping at my chamber door," +
"That I scarce was sure I heard you' - here I opened wide the door; -" +
"Darkness there, and nothing more." +
"Deep into that darkness peering, long I stood there wondering, " +
"fearing," +
"Doubting, dreaming dreams no mortal ever dared to dream before" +
"But the silence was unbroken, and the darkness gave no token," +
"And the only word there spoken was the whispered word, `Lenore!'" +
"This I whispered, and an echo murmured back the word, `Lenore!'" +
"Merely this and nothing more." +
"Back into the chamber turning, all my soul within me burning," +
"Soon again I heard a tapping somewhat louder than before." +
"`Surely,\' said I, `surely that is something at my window lattice;" +
"Let me see then, what thereat is, and this mystery explore -" +
"Let my heart be still a moment and this mystery explore; -" +
"'Tis the wind and nothing more!'";
assertEquals(147608747, goog.crypt.hash32.encodeString(poe));
assertEquals(147608747, goog.crypt.hash32.encodeStringUtf8(poe));
}
function testBenchmarking() {
if (!testCase) return;
// Not a real test, just outputs some timing
function makeString(n) {
var str = [];
for (var i = 0; i < n; i++) {
str.push(String.fromCharCode(Math.round(Math.random() * 500)));
}
return str.join('');
}
for (var i = 0; i < 50000; i += 10000) {
var str = makeString(i);
var start = goog.now();
var hash = goog.crypt.hash32.encodeString(str);
var diff = goog.now() - start;
testCase.saveMessage(
'testBenchmarking : hashing ' + i + ' chars in ' + diff + 'ms');
}
}
function createByteArray(n) {
var arr = [];
for (var i = 0; i < n; i++) {
arr.push(i);
}
return arr;
}
var byteArrays = {
0: 1539411136,
1: 1773524747,
2: -254958930,
3: 1532114172,
4: 1923165449,
5: 1611874589,
6: 1502126780,
7: -751745251,
8: -292491321,
9: 1106193218,
10: -722791438,
11: -2130666060,
12: -259304553,
13: 871461192,
14: 865773084,
15: 1615738330,
16: -1836636447,
17: -485722519,
18: -120832227,
19: 1954449704,
20: 491312921,
21: -1955462668,
22: 168565425,
23: -105893922,
24: 620486614,
25: -1789602428,
26: 1765793554,
27: 1723370948,
28: -1275405721,
29: 140421019,
30: -1438726307,
31: 538438903,
32: -729123980,
33: 1213490939,
34: -1814248478,
35: 1943703398,
36: 1603073219,
37: -2139639543,
38: -694153941,
39: 137511516,
40: -249943726,
41: -1166126060,
42: 53464833,
43: -915350862,
44: 1306585409,
45: 1064798289,
46: 335555913,
47: 224485496,
48: 275599760,
49: 409559869,
50: 673770580,
51: -2113819879,
52: -791338727,
53: -1716479479,
54: 1795018816,
55: 2020139343,
56: -1652827750,
57: -1509632558,
58: 751641995,
59: -217881377,
60: -476546900,
61: -1893349644,
62: -729290332,
63: 1359899321,
64: 1811814306,
65: 2100363086,
66: -794920327,
67: -1667555017,
68: -549980099,
69: -21170740,
70: -1324143722,
71: 1406730195,
72: 2111381574,
73: -1667480052,
74: 1071811178,
75: -1080194099,
76: -181186882,
77: 268677507,
78: -546766334,
79: 555953522,
80: -981311675,
81: 1988867392,
82: 773172547,
83: 1160806722,
84: -1455460187,
85: 83493600,
86: 155365142,
87: 1714618071,
88: 1487712615,
89: -810670278,
90: 2031655097,
91: 1286349470,
92: -1873594211,
93: 1875867480,
94: -1096259787,
95: -1054968610,
96: -1723043458,
97: 1278708307,
98: -601104085,
99: 1497928579,
100: 1329732615,
101: -1281696190,
102: 1471511953,
103: -62666299,
104: 807569747,
105: -1927974759,
106: 1462243717,
107: -862975602,
108: 824369927,
109: -1448816781,
110: 1434162022,
111: -881501413,
112: -1554381107,
113: -1730883204,
114: 431236217,
115: 1877278608,
116: -673864625,
117: 143000665,
118: -596902829,
119: 1038860559,
120: 805884326,
121: -1536181710,
122: -1357373256,
123: 1405134250,
124: -860816481,
125: 1393578269,
126: -810682545,
127: -635515639
};
var testCase;
if (G_testRunner) {
testCase = new goog.testing.TestCase(document.title);
testCase.autoDiscoverTests();
G_testRunner.initialize(testCase);
}