EnumerableMap.test.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const { ethers } = require('hardhat');
  2. const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
  3. const { mapValues } = require('../../helpers/iterate');
  4. const { randomArray, generators } = require('../../helpers/random');
  5. const { TYPES, formatType } = require('../../../scripts/generate/templates/EnumerableMap.opts');
  6. const { shouldBehaveLikeMap } = require('./EnumerableMap.behavior');
  7. const getMethods = (mock, fnSigs) => {
  8. return mapValues(
  9. fnSigs,
  10. fnSig =>
  11. (...args) =>
  12. mock.getFunction(fnSig)(0, ...args),
  13. );
  14. };
  15. const testTypes = [formatType('bytes32', 'bytes32'), ...TYPES];
  16. async function fixture() {
  17. const mock = await ethers.deployContract('$EnumerableMap');
  18. const zeroValue = {
  19. uint256: 0n,
  20. address: ethers.ZeroAddress,
  21. bytes32: ethers.ZeroHash,
  22. };
  23. const env = Object.fromEntries(
  24. testTypes.map(({ name, keyType, valueType }) => [
  25. name,
  26. {
  27. keyType,
  28. keys: randomArray(generators[keyType]),
  29. values: randomArray(generators[valueType]),
  30. methods: getMethods(
  31. mock,
  32. testTypes.filter(t => keyType == t.keyType).length == 1
  33. ? {
  34. set: `$set(uint256,${keyType},${valueType})`,
  35. get: `$get(uint256,${keyType})`,
  36. tryGet: `$tryGet(uint256,${keyType})`,
  37. remove: `$remove(uint256,${keyType})`,
  38. length: `$length_EnumerableMap_${name}(uint256)`,
  39. at: `$at_EnumerableMap_${name}(uint256,uint256)`,
  40. contains: `$contains(uint256,${keyType})`,
  41. keys: `$keys_EnumerableMap_${name}(uint256)`,
  42. }
  43. : {
  44. set: `$set(uint256,${keyType},${valueType})`,
  45. get: `$get_EnumerableMap_${name}(uint256,${keyType})`,
  46. tryGet: `$tryGet_EnumerableMap_${name}(uint256,${keyType})`,
  47. remove: `$remove_EnumerableMap_${name}(uint256,${keyType})`,
  48. length: `$length_EnumerableMap_${name}(uint256)`,
  49. at: `$at_EnumerableMap_${name}(uint256,uint256)`,
  50. contains: `$contains_EnumerableMap_${name}(uint256,${keyType})`,
  51. keys: `$keys_EnumerableMap_${name}(uint256)`,
  52. },
  53. ),
  54. zeroValue: zeroValue[valueType],
  55. events: {
  56. setReturn: `return$set_EnumerableMap_${name}_${keyType}_${valueType}`,
  57. removeReturn: `return$remove_EnumerableMap_${name}_${keyType}`,
  58. },
  59. },
  60. ]),
  61. );
  62. return { mock, env };
  63. }
  64. describe('EnumerableMap', function () {
  65. beforeEach(async function () {
  66. Object.assign(this, await loadFixture(fixture));
  67. });
  68. // UintToAddressMap
  69. for (const { name } of testTypes) {
  70. describe(name, function () {
  71. beforeEach(async function () {
  72. Object.assign(this, this.env[name]);
  73. [this.keyA, this.keyB, this.keyC] = this.keys;
  74. [this.valueA, this.valueB, this.valueC] = this.values;
  75. });
  76. shouldBehaveLikeMap();
  77. });
  78. }
  79. });