// 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); }