diff options
Diffstat (limited to 'js/src/jsapi-tests/testSparseBitmap.cpp')
-rw-r--r-- | js/src/jsapi-tests/testSparseBitmap.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/js/src/jsapi-tests/testSparseBitmap.cpp b/js/src/jsapi-tests/testSparseBitmap.cpp new file mode 100644 index 0000000000..bd5e7fee95 --- /dev/null +++ b/js/src/jsapi-tests/testSparseBitmap.cpp @@ -0,0 +1,115 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "mozilla/PodOperations.h" + +#include "ds/Bitmap.h" + +#include "jsapi-tests/tests.h" + +using namespace js; + +BEGIN_TEST(testSparseBitmapBasics) { + SparseBitmap bitmap; + + // Test bits in first block are initially zero. + for (size_t i = 0; i < 100; i++) { + CHECK(!bitmap.getBit(i)); + } + + // Test bits in different blocks are initially zero. + for (size_t i = 0; i < 100; i++) { + CHECK(!bitmap.getBit(i * 1000)); + } + + // Set some bits in the first block and check they are set. + for (size_t i = 0; i < 100; i += 2) { + bitmap.setBit(i); + } + for (size_t i = 0; i < 100; i++) { + CHECK(bitmap.getBit(i) == ((i % 2) == 0)); + } + + // Set some bits in different blocks and check they are set. + for (size_t i = 0; i < 100; i += 2) { + bitmap.setBit(i * 1000); + } + for (size_t i = 0; i < 100; i++) { + CHECK(bitmap.getBit(i * 1000) == ((i % 2) == 0)); + } + + // Create another bitmap with different bits set. + SparseBitmap other; + for (size_t i = 1; i < 100; i += 2) { + other.setBit(i * 1000); + } + for (size_t i = 0; i < 100; i++) { + CHECK(other.getBit(i * 1000) == ((i % 2) != 0)); + } + + // OR some bits into this bitmap and check the result. + bitmap.bitwiseOrWith(other); + for (size_t i = 0; i < 100; i++) { + CHECK(bitmap.getBit(i * 1000)); + } + + // AND some bits into this bitmap and check the result. + DenseBitmap dense; + size_t wordCount = (100 * 1000) / JS_BITS_PER_WORD + 1; + CHECK(dense.ensureSpace(wordCount)); + other.bitwiseOrInto(dense); + bitmap.bitwiseAndWith(dense); + for (size_t i = 0; i < 100; i++) { + CHECK(bitmap.getBit(i * 1000) == ((i % 2) != 0)); + } + + return true; +} +END_TEST(testSparseBitmapBasics) + +BEGIN_TEST(testSparseBitmapExternalOR) { + // Testing ORing data into an external array. + + const size_t wordCount = 10; + + // Create a bitmap with one bit set per word so we can tell them apart. + SparseBitmap bitmap; + for (size_t i = 0; i < wordCount; i++) { + bitmap.setBit(i * JS_BITS_PER_WORD + i); + } + + // Copy a single word. + uintptr_t target[wordCount]; + mozilla::PodArrayZero(target); + bitmap.bitwiseOrRangeInto(0, 1, target); + CHECK(target[0] == 1u << 0); + CHECK(target[1] == 0); + + // Copy a word at an offset. + mozilla::PodArrayZero(target); + bitmap.bitwiseOrRangeInto(1, 1, target); + CHECK(target[0] == 1u << 1); + CHECK(target[1] == 0); + + // Check data is ORed with original target contents. + mozilla::PodArrayZero(target); + bitmap.bitwiseOrRangeInto(0, 1, target); + bitmap.bitwiseOrRangeInto(1, 1, target); + CHECK(target[0] == ((1u << 0) | (1u << 1))); + + // Copy multiple words at an offset. + mozilla::PodArrayZero(target); + bitmap.bitwiseOrRangeInto(2, wordCount - 2, target); + for (size_t i = 0; i < wordCount - 2; i++) { + CHECK(target[i] == (1u << (i + 2))); + } + CHECK(target[wordCount - 1] == 0); + + return true; +} + +END_TEST(testSparseBitmapExternalOR) |