EnumerableSet.test.js 2.1 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 { SET_TYPES } = require('../../../scripts/generate/templates/Enumerable.opts');
  6. const { shouldBehaveLikeSet } = require('./EnumerableSet.behavior');
  7. const getMethods = (mock, fnSigs) =>
  8. mapValues(
  9. fnSigs,
  10. fnSig =>
  11. (...args) =>
  12. mock.getFunction(fnSig)(0, ...args),
  13. );
  14. async function fixture() {
  15. const mock = await ethers.deployContract('$EnumerableSet');
  16. const env = Object.fromEntries(
  17. SET_TYPES.map(({ name, value }) => [
  18. name,
  19. {
  20. value,
  21. values: Array.from(
  22. { length: 3 },
  23. value.size ? () => Array.from({ length: value.size }, generators[value.base]) : generators[value.type],
  24. ),
  25. methods: getMethods(mock, {
  26. add: `$add(uint256,${value.type})`,
  27. remove: `$remove(uint256,${value.type})`,
  28. contains: `$contains(uint256,${value.type})`,
  29. clear: `$clear_EnumerableSet_${name}(uint256)`,
  30. length: `$length_EnumerableSet_${name}(uint256)`,
  31. at: `$at_EnumerableSet_${name}(uint256,uint256)`,
  32. values: `$values_EnumerableSet_${name}(uint256)`,
  33. valuesPage: `$values_EnumerableSet_${name}(uint256,uint256,uint256)`,
  34. }),
  35. events: {
  36. addReturn: `return$add_EnumerableSet_${name}_${value.type.replace(/[[\]]/g, '_')}`,
  37. removeReturn: `return$remove_EnumerableSet_${name}_${value.type.replace(/[[\]]/g, '_')}`,
  38. },
  39. },
  40. ]),
  41. );
  42. return { mock, env };
  43. }
  44. describe('EnumerableSet', function () {
  45. beforeEach(async function () {
  46. Object.assign(this, await loadFixture(fixture));
  47. });
  48. for (const { name, value } of SET_TYPES) {
  49. describe(`${name} (enumerable set of ${value.type})`, function () {
  50. beforeEach(function () {
  51. Object.assign(this, this.env[name]);
  52. [this.valueA, this.valueB, this.valueC] = this.values;
  53. });
  54. shouldBehaveLikeSet();
  55. });
  56. }
  57. });