mirror of https://github.com/ethereum/go-ethereum
commit
5b1613d65b
@ -1,17 +1,44 @@ |
||||
package ethutil |
||||
|
||||
import ( |
||||
"fmt" |
||||
"math/big" |
||||
"testing" |
||||
) |
||||
|
||||
func TestCommon(t *testing.T) { |
||||
fmt.Println(CurrencyToString(BigPow(10, 19))) |
||||
fmt.Println(CurrencyToString(BigPow(10, 16))) |
||||
fmt.Println(CurrencyToString(BigPow(10, 13))) |
||||
fmt.Println(CurrencyToString(BigPow(10, 10))) |
||||
fmt.Println(CurrencyToString(BigPow(10, 7))) |
||||
fmt.Println(CurrencyToString(BigPow(10, 4))) |
||||
fmt.Println(CurrencyToString(big.NewInt(10))) |
||||
ether := CurrencyToString(BigPow(10, 19)) |
||||
finney := CurrencyToString(BigPow(10, 16)) |
||||
szabo := CurrencyToString(BigPow(10, 13)) |
||||
vito := CurrencyToString(BigPow(10, 10)) |
||||
turing := CurrencyToString(BigPow(10, 7)) |
||||
eins := CurrencyToString(BigPow(10, 4)) |
||||
wei := CurrencyToString(big.NewInt(10)) |
||||
|
||||
if ether != "10 Ether" { |
||||
t.Error("Got", ether) |
||||
} |
||||
|
||||
if finney != "10 Finney" { |
||||
t.Error("Got", finney) |
||||
} |
||||
|
||||
if szabo != "10 Szabo" { |
||||
t.Error("Got", szabo) |
||||
} |
||||
|
||||
if vito != "10 Vito" { |
||||
t.Error("Got", vito) |
||||
} |
||||
|
||||
if turing != "10 Turing" { |
||||
t.Error("Got", turing) |
||||
} |
||||
|
||||
if eins != "10 Eins" { |
||||
t.Error("Got", eins) |
||||
} |
||||
|
||||
if wei != "10 Wei" { |
||||
t.Error("Got", wei) |
||||
} |
||||
} |
||||
|
@ -0,0 +1,86 @@ |
||||
package ethutil |
||||
|
||||
import ( |
||||
"sync" |
||||
) |
||||
|
||||
type ReactorEvent struct { |
||||
mut sync.Mutex |
||||
event string |
||||
chans []chan React |
||||
} |
||||
|
||||
// Post the specified reactor resource on the channels
|
||||
// currently subscribed
|
||||
func (e *ReactorEvent) Post(react React) { |
||||
e.mut.Lock() |
||||
defer e.mut.Unlock() |
||||
|
||||
for _, ch := range e.chans { |
||||
go func(ch chan React) { |
||||
ch <- react |
||||
}(ch) |
||||
} |
||||
} |
||||
|
||||
// Add a subscriber to this event
|
||||
func (e *ReactorEvent) Add(ch chan React) { |
||||
e.mut.Lock() |
||||
defer e.mut.Unlock() |
||||
|
||||
e.chans = append(e.chans, ch) |
||||
} |
||||
|
||||
// Remove a subscriber
|
||||
func (e *ReactorEvent) Remove(ch chan React) { |
||||
e.mut.Lock() |
||||
defer e.mut.Unlock() |
||||
|
||||
for i, c := range e.chans { |
||||
if c == ch { |
||||
e.chans = append(e.chans[:i], e.chans[i+1:]...) |
||||
} |
||||
} |
||||
} |
||||
|
||||
// Basic reactor resource
|
||||
type React struct { |
||||
Resource interface{} |
||||
} |
||||
|
||||
// The reactor basic engine. Acts as bridge
|
||||
// between the events and the subscribers/posters
|
||||
type ReactorEngine struct { |
||||
patterns map[string]*ReactorEvent |
||||
} |
||||
|
||||
func NewReactorEngine() *ReactorEngine { |
||||
return &ReactorEngine{patterns: make(map[string]*ReactorEvent)} |
||||
} |
||||
|
||||
// Subscribe a channel to the specified event
|
||||
func (reactor *ReactorEngine) Subscribe(event string, ch chan React) { |
||||
ev := reactor.patterns[event] |
||||
// Create a new event if one isn't available
|
||||
if ev == nil { |
||||
ev = &ReactorEvent{event: event} |
||||
reactor.patterns[event] = ev |
||||
} |
||||
|
||||
// Add the channel to reactor event handler
|
||||
ev.Add(ch) |
||||
} |
||||
|
||||
func (reactor *ReactorEngine) Unsubscribe(event string, ch chan React) { |
||||
ev := reactor.patterns[event] |
||||
if ev != nil { |
||||
ev.Remove(ch) |
||||
} |
||||
} |
||||
|
||||
func (reactor *ReactorEngine) Post(event string, resource interface{}) { |
||||
ev := reactor.patterns[event] |
||||
if ev != nil { |
||||
ev.Post(React{Resource: resource}) |
||||
} |
||||
} |
@ -0,0 +1,30 @@ |
||||
package ethutil |
||||
|
||||
import "testing" |
||||
|
||||
func TestReactorAdd(t *testing.T) { |
||||
engine := NewReactorEngine() |
||||
ch := make(chan React) |
||||
engine.Subscribe("test", ch) |
||||
if len(engine.patterns) != 1 { |
||||
t.Error("Expected patterns to be 1, got", len(engine.patterns)) |
||||
} |
||||
} |
||||
|
||||
func TestReactorEvent(t *testing.T) { |
||||
engine := NewReactorEngine() |
||||
|
||||
// Buffer 1, so it doesn't block for this test
|
||||
ch := make(chan React, 1) |
||||
engine.Subscribe("test", ch) |
||||
engine.Post("test", "hello") |
||||
|
||||
value := <-ch |
||||
if val, ok := value.Resource.(string); ok { |
||||
if val != "hello" { |
||||
t.Error("Expected Resource to be 'hello', got", val) |
||||
} |
||||
} else { |
||||
t.Error("Unable to cast") |
||||
} |
||||
} |
Loading…
Reference in new issue