Cómo comparar dos matrices en Solidity

¿Cómo puedo comparar dos matrices en Solidity (con el marco de prueba de Truffle)?

MiContrato.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;   
  } 
}

En Trufa test/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");
  }
}

"prueba de trufa" da error --

TypeError: Member "equal" is not available in type(library Assert) outside of storage.
        Assert.equal(myContract.getMyArr(), expectedArr, "pass");
        ^----------^

¿Hay alguna forma de escribir pruebas unitarias para matrices Solidity?

Respuestas (2)

No estoy seguro de si esta implementación funciona ahora.

Pero como tener una colisión de hash es tan tan tan... difícil, puede hacer hash de las dos matrices diferentes y comparar sus hashes. Si esto es posible, será mucho mejor que ir a cada índice y comprobarlo. Y también en términos de gasto de gas será mucho más eficiente.

Assert.equal(keccak256(expectedarr), keccack(myArr),"pass");

Avísame si te funciona.

hasta donde yo sé, debe escribir una Assert.equalllamada para cada valor en su matriz.

Al igual que:

Assert.equal(expectedArr[0], myContract.myArr[0], “pass“);
Assert.equal(expectedArr[1], myContract.myArr[1], “pass“);
Assert.equal(expectedArr[2], myContract.myArr[2], “pass“);

Espero que ayude.