summaryrefslogtreecommitdiffstats
path: root/js/src/jsapi-tests/testSparseBitmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jsapi-tests/testSparseBitmap.cpp')
-rw-r--r--js/src/jsapi-tests/testSparseBitmap.cpp115
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)