So vergleichen Sie zwei Arrays in Solidität

Wie kann ich zwei Arrays in Solidity (mit Truffle Test Framework) vergleichen?

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

In Truffle 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");
  }
}

"Trüffeltest" gibt Fehler --

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

Gibt es eine Möglichkeit, einen Komponententest für Solidity-Arrays zu schreiben?

Antworten (2)

Ich bin mir nicht sicher, ob diese Implementierung jetzt funktioniert.

Aber da eine Hash-Kollision so so so ... schwierig ist, können Sie die beiden verschiedenen Arrays hashen und ihre Hashes vergleichen. Wenn dies möglich ist, ist dies viel besser, als zu jedem Index zu gehen und ihn zu überprüfen. Und auch auf Gas-Ausgaben-Bedingungen wird viel effizienter sein.

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

Lassen Sie mich wissen, ob es für Sie funktioniert.

Soweit ich weiß, müssen Sie Assert.equalfür jeden Wert in Ihrem Array einen - Aufruf schreiben.

So:

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

Hoffentlich hilft das.