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