From c8ca415b4b6c541b429018bd1078aaa003d086a0 Mon Sep 17 00:00:00 2001 From: pocke Date: Mon, 12 Jan 2015 12:34:04 +0900 Subject: [PATCH] Off return nil --- goevent.go | 9 ++++++++- goevent_test.go | 10 +++++++++- table.go | 10 +++++----- table_test.go | 5 ++++- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/goevent.go b/goevent.go index 13ce063..e91ac2c 100644 --- a/goevent.go +++ b/goevent.go @@ -61,19 +61,26 @@ func (p *Event) On(f interface{}) error { return nil } -func (p *Event) Off(f interface{}) { +func (p *Event) Off(f interface{}) error { fn := reflect.ValueOf(f) p.lmu.Lock() defer p.lmu.Unlock() l := len(p.listeners) + m := l // for error check for i := 0; i < l; i++ { if fn == p.listeners[i] { + // XXX: GC Ref: http://jxck.hatenablog.com/entry/golang-slice-internals p.listeners = append(p.listeners[:i], p.listeners[i+1:]...) l-- i-- } } + + if l == m { + return fmt.Errorf("Listener does't exists") + } + return nil } func (p *Event) checkFuncSignature(f interface{}) (*reflect.Value, error) { diff --git a/goevent_test.go b/goevent_test.go index 38267c6..e0978ce 100644 --- a/goevent_test.go +++ b/goevent_test.go @@ -115,7 +115,10 @@ func TestOff(t *testing.T) { t.Errorf("k expected 1, but got %d", k) } - p.Off(f) + err := p.Off(f) + if err != nil { + t.Error(err) + } p.Trigger() if i != 1 { t.Errorf("i expected 1, but got %d", i) @@ -126,4 +129,9 @@ func TestOff(t *testing.T) { if k != 2 { t.Errorf("k expected 2, but got %d", k) } + + err = p.Off(f) + if err == nil { + t.Errorf("should return error when Listener doesn't exists. but got nil") + } } diff --git a/table.go b/table.go index 2f9adc8..19d6e32 100644 --- a/table.go +++ b/table.go @@ -8,7 +8,7 @@ import ( type Table interface { On(string, interface{}) error Trigger(string, ...interface{}) error - Off(string, interface{}) + Off(string, interface{}) error Destroy(string) error } @@ -47,16 +47,16 @@ func (t *table) On(name string, f interface{}) error { return ev.On(f) } -// XXX: return error? -func (t *table) Off(name string, f interface{}) { +func (t *table) Off(name string, f interface{}) error { t.mu.Lock() defer t.mu.Unlock() e, ok := t.events[name] if !ok { - return + return fmt.Errorf("%s event has not been defined yet.", name) } - e.Off(f) + + return e.Off(f) } func (t *table) Destroy(name string) error { diff --git a/table_test.go b/table_test.go index b419ba5..300dd26 100644 --- a/table_test.go +++ b/table_test.go @@ -44,7 +44,10 @@ func TestTableOff(t *testing.T) { f := func() { i++ } ta.On("foo", f) ta.Trigger("foo") - ta.Off("foo", f) + err := ta.Off("foo", f) + if err != nil { + t.Error(err) + } ta.Trigger("foo") if i != 1 { t.Errorf("i expected 1, but got %d", i)