BitMap.test.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. const { ethers } = require('hardhat');
  2. const { expect } = require('chai');
  3. const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
  4. async function fixture() {
  5. const bitmap = await ethers.deployContract('$BitMaps');
  6. return { bitmap };
  7. }
  8. describe('BitMap', function () {
  9. const keyA = 7891n;
  10. const keyB = 451n;
  11. const keyC = 9592328n;
  12. beforeEach(async function () {
  13. Object.assign(this, await loadFixture(fixture));
  14. });
  15. it('starts empty', async function () {
  16. expect(await this.bitmap.$get(0, keyA)).to.be.false;
  17. expect(await this.bitmap.$get(0, keyB)).to.be.false;
  18. expect(await this.bitmap.$get(0, keyC)).to.be.false;
  19. });
  20. describe('setTo', function () {
  21. it('set a key to true', async function () {
  22. await this.bitmap.$setTo(0, keyA, true);
  23. expect(await this.bitmap.$get(0, keyA)).to.be.true;
  24. expect(await this.bitmap.$get(0, keyB)).to.be.false;
  25. expect(await this.bitmap.$get(0, keyC)).to.be.false;
  26. });
  27. it('set a key to false', async function () {
  28. await this.bitmap.$setTo(0, keyA, true);
  29. await this.bitmap.$setTo(0, keyA, false);
  30. expect(await this.bitmap.$get(0, keyA)).to.be.false;
  31. expect(await this.bitmap.$get(0, keyB)).to.be.false;
  32. expect(await this.bitmap.$get(0, keyC)).to.be.false;
  33. });
  34. it('set several consecutive keys', async function () {
  35. await this.bitmap.$setTo(0, keyA + 0n, true);
  36. await this.bitmap.$setTo(0, keyA + 1n, true);
  37. await this.bitmap.$setTo(0, keyA + 2n, true);
  38. await this.bitmap.$setTo(0, keyA + 3n, true);
  39. await this.bitmap.$setTo(0, keyA + 4n, true);
  40. await this.bitmap.$setTo(0, keyA + 2n, false);
  41. await this.bitmap.$setTo(0, keyA + 4n, false);
  42. expect(await this.bitmap.$get(0, keyA + 0n)).to.be.true;
  43. expect(await this.bitmap.$get(0, keyA + 1n)).to.be.true;
  44. expect(await this.bitmap.$get(0, keyA + 2n)).to.be.false;
  45. expect(await this.bitmap.$get(0, keyA + 3n)).to.be.true;
  46. expect(await this.bitmap.$get(0, keyA + 4n)).to.be.false;
  47. });
  48. });
  49. describe('set', function () {
  50. it('adds a key', async function () {
  51. await this.bitmap.$set(0, keyA);
  52. expect(await this.bitmap.$get(0, keyA)).to.be.true;
  53. expect(await this.bitmap.$get(0, keyB)).to.be.false;
  54. expect(await this.bitmap.$get(0, keyC)).to.be.false;
  55. });
  56. it('adds several keys', async function () {
  57. await this.bitmap.$set(0, keyA);
  58. await this.bitmap.$set(0, keyB);
  59. expect(await this.bitmap.$get(0, keyA)).to.be.true;
  60. expect(await this.bitmap.$get(0, keyB)).to.be.true;
  61. expect(await this.bitmap.$get(0, keyC)).to.be.false;
  62. });
  63. it('adds several consecutive keys', async function () {
  64. await this.bitmap.$set(0, keyA + 0n);
  65. await this.bitmap.$set(0, keyA + 1n);
  66. await this.bitmap.$set(0, keyA + 3n);
  67. expect(await this.bitmap.$get(0, keyA + 0n)).to.be.true;
  68. expect(await this.bitmap.$get(0, keyA + 1n)).to.be.true;
  69. expect(await this.bitmap.$get(0, keyA + 2n)).to.be.false;
  70. expect(await this.bitmap.$get(0, keyA + 3n)).to.be.true;
  71. expect(await this.bitmap.$get(0, keyA + 4n)).to.be.false;
  72. });
  73. });
  74. describe('unset', function () {
  75. it('removes added keys', async function () {
  76. await this.bitmap.$set(0, keyA);
  77. await this.bitmap.$set(0, keyB);
  78. await this.bitmap.$unset(0, keyA);
  79. expect(await this.bitmap.$get(0, keyA)).to.be.false;
  80. expect(await this.bitmap.$get(0, keyB)).to.be.true;
  81. expect(await this.bitmap.$get(0, keyC)).to.be.false;
  82. });
  83. it('removes consecutive added keys', async function () {
  84. await this.bitmap.$set(0, keyA + 0n);
  85. await this.bitmap.$set(0, keyA + 1n);
  86. await this.bitmap.$set(0, keyA + 3n);
  87. await this.bitmap.$unset(0, keyA + 1n);
  88. expect(await this.bitmap.$get(0, keyA + 0n)).to.be.true;
  89. expect(await this.bitmap.$get(0, keyA + 1n)).to.be.false;
  90. expect(await this.bitmap.$get(0, keyA + 2n)).to.be.false;
  91. expect(await this.bitmap.$get(0, keyA + 3n)).to.be.true;
  92. expect(await this.bitmap.$get(0, keyA + 4n)).to.be.false;
  93. });
  94. it('adds and removes multiple keys', async function () {
  95. // []
  96. await this.bitmap.$set(0, keyA);
  97. await this.bitmap.$set(0, keyC);
  98. // [A, C]
  99. await this.bitmap.$unset(0, keyA);
  100. await this.bitmap.$unset(0, keyB);
  101. // [C]
  102. await this.bitmap.$set(0, keyB);
  103. // [C, B]
  104. await this.bitmap.$set(0, keyA);
  105. await this.bitmap.$unset(0, keyC);
  106. // [A, B]
  107. await this.bitmap.$set(0, keyA);
  108. await this.bitmap.$set(0, keyB);
  109. // [A, B]
  110. await this.bitmap.$set(0, keyC);
  111. await this.bitmap.$unset(0, keyA);
  112. // [B, C]
  113. await this.bitmap.$set(0, keyA);
  114. await this.bitmap.$unset(0, keyB);
  115. // [A, C]
  116. expect(await this.bitmap.$get(0, keyA)).to.be.true;
  117. expect(await this.bitmap.$get(0, keyB)).to.be.false;
  118. expect(await this.bitmap.$get(0, keyC)).to.be.true;
  119. });
  120. });
  121. });