'use strict'
import { NightwatchBrowser } from 'nightwatch'
import init from '../helpers/init'
module .exports = {
'@disabled' : true ,
before : function ( browser : NightwatchBrowser , done : VoidFunction ) {
// this test suite also contribute testing https://github.com/ethereum/remix/pull/1497 and https://github.com/ethereum/remix-ide/pull/2898
// quick explanation:
// the goal of https://github.com/ethereum/remix-ide/pull/2898 is to keep track of all the compiled contracts an not only the last one.
// this introduce an issue: if 2 compiled contracts have the same name, the second one override the first which is not wanted.
// fix's delivered by https://github.com/ethereum/remix/pull/1497: instead of getting contract by name,
// which result in name clashing we process the whole contract object (which contain bytecode, deployedbytecode, ...)
init ( browser , done )
} ,
'@sources' : function ( ) {
return sources
} ,
'Use special functions receive/fallback - both are declared, sending data #group1' : function ( browser : NightwatchBrowser ) {
browser . waitForElementVisible ( '#icon-panel' , 10000 )
. testContracts ( 'receiveAndFallback.sol' , sources [ 0 ] [ 'receiveAndFallback.sol' ] , [ 'CheckSpecials' ] ) // compile
. clickLaunchIcon ( 'udapp' )
. selectAccount ( '0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c' ) // this account will be used for this test suite
. selectContract ( 'CheckSpecials' )
. createContract ( '' ) // deploy
. clickInstance ( 0 )
. perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '0' , '0xaa' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(fallback)' )
. journalLastChildIncludes ( 'value: 0 wei' )
. journalLastChildIncludes ( 'data: 0xaa' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - both are declared, failing sending data < 1 byte #group1' : function ( browser : NightwatchBrowser ) {
// don't need to redeploy it, same contract
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '0' , '0xa' )
. pause ( 1000 )
. waitForElementVisible ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` )
. assert . containsText ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` , 'The calldata should be a valid hexadecimal value with size of at least one byte.' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - both are declared, failing sending data with odd number of digits #group1' : function ( browser : NightwatchBrowser ) {
// don't need to redeploy it, same contract
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '0' , '0x1aa' )
. pause ( 1000 )
. waitForElementVisible ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` )
. assert . containsText ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` , 'The calldata should be a valid hexadecimal value.' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - both are declared - receive called, sending wei #group1' : function ( browser : NightwatchBrowser ) {
// don't need to redeploy it, same contract
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '1' , '' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(receive)' )
. journalLastChildIncludes ( 'value: 1 wei' )
. journalLastChildIncludes ( 'data: 0x' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - both are declared - fallback should fail cause not payable, sending data and wei #group1' : function ( browser : NightwatchBrowser ) {
// don't need to redeploy it, same contract
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '10' , '0xaa' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to CheckSpecials.(fallback) errored:' )
. journalLastChildIncludes ( 'The called function should be payable if you send value' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - only receive is declared, sending wei #group2' : function ( browser : NightwatchBrowser ) {
browser . waitForElementVisible ( '#icon-panel' , 10000 )
. testContracts ( 'receiveOnly.sol' , sources [ 1 ] [ 'receiveOnly.sol' ] , [ 'CheckSpecials' ] )
. clickLaunchIcon ( 'udapp' )
. selectContract ( 'CheckSpecials' )
. createContract ( '' )
. clickInstance ( 0 )
. perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '1' , '' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(receive)' )
. journalLastChildIncludes ( 'value: 1 wei' )
. journalLastChildIncludes ( 'data: 0x' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - only receive is declared, failing, fallback is not declared, sending data #group2' : function ( browser : NightwatchBrowser ) {
// don't need to redeploy it, same contract
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '0' , '0xaa' )
. pause ( 1000 )
. waitForElementVisible ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` )
. assert . containsText ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` , '\'Fallback\' function is not defined' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - only fallback declared and is payable, sending wei #group3' : function ( browser : NightwatchBrowser ) {
browser . waitForElementVisible ( '#icon-panel' , 10000 )
. testContracts ( 'fallbackOnlyPayable.sol' , sources [ 2 ] [ 'fallbackOnlyPayable.sol' ] , [ 'CheckSpecials' ] )
. clickLaunchIcon ( 'udapp' )
. selectContract ( 'CheckSpecials' )
. createContract ( '' )
. clickInstance ( 0 )
. perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '1' , '' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(fallback)' )
. journalLastChildIncludes ( 'value: 1 wei' )
. journalLastChildIncludes ( 'data: 0x' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - only fallback is diclared and is payable, sending data and wei #group3' : function ( browser : NightwatchBrowser ) {
// don't need to redeploy it, same contract
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '1' , '0xaa' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(fallback)' )
. journalLastChildIncludes ( 'value: 1 wei' )
. journalLastChildIncludes ( 'data: 0xaa' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - only fallback is declared, fallback should fail cause not payable, sending wei #group4' : function ( browser : NightwatchBrowser ) {
browser . waitForElementVisible ( '#icon-panel' , 10000 )
. testContracts ( 'fallbackOnlyNotPayable.sol' , sources [ 3 ] [ 'fallbackOnlyNotPayable.sol' ] , [ 'CheckSpecials' ] )
. clickLaunchIcon ( 'udapp' )
. selectContract ( 'CheckSpecials' )
. createContract ( '' )
. clickInstance ( 0 )
. perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '1' , '' )
. pause ( 1000 )
. waitForElementVisible ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` )
. assert . containsText ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` , 'should have either \'receive\' or payable \'fallback\'' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - receive and fallback are declared, sending data and wei #group4' : function ( browser : NightwatchBrowser ) {
browser . waitForElementVisible ( '#icon-panel' , 10000 )
. testContracts ( 'receiveAndFallbackBothPayable.sol' , sources [ 4 ] [ 'receiveAndFallbackBothPayable.sol' ] , [ 'CheckSpecials' ] )
. clickLaunchIcon ( 'udapp' )
. selectContract ( 'CheckSpecials' )
. waitForElementVisible ( '#value' )
. clearValue ( '#value' )
. setValue ( '#value' , '0' )
. pause ( 2000 )
. createContract ( '' )
. clickInstance ( 1 )
. pause ( 1000 )
. perform ( ( done ) = > {
browser . getAddressAtPosition ( 1 , ( address ) = > {
browser . sendLowLevelTx ( address , '999999998765257135' , '0xaa' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(fallback)' )
. journalLastChildIncludes ( 'value: 999999998765257135 wei' )
. journalLastChildIncludes ( 'data: 0xaa' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - receive and fallback are declared and payable, sending wei #group4' : function ( browser : NightwatchBrowser ) {
browser . perform ( ( done ) = > {
browser . getAddressAtPosition ( 1 , ( address ) = > {
browser . sendLowLevelTx ( address , '1' , '' )
. pause ( 1000 )
. journalLastChildIncludes ( 'to: CheckSpecials.(receive)' )
. journalLastChildIncludes ( 'value: 1 wei' )
. journalLastChildIncludes ( 'data: 0x' )
. perform ( done )
} )
} )
} ,
'Use special functions receive/fallback - receive and fallback are not declared, sending nothing #group5' : function ( browser : NightwatchBrowser ) {
browser . waitForElementVisible ( '#icon-panel' , 10000 )
. testContracts ( 'notSpecial.sol' , sources [ 5 ] [ 'notSpecial.sol' ] , [ 'CheckSpecials' ] )
. clickLaunchIcon ( 'udapp' )
. selectContract ( 'CheckSpecials' )
. waitForElementVisible ( '#value' )
. clearValue ( '#value' )
. setValue ( '#value' , '0' )
. createContract ( '' )
. clickInstance ( 0 )
. pause ( 1000 )
. perform ( ( done ) = > {
browser . getAddressAtPosition ( 0 , ( address ) = > {
browser . sendLowLevelTx ( address , '0' , '' )
. pause ( 1000 )
. waitForElementVisible ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` )
. assert . containsText ( ` #instance ${ address } label[id="deployAndRunLLTxError"] ` , 'Both \'receive\' and \'fallback\' functions are not defined' )
. perform ( done )
} )
} )
. end ( )
}
}
const sources = [
{
'receiveAndFallback.sol' : {
content : `
contract CheckSpecials {
receive ( ) payable external { }
fallback ( ) external { }
}
`
}
} ,
{
'receiveOnly.sol' : {
content : `
contract CheckSpecials {
receive ( ) payable external { }
}
`
}
} ,
{
'fallbackOnlyPayable.sol' : {
content : `
contract CheckSpecials {
fallback ( ) payable external { }
}
`
}
} ,
{
'fallbackOnlyNotPayable.sol' : {
content : `
contract CheckSpecials {
fallback ( ) external { }
}
`
}
} ,
{
'receiveAndFallbackBothPayable.sol' : {
content : `
contract CheckSpecials {
receive ( ) payable external { }
fallback ( ) payable external { }
}
`
}
} ,
{
'notSpecial.sol' : {
content : `
contract CheckSpecials {
function otherFallback ( ) payable external { }
}
`
}
}
]