diff options
author | obscuren <geffobscura@gmail.com> | 2014-03-03 18:35:35 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-03-03 18:35:35 +0800 |
commit | 5b1613d65b0c3471b80990120022b5a745ecab86 (patch) | |
tree | addbb87cc82cca07e8ac8aa810d810e1de02b2a5 /ethutil | |
parent | d7c5936ac4ee8ae3156e0bc9813db61b990aa686 (diff) | |
parent | c1d0ea7366f1bad134c985dbe1f272d376e5ec9b (diff) | |
download | go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.gz go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.bz2 go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.lz go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.xz go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.tar.zst go-tangerine-5b1613d65b0c3471b80990120022b5a745ecab86.zip |
Merge branch 'master' into develop
Diffstat (limited to 'ethutil')
-rw-r--r-- | ethutil/common_test.go | 43 | ||||
-rw-r--r-- | ethutil/reactor.go | 86 | ||||
-rw-r--r-- | ethutil/reactor_test.go | 30 |
3 files changed, 151 insertions, 8 deletions
diff --git a/ethutil/common_test.go b/ethutil/common_test.go index 3a6a37ff5..b5c733ff3 100644 --- a/ethutil/common_test.go +++ b/ethutil/common_test.go @@ -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) + } } diff --git a/ethutil/reactor.go b/ethutil/reactor.go new file mode 100644 index 000000000..f8084986c --- /dev/null +++ b/ethutil/reactor.go @@ -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}) + } +} diff --git a/ethutil/reactor_test.go b/ethutil/reactor_test.go new file mode 100644 index 000000000..48c2f0df3 --- /dev/null +++ b/ethutil/reactor_test.go @@ -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") + } +} |