diff --git a/libs/remix-tests/sol/tests.sol.ts b/libs/remix-tests/sol/tests.sol.ts index 33d7a63f46..6a5ba42ea3 100644 --- a/libs/remix-tests/sol/tests.sol.ts +++ b/libs/remix-tests/sol/tests.sol.ts @@ -8,14 +8,21 @@ library Assert { string message ); + event AssertionEventUint( + bool passed, + string message, + uint256 returned, + uint256 expected + ); + function ok(bool a, string memory message) public returns (bool result) { result = a; emit AssertionEvent(result, message); } - function equal(uint a, uint b, string memory message) public returns (bool result) { + function equal(uint256 a, uint256 b, string memory message) public returns (bool result) { result = (a == b); - emit AssertionEvent(result, message); + emit AssertionEventUint(result, message, a, b); } function equal(int a, int b, string memory message) public returns (bool result) { diff --git a/libs/remix-tests/src/testRunner.ts b/libs/remix-tests/src/testRunner.ts index 78048c4333..f027a6efcd 100644 --- a/libs/remix-tests/src/testRunner.ts +++ b/libs/remix-tests/src/testRunner.ts @@ -228,20 +228,33 @@ export function runTest (testName: string, testObject: any, contractDetails: Com method.send(sendParams).on('receipt', (receipt) => { try { const time: number = (Date.now() - startTime) / 1000.0 - const topic = Web3.utils.sha3('AssertionEvent(bool,string)') + const assertionEvents = [ + { + name: 'AssertionEvent', + params: ['bool', 'string'] + }, + { + name: 'AssertionEventUint', + params: ['bool', 'string', 'uint256', 'uint256'] + } + ] + const assertionEventHashes = assertionEvents.map(e => Web3.utils.sha3(e.name + '(' + e.params.join() + ')') ) let testPassed = false for (const i in receipt.events) { const event = receipt.events[i] - if (event.raw.topics.indexOf(topic) >= 0) { - const testEvent = web3.eth.abi.decodeParameters(['bool', 'string'], event.raw.data) + const eIndex = assertionEventHashes.indexOf(event.raw.topics[0]) // event name topic will always be at index 0 + if (eIndex >= 0) { + const testEvent = web3.eth.abi.decodeParameters(assertionEvents[eIndex].params, event.raw.data) if (!testEvent[0]) { const resp: TestResultInterface = { type: 'testFailure', value: changeCase.sentenceCase(func.name), time: time, errMsg: testEvent[1], - context: testName + context: testName, + returned: testEvent[2], + expected: testEvent[3] }; testCallback(undefined, resp) failureNum += 1 diff --git a/libs/remix-tests/src/types.ts b/libs/remix-tests/src/types.ts index 3f587e3fe3..b9b2748be2 100644 --- a/libs/remix-tests/src/types.ts +++ b/libs/remix-tests/src/types.ts @@ -26,12 +26,14 @@ export interface ResultsInterface { timePassed: number } export interface TestResultInterface { - type: string, - value: any, - time?: number, - context?: string, + type: string + value: any + time?: number + context?: string errMsg?: string filename?: string + returned?: string | number + expected?: string | number } export interface TestCbInterface { (error: Error | null | undefined, result: TestResultInterface) : void; diff --git a/libs/remix-tests/tests/testRunner.spec.ts b/libs/remix-tests/tests/testRunner.spec.ts index bd41282213..ac588157f5 100644 --- a/libs/remix-tests/tests/testRunner.spec.ts +++ b/libs/remix-tests/tests/testRunner.spec.ts @@ -125,7 +125,7 @@ describe('testRunner', () => { { type: 'contract', value: 'MyTest', filename: __dirname + '/examples_1/simple_storage_test.sol' }, { type: 'testPass', value: 'Initial value should be100', context: 'MyTest' }, { type: 'testPass', value: 'Initial value should not be200', context: 'MyTest' }, - { type: 'testFailure', value: 'Should trigger one fail', errMsg: 'uint test 1 fails', context: 'MyTest' }, + { type: 'testFailure', value: 'Should trigger one fail', errMsg: 'uint test 1 fails', context: 'MyTest', expected: '2', returned: '1'}, { type: 'testPass', value: 'Should trigger one pass', context: 'MyTest' } ], ['time']) })