EnumerableMap.test.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. const { BN, constants } = require('@openzeppelin/test-helpers');
  2. const { mapValues } = require('../../helpers/iterate');
  3. const EnumerableMap = artifacts.require('$EnumerableMap');
  4. const { shouldBehaveLikeMap } = require('./EnumerableMap.behavior');
  5. const getMethods = ms => {
  6. return mapValues(
  7. ms,
  8. m =>
  9. (self, ...args) =>
  10. self.methods[m](0, ...args),
  11. );
  12. };
  13. // Get the name of the library. In the transpiled code it will be EnumerableMapUpgradeable.
  14. const library = EnumerableMap._json.contractName.replace(/^\$/, '');
  15. contract('EnumerableMap', function (accounts) {
  16. const [accountA, accountB, accountC] = accounts;
  17. const keyA = new BN('7891');
  18. const keyB = new BN('451');
  19. const keyC = new BN('9592328');
  20. const bytesA = '0xdeadbeef'.padEnd(66, '0');
  21. const bytesB = '0x0123456789'.padEnd(66, '0');
  22. const bytesC = '0x42424242'.padEnd(66, '0');
  23. beforeEach(async function () {
  24. this.map = await EnumerableMap.new();
  25. });
  26. // AddressToUintMap
  27. describe('AddressToUintMap', function () {
  28. shouldBehaveLikeMap(
  29. [accountA, accountB, accountC],
  30. [keyA, keyB, keyC],
  31. new BN('0'),
  32. getMethods({
  33. set: '$set(uint256,address,uint256)',
  34. get: '$get(uint256,address)',
  35. tryGet: '$tryGet(uint256,address)',
  36. remove: '$remove(uint256,address)',
  37. length: `$length_${library}_AddressToUintMap(uint256)`,
  38. at: `$at_${library}_AddressToUintMap(uint256,uint256)`,
  39. contains: '$contains(uint256,address)',
  40. keys: `$keys_${library}_AddressToUintMap(uint256)`,
  41. }),
  42. {
  43. setReturn: `return$set_${library}_AddressToUintMap_address_uint256`,
  44. removeReturn: `return$remove_${library}_AddressToUintMap_address`,
  45. },
  46. );
  47. });
  48. // UintToAddressMap
  49. describe('UintToAddressMap', function () {
  50. shouldBehaveLikeMap(
  51. [keyA, keyB, keyC],
  52. [accountA, accountB, accountC],
  53. constants.ZERO_ADDRESS,
  54. getMethods({
  55. set: '$set(uint256,uint256,address)',
  56. get: `$get_${library}_UintToAddressMap(uint256,uint256)`,
  57. tryGet: `$tryGet_${library}_UintToAddressMap(uint256,uint256)`,
  58. remove: `$remove_${library}_UintToAddressMap(uint256,uint256)`,
  59. length: `$length_${library}_UintToAddressMap(uint256)`,
  60. at: `$at_${library}_UintToAddressMap(uint256,uint256)`,
  61. contains: `$contains_${library}_UintToAddressMap(uint256,uint256)`,
  62. keys: `$keys_${library}_UintToAddressMap(uint256)`,
  63. }),
  64. {
  65. setReturn: `return$set_${library}_UintToAddressMap_uint256_address`,
  66. removeReturn: `return$remove_${library}_UintToAddressMap_uint256`,
  67. },
  68. );
  69. });
  70. // Bytes32ToBytes32Map
  71. describe('Bytes32ToBytes32Map', function () {
  72. shouldBehaveLikeMap(
  73. [keyA, keyB, keyC].map(k => '0x' + k.toString(16).padEnd(64, '0')),
  74. [bytesA, bytesB, bytesC],
  75. constants.ZERO_BYTES32,
  76. getMethods({
  77. set: '$set(uint256,bytes32,bytes32)',
  78. get: `$get_${library}_Bytes32ToBytes32Map(uint256,bytes32)`,
  79. tryGet: `$tryGet_${library}_Bytes32ToBytes32Map(uint256,bytes32)`,
  80. remove: `$remove_${library}_Bytes32ToBytes32Map(uint256,bytes32)`,
  81. length: `$length_${library}_Bytes32ToBytes32Map(uint256)`,
  82. at: `$at_${library}_Bytes32ToBytes32Map(uint256,uint256)`,
  83. contains: `$contains_${library}_Bytes32ToBytes32Map(uint256,bytes32)`,
  84. keys: `$keys_${library}_Bytes32ToBytes32Map(uint256)`,
  85. }),
  86. {
  87. setReturn: `return$set_${library}_Bytes32ToBytes32Map_bytes32_bytes32`,
  88. removeReturn: `return$remove_${library}_Bytes32ToBytes32Map_bytes32`,
  89. },
  90. );
  91. });
  92. // UintToUintMap
  93. describe('UintToUintMap', function () {
  94. shouldBehaveLikeMap(
  95. [keyA, keyB, keyC],
  96. [keyA, keyB, keyC].map(k => k.add(new BN('1332'))),
  97. new BN('0'),
  98. getMethods({
  99. set: '$set(uint256,uint256,uint256)',
  100. get: `$get_${library}_UintToUintMap(uint256,uint256)`,
  101. tryGet: `$tryGet_${library}_UintToUintMap(uint256,uint256)`,
  102. remove: `$remove_${library}_UintToUintMap(uint256,uint256)`,
  103. length: `$length_${library}_UintToUintMap(uint256)`,
  104. at: `$at_${library}_UintToUintMap(uint256,uint256)`,
  105. contains: `$contains_${library}_UintToUintMap(uint256,uint256)`,
  106. keys: `$keys_${library}_UintToUintMap(uint256)`,
  107. }),
  108. {
  109. setReturn: `return$set_${library}_UintToUintMap_uint256_uint256`,
  110. removeReturn: `return$remove_${library}_UintToUintMap_uint256`,
  111. },
  112. );
  113. });
  114. // Bytes32ToUintMap
  115. describe('Bytes32ToUintMap', function () {
  116. shouldBehaveLikeMap(
  117. [bytesA, bytesB, bytesC],
  118. [keyA, keyB, keyC],
  119. new BN('0'),
  120. getMethods({
  121. set: '$set(uint256,bytes32,uint256)',
  122. get: `$get_${library}_Bytes32ToUintMap(uint256,bytes32)`,
  123. tryGet: `$tryGet_${library}_Bytes32ToUintMap(uint256,bytes32)`,
  124. remove: `$remove_${library}_Bytes32ToUintMap(uint256,bytes32)`,
  125. length: `$length_${library}_Bytes32ToUintMap(uint256)`,
  126. at: `$at_${library}_Bytes32ToUintMap(uint256,uint256)`,
  127. contains: `$contains_${library}_Bytes32ToUintMap(uint256,bytes32)`,
  128. keys: `$keys_${library}_Bytes32ToUintMap(uint256)`,
  129. }),
  130. {
  131. setReturn: `return$set_${library}_Bytes32ToUintMap_bytes32_uint256`,
  132. removeReturn: `return$remove_${library}_Bytes32ToUintMap_bytes32`,
  133. },
  134. );
  135. });
  136. });