// Copyright 2016 The go-ethereum Authors // This file is part of the go-ethereum library. // // The go-ethereum library is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // The go-ethereum library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . package ethclient import ( "errors" "math/big" "reflect" "testing" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" ) func TestToFilterArg(t *testing.T) { blockHashErr := errors.New("cannot specify both BlockHash and FromBlock/ToBlock") addresses := []common.Address{ common.HexToAddress("0xD36722ADeC3EdCB29c8e7b5a47f352D701393462"), } blockHash := common.HexToHash( "0xeb94bb7d78b73657a9d7a99792413f50c0a45c51fc62bdcb08a53f18e9a2b4eb", ) for _, testCase := range []struct { name string input ethereum.FilterQuery output interface{} err error }{ { "without BlockHash", ethereum.FilterQuery{ Addresses: addresses, FromBlock: big.NewInt(1), ToBlock: big.NewInt(2), Topics: [][]common.Hash{}, }, map[string]interface{}{ "address": addresses, "fromBlock": "0x1", "toBlock": "0x2", "topics": [][]common.Hash{}, }, nil, }, { "with nil fromBlock and nil toBlock", ethereum.FilterQuery{ Addresses: addresses, Topics: [][]common.Hash{}, }, map[string]interface{}{ "address": addresses, "fromBlock": "0x0", "toBlock": "latest", "topics": [][]common.Hash{}, }, nil, }, { "with negative fromBlock and negative toBlock", ethereum.FilterQuery{ Addresses: addresses, FromBlock: big.NewInt(-1), ToBlock: big.NewInt(-1), Topics: [][]common.Hash{}, }, map[string]interface{}{ "address": addresses, "fromBlock": "pending", "toBlock": "pending", "topics": [][]common.Hash{}, }, nil, }, { "with blockhash", ethereum.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, Topics: [][]common.Hash{}, }, map[string]interface{}{ "address": addresses, "blockHash": blockHash, "topics": [][]common.Hash{}, }, nil, }, { "with blockhash and from block", ethereum.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, FromBlock: big.NewInt(1), Topics: [][]common.Hash{}, }, nil, blockHashErr, }, { "with blockhash and to block", ethereum.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, ToBlock: big.NewInt(1), Topics: [][]common.Hash{}, }, nil, blockHashErr, }, { "with blockhash and both from / to block", ethereum.FilterQuery{ Addresses: addresses, BlockHash: &blockHash, FromBlock: big.NewInt(1), ToBlock: big.NewInt(2), Topics: [][]common.Hash{}, }, nil, blockHashErr, }, } { t.Run(testCase.name, func(t *testing.T) { output, err := toFilterArg(testCase.input) if (testCase.err == nil) != (err == nil) { t.Fatalf("expected error %v but got %v", testCase.err, err) } if testCase.err != nil { if testCase.err.Error() != err.Error() { t.Fatalf("expected error %v but got %v", testCase.err, err) } } else if !reflect.DeepEqual(testCase.output, output) { t.Fatalf("expected filter arg %v but got %v", testCase.output, output) } }) } }