78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			78 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // Copyright 2015 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 <http://www.gnu.org/licenses/>. | ||
|  | 
 | ||
|  | package core | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"encoding/json" | ||
|  | 	"math/big" | ||
|  | 	"os" | ||
|  | 	"testing" | ||
|  | 
 | ||
|  | 	"github.com/ethereum/go-ethereum/common" | ||
|  | ) | ||
|  | 
 | ||
|  | type diffTest struct { | ||
|  | 	ParentTimestamp    uint64 | ||
|  | 	ParentDifficulty   *big.Int | ||
|  | 	CurrentTimestamp   uint64 | ||
|  | 	CurrentBlocknumber *big.Int | ||
|  | 	CurrentDifficulty  *big.Int | ||
|  | } | ||
|  | 
 | ||
|  | func (d *diffTest) UnmarshalJSON(b []byte) (err error) { | ||
|  | 	var ext struct { | ||
|  | 		ParentTimestamp    string | ||
|  | 		ParentDifficulty   string | ||
|  | 		CurrentTimestamp   string | ||
|  | 		CurrentBlocknumber string | ||
|  | 		CurrentDifficulty  string | ||
|  | 	} | ||
|  | 	if err := json.Unmarshal(b, &ext); err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	d.ParentTimestamp = common.String2Big(ext.ParentTimestamp).Uint64() | ||
|  | 	d.ParentDifficulty = common.String2Big(ext.ParentDifficulty) | ||
|  | 	d.CurrentTimestamp = common.String2Big(ext.CurrentTimestamp).Uint64() | ||
|  | 	d.CurrentBlocknumber = common.String2Big(ext.CurrentBlocknumber) | ||
|  | 	d.CurrentDifficulty = common.String2Big(ext.CurrentDifficulty) | ||
|  | 
 | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | func TestDifficulty(t *testing.T) { | ||
|  | 	file, err := os.Open("../tests/files/BasicTests/difficulty.json") | ||
|  | 	if err != nil { | ||
|  | 		t.Fatal(err) | ||
|  | 	} | ||
|  | 	defer file.Close() | ||
|  | 
 | ||
|  | 	tests := make(map[string]diffTest) | ||
|  | 	err = json.NewDecoder(file).Decode(&tests) | ||
|  | 	if err != nil { | ||
|  | 		t.Fatal(err) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	for name, test := range tests { | ||
|  | 		number := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1)) | ||
|  | 		diff := CalcDifficulty(test.CurrentTimestamp, test.ParentTimestamp, number, test.ParentDifficulty) | ||
|  | 		if diff.Cmp(test.CurrentDifficulty) != 0 { | ||
|  | 			t.Error(name, "failed. Expected", test.CurrentDifficulty, "and calculated", diff) | ||
|  | 		} | ||
|  | 	} | ||
|  | } |