Как я могу сравнить два массива в Solidity (с тестовой средой Truffle)?
MyContract.sol --
pragma solidity 0.4.19;
contract MyContract {
uint[] public myArr;
MyContract(uint[] _initArr) public {
for (uint i=0; i < _initArr.length; i++) {
myArr.push(_initArr[i]);
}
}
function getMyArr public constant returns (uint[]) {
return myArr;
}
}
В тесте трюфеля/TestMyContract.sol
pragma solidity 0.4.19;
import "truffle/Assert.sol";
import "truffle/DeployedAddresses.sol";
import "../contracts/MyContract.sol";
contract TestMyContract {
function testMyContract() public {
uint[] storage expectedArr;
expectedArr.push(0);
expectedArr.push(1);
expectedArr.push(2);
MyContract myContract = new MyContract(expectedArr);
Assert.equal(myContract.getMyArr(), expectedArr, "pass");
}
}
"трюфельный тест" выдает ошибку --
TypeError: Member "equal" is not available in type(library Assert) outside of storage.
Assert.equal(myContract.getMyArr(), expectedArr, "pass");
^----------^
Есть ли способ написать модульный тест для массивов Solidity?
Я не уверен, работает ли эта реализация сейчас.
Но поскольку столкновение хэшей так себе... сложно, вы можете хешировать два разных массива и сравнивать их хэши. Если это возможно сделать, будет намного лучше, чем ходить по каждому индексу и проверять его. Да и по расходу газа будет гораздо эффективнее.
Assert.equal(keccak256(expectedarr), keccack(myArr),"pass");
Дайте мне знать, если это работает для вас.
насколько я знаю, вы должны написать Assert.equal
- Call для каждого значения в вашем массиве.
Вот так:
Assert.equal(expectedArr[0], myContract.myArr[0], “pass“);
Assert.equal(expectedArr[1], myContract.myArr[1], “pass“);
Assert.equal(expectedArr[2], myContract.myArr[2], “pass“);
Надеюсь, это поможет.