/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkChecksum.h" #include "SkRandom.h" #include "Test.h" // Murmur3 has an optional third seed argument, so we wrap it to fit a uniform type. static uint32_t murmur_noseed(const uint32_t* d, size_t l) { return SkChecksum::Murmur3(d, l); } #define ASSERT(x) REPORTER_ASSERT(r, x) DEF_TEST(Checksum, r) { // Algorithms to test. They're currently all uint32_t(const uint32_t*, size_t). typedef uint32_t(*algorithmProc)(const uint32_t*, size_t); const algorithmProc kAlgorithms[] = { &murmur_noseed }; // Put 128 random bytes into two identical buffers. Any multiple of 4 will do. const size_t kBytes = SkAlign4(128); SkRandom rand; uint32_t data[kBytes/4], tweaked[kBytes/4]; for (size_t i = 0; i < SK_ARRAY_COUNT(tweaked); ++i) { data[i] = tweaked[i] = rand.nextU(); } // Test each algorithm. for (size_t i = 0; i < SK_ARRAY_COUNT(kAlgorithms); ++i) { const algorithmProc algorithm = kAlgorithms[i]; // Hash of nullptr is always 0. ASSERT(algorithm(nullptr, 0) == 0); const uint32_t hash = algorithm(data, kBytes); // Should be deterministic. ASSERT(hash == algorithm(data, kBytes)); // Changing any single element should change the hash. for (size_t j = 0; j < SK_ARRAY_COUNT(tweaked); ++j) { const uint32_t saved = tweaked[j]; tweaked[j] = rand.nextU(); const uint32_t tweakedHash = algorithm(tweaked, kBytes); ASSERT(tweakedHash != hash); ASSERT(tweakedHash == algorithm(tweaked, kBytes)); tweaked[j] = saved; } } } DEF_TEST(GoodHash, r) { ASSERT(SkGoodHash()(( int32_t)4) == 614249093); // 4 bytes. Hits SkChecksum::Mix fast path. ASSERT(SkGoodHash()((uint32_t)4) == 614249093); // (Ditto) // None of these are 4 byte sized, so they use SkChecksum::Murmur3, not SkChecksum::Mix. ASSERT(SkGoodHash()((uint64_t)4) == 3491892518); ASSERT(SkGoodHash()((uint16_t)4) == 899251846); ASSERT(SkGoodHash()( (uint8_t)4) == 962700458); // Tests SkString is correctly specialized. ASSERT(SkGoodHash()(SkString("Hi")) == 55667557); }