EnumerableMap.test.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. const { ethers } = require('hardhat');
  2. const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
  3. const { mapValues } = require('../../helpers/iterate');
  4. const { generators } = require('../../helpers/random');
  5. const { TYPES, formatType } = require('../../../scripts/generate/templates/EnumerableMap.opts');
  6. const { shouldBehaveLikeMap } = require('./EnumerableMap.behavior');
  7. // Add Bytes32ToBytes32Map that must be tested but is not part of the generated types.
  8. TYPES.unshift(formatType('bytes32', 'bytes32'));
  9. async function fixture() {
  10. const mock = await ethers.deployContract('$EnumerableMap');
  11. const env = Object.fromEntries(
  12. TYPES.map(({ name, keyType, valueType }) => [
  13. name,
  14. {
  15. keyType,
  16. keys: Array.from({ length: 3 }, generators[keyType]),
  17. values: Array.from({ length: 3 }, generators[valueType]),
  18. zeroValue: generators[valueType].zero,
  19. methods: mapValues(
  20. {
  21. set: `$set(uint256,${keyType},${valueType})`,
  22. get: `$get_EnumerableMap_${name}(uint256,${keyType})`,
  23. tryGet: `$tryGet_EnumerableMap_${name}(uint256,${keyType})`,
  24. remove: `$remove_EnumerableMap_${name}(uint256,${keyType})`,
  25. clear: `$clear_EnumerableMap_${name}(uint256)`,
  26. length: `$length_EnumerableMap_${name}(uint256)`,
  27. at: `$at_EnumerableMap_${name}(uint256,uint256)`,
  28. contains: `$contains_EnumerableMap_${name}(uint256,${keyType})`,
  29. keys: `$keys_EnumerableMap_${name}(uint256)`,
  30. },
  31. fnSig =>
  32. (...args) =>
  33. mock.getFunction(fnSig)(0, ...args),
  34. ),
  35. events: {
  36. setReturn: `return$set_EnumerableMap_${name}_${keyType}_${valueType}`,
  37. removeReturn: `return$remove_EnumerableMap_${name}_${keyType}`,
  38. },
  39. },
  40. ]),
  41. );
  42. return { mock, env };
  43. }
  44. describe('EnumerableMap', function () {
  45. beforeEach(async function () {
  46. Object.assign(this, await loadFixture(fixture));
  47. });
  48. for (const { name } of TYPES) {
  49. describe(name, function () {
  50. beforeEach(async function () {
  51. Object.assign(this, this.env[name]);
  52. [this.keyA, this.keyB, this.keyC] = this.keys;
  53. [this.valueA, this.valueB, this.valueC] = this.values;
  54. });
  55. shouldBehaveLikeMap();
  56. });
  57. }
  58. });