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)