Add API Framework Revel Source Files
[iec.git] / src / foundation / api / revel / intercept_test.go
diff --git a/src/foundation/api/revel/intercept_test.go b/src/foundation/api/revel/intercept_test.go
new file mode 100644 (file)
index 0000000..ee2138d
--- /dev/null
@@ -0,0 +1,85 @@
+// Copyright (c) 2012-2016 The Revel Framework Authors, All rights reserved.
+// Revel Framework source code and usage is governed by a MIT style
+// license that can be found in the LICENSE file.
+
+package revel
+
+import (
+       "reflect"
+       "testing"
+)
+
+var funcP = func(c *Controller) Result { return nil }
+var funcP2 = func(c *Controller) Result { return nil }
+
+type InterceptController struct{ *Controller }
+type InterceptControllerN struct{ InterceptController }
+type InterceptControllerP struct{ *InterceptController }
+type InterceptControllerNP struct {
+       *Controller
+       InterceptControllerN
+       InterceptControllerP
+}
+
+func (c InterceptController) methN() Result  { return nil }
+func (c *InterceptController) methP() Result { return nil }
+
+func (c InterceptControllerN) methNN() Result  { return nil }
+func (c *InterceptControllerN) methNP() Result { return nil }
+func (c InterceptControllerP) methPN() Result  { return nil }
+func (c *InterceptControllerP) methPP() Result { return nil }
+
+// Methods accessible from InterceptControllerN
+var MethodN = []interface{}{
+       InterceptController.methN,
+       (*InterceptController).methP,
+       InterceptControllerN.methNN,
+       (*InterceptControllerN).methNP,
+}
+
+// Methods accessible from InterceptControllerP
+var MethodP = []interface{}{
+       InterceptController.methN,
+       (*InterceptController).methP,
+       InterceptControllerP.methPN,
+       (*InterceptControllerP).methPP,
+}
+
+// This checks that all the various kinds of interceptor functions/methods are
+// properly invoked.
+func TestInvokeArgType(t *testing.T) {
+       n := InterceptControllerN{InterceptController{&Controller{}}}
+       p := InterceptControllerP{&InterceptController{&Controller{}}}
+       np := InterceptControllerNP{&Controller{}, n, p}
+       testInterceptorController(t, reflect.ValueOf(&n), MethodN)
+       testInterceptorController(t, reflect.ValueOf(&p), MethodP)
+       testInterceptorController(t, reflect.ValueOf(&np), MethodN)
+       testInterceptorController(t, reflect.ValueOf(&np), MethodP)
+}
+
+func testInterceptorController(t *testing.T, appControllerPtr reflect.Value, methods []interface{}) {
+       interceptors = []*Interception{}
+       InterceptFunc(funcP, BEFORE, appControllerPtr.Elem().Interface())
+       InterceptFunc(funcP2, BEFORE, AllControllers)
+       for _, m := range methods {
+               InterceptMethod(m, BEFORE)
+       }
+       ints := getInterceptors(BEFORE, appControllerPtr)
+
+       if len(ints) != 6 {
+               t.Fatalf("N: Expected 6 interceptors, got %d.", len(ints))
+       }
+
+       testInterception(t, ints[0], reflect.ValueOf(&Controller{}))
+       testInterception(t, ints[1], reflect.ValueOf(&Controller{}))
+       for i := range methods {
+               testInterception(t, ints[i+2], appControllerPtr)
+       }
+}
+
+func testInterception(t *testing.T, intc *interceptorItem, arg reflect.Value) {
+       val := intc.Interceptor.Invoke(arg, &intc.Target)
+       if !val.IsNil() {
+               t.Errorf("Failed (%v): Expected nil got %v", intc, val)
+       }
+}