123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- const { ethers } = require('hardhat');
- const { expect } = require('chai');
- const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
- async function fixture() {
- const bitmap = await ethers.deployContract('$BitMaps');
- return { bitmap };
- }
- describe('BitMap', function () {
- const keyA = 7891n;
- const keyB = 451n;
- const keyC = 9592328n;
- beforeEach(async function () {
- Object.assign(this, await loadFixture(fixture));
- });
- it('starts empty', async function () {
- expect(await this.bitmap.$get(0, keyA)).to.be.false;
- expect(await this.bitmap.$get(0, keyB)).to.be.false;
- expect(await this.bitmap.$get(0, keyC)).to.be.false;
- });
- describe('setTo', function () {
- it('set a key to true', async function () {
- await this.bitmap.$setTo(0, keyA, true);
- expect(await this.bitmap.$get(0, keyA)).to.be.true;
- expect(await this.bitmap.$get(0, keyB)).to.be.false;
- expect(await this.bitmap.$get(0, keyC)).to.be.false;
- });
- it('set a key to false', async function () {
- await this.bitmap.$setTo(0, keyA, true);
- await this.bitmap.$setTo(0, keyA, false);
- expect(await this.bitmap.$get(0, keyA)).to.be.false;
- expect(await this.bitmap.$get(0, keyB)).to.be.false;
- expect(await this.bitmap.$get(0, keyC)).to.be.false;
- });
- it('set several consecutive keys', async function () {
- await this.bitmap.$setTo(0, keyA + 0n, true);
- await this.bitmap.$setTo(0, keyA + 1n, true);
- await this.bitmap.$setTo(0, keyA + 2n, true);
- await this.bitmap.$setTo(0, keyA + 3n, true);
- await this.bitmap.$setTo(0, keyA + 4n, true);
- await this.bitmap.$setTo(0, keyA + 2n, false);
- await this.bitmap.$setTo(0, keyA + 4n, false);
- expect(await this.bitmap.$get(0, keyA + 0n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 1n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 2n)).to.be.false;
- expect(await this.bitmap.$get(0, keyA + 3n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 4n)).to.be.false;
- });
- });
- describe('set', function () {
- it('adds a key', async function () {
- await this.bitmap.$set(0, keyA);
- expect(await this.bitmap.$get(0, keyA)).to.be.true;
- expect(await this.bitmap.$get(0, keyB)).to.be.false;
- expect(await this.bitmap.$get(0, keyC)).to.be.false;
- });
- it('adds several keys', async function () {
- await this.bitmap.$set(0, keyA);
- await this.bitmap.$set(0, keyB);
- expect(await this.bitmap.$get(0, keyA)).to.be.true;
- expect(await this.bitmap.$get(0, keyB)).to.be.true;
- expect(await this.bitmap.$get(0, keyC)).to.be.false;
- });
- it('adds several consecutive keys', async function () {
- await this.bitmap.$set(0, keyA + 0n);
- await this.bitmap.$set(0, keyA + 1n);
- await this.bitmap.$set(0, keyA + 3n);
- expect(await this.bitmap.$get(0, keyA + 0n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 1n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 2n)).to.be.false;
- expect(await this.bitmap.$get(0, keyA + 3n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 4n)).to.be.false;
- });
- });
- describe('unset', function () {
- it('removes added keys', async function () {
- await this.bitmap.$set(0, keyA);
- await this.bitmap.$set(0, keyB);
- await this.bitmap.$unset(0, keyA);
- expect(await this.bitmap.$get(0, keyA)).to.be.false;
- expect(await this.bitmap.$get(0, keyB)).to.be.true;
- expect(await this.bitmap.$get(0, keyC)).to.be.false;
- });
- it('removes consecutive added keys', async function () {
- await this.bitmap.$set(0, keyA + 0n);
- await this.bitmap.$set(0, keyA + 1n);
- await this.bitmap.$set(0, keyA + 3n);
- await this.bitmap.$unset(0, keyA + 1n);
- expect(await this.bitmap.$get(0, keyA + 0n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 1n)).to.be.false;
- expect(await this.bitmap.$get(0, keyA + 2n)).to.be.false;
- expect(await this.bitmap.$get(0, keyA + 3n)).to.be.true;
- expect(await this.bitmap.$get(0, keyA + 4n)).to.be.false;
- });
- it('adds and removes multiple keys', async function () {
- // []
- await this.bitmap.$set(0, keyA);
- await this.bitmap.$set(0, keyC);
- // [A, C]
- await this.bitmap.$unset(0, keyA);
- await this.bitmap.$unset(0, keyB);
- // [C]
- await this.bitmap.$set(0, keyB);
- // [C, B]
- await this.bitmap.$set(0, keyA);
- await this.bitmap.$unset(0, keyC);
- // [A, B]
- await this.bitmap.$set(0, keyA);
- await this.bitmap.$set(0, keyB);
- // [A, B]
- await this.bitmap.$set(0, keyC);
- await this.bitmap.$unset(0, keyA);
- // [B, C]
- await this.bitmap.$set(0, keyA);
- await this.bitmap.$unset(0, keyB);
- // [A, C]
- expect(await this.bitmap.$get(0, keyA)).to.be.true;
- expect(await this.bitmap.$get(0, keyB)).to.be.false;
- expect(await this.bitmap.$get(0, keyC)).to.be.true;
- });
- });
- });
|