You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.0 KiB
88 lines
3.0 KiB
const { ethers } = require('hardhat');
|
|
const { expect } = require('chai');
|
|
const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
|
|
|
|
async function fixture() {
|
|
const mock = await ethers.deployContract('$Bytes');
|
|
return { mock };
|
|
}
|
|
|
|
const lorem = ethers.toUtf8Bytes(
|
|
'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
|
|
);
|
|
const present = lorem.at(1);
|
|
const absent = 255;
|
|
|
|
describe('Bytes', function () {
|
|
before(async function () {
|
|
Object.assign(this, await loadFixture(fixture));
|
|
});
|
|
|
|
describe('indexOf', function () {
|
|
it('first', async function () {
|
|
expect(await this.mock.$indexOf(lorem, ethers.toBeHex(present))).to.equal(lorem.indexOf(present));
|
|
});
|
|
|
|
it('from index', async function () {
|
|
for (const start in Array(lorem.length + 10).fill()) {
|
|
const index = lorem.indexOf(present, start);
|
|
const result = index === -1 ? ethers.MaxUint256 : index;
|
|
expect(await this.mock.$indexOf(lorem, ethers.toBeHex(present), ethers.Typed.uint256(start))).to.equal(result);
|
|
}
|
|
});
|
|
|
|
it('absent', async function () {
|
|
expect(await this.mock.$indexOf(lorem, ethers.toBeHex(absent))).to.equal(ethers.MaxUint256);
|
|
});
|
|
});
|
|
|
|
describe('lastIndexOf', function () {
|
|
it('first', async function () {
|
|
expect(await this.mock.$lastIndexOf(lorem, ethers.toBeHex(present))).to.equal(lorem.lastIndexOf(present));
|
|
});
|
|
|
|
it('from index', async function () {
|
|
for (const start in Array(lorem.length + 10).fill()) {
|
|
const index = lorem.lastIndexOf(present, start);
|
|
const result = index === -1 ? ethers.MaxUint256 : index;
|
|
expect(await this.mock.$lastIndexOf(lorem, ethers.toBeHex(present), ethers.Typed.uint256(start))).to.equal(
|
|
result,
|
|
);
|
|
}
|
|
});
|
|
|
|
it('absent', async function () {
|
|
expect(await this.mock.$lastIndexOf(lorem, ethers.toBeHex(absent))).to.equal(ethers.MaxUint256);
|
|
});
|
|
});
|
|
|
|
describe('slice', function () {
|
|
describe('slice(bytes, uint256)', function () {
|
|
for (const [descr, start] of Object.entries({
|
|
'start = 0': 0,
|
|
'start within bound': 10,
|
|
'start out of bound': 1000,
|
|
})) {
|
|
it(descr, async function () {
|
|
const result = ethers.hexlify(lorem.slice(start));
|
|
expect(await this.mock.$slice(lorem, start)).to.equal(result);
|
|
});
|
|
}
|
|
});
|
|
|
|
describe('slice(bytes, uint256, uint256)', function () {
|
|
for (const [descr, [start, end]] of Object.entries({
|
|
'start = 0': [0, 42],
|
|
'start and end within bound': [17, 42],
|
|
'end out of bound': [42, 1000],
|
|
'start = end': [17, 17],
|
|
'start > end': [42, 17],
|
|
})) {
|
|
it(descr, async function () {
|
|
const result = ethers.hexlify(lorem.slice(start, end));
|
|
expect(await this.mock.$slice(lorem, start, ethers.Typed.uint256(end))).to.equal(result);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|