BitMap.test.js 4.8 KB

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