;; test_forwarding.nu ;; tests for message forwarding in Nu ;; ;; Copyright (c) 2011 Brian Chapados (class RealThingBase is NSObject (- (id)baseName is "RealThingBase")) (class RealThing is RealThingBase (- (id)realName is "RealThing")) ;; Standard Message forwarding: ;; override -forwardInvocation:, -respondsToSelector:, -methodSignatureForSelector: (class MyRegularProxy is NSObject (- (id)initWithObject:(id)delegate is (self init) (set @delegate delegate) self) (- (id)proxyName is "ARegularProxy") (- (void) forwardInvocation:(id) invocation is (set selector (invocation selector)) (if (@delegate respondsToSelector:selector) (then (invocation retainArguments) (invocation invokeWithTarget:@delegate)) (else (self doesNotRecognizeSelector:selector)))) (- (BOOL) respondsToSelector:(SEL) selector is (set mySuperClass (RealThing class)) (set result (mySuperClass instancesRespondToSelector:selector)) (if (eq NO result) (set result (@delegate respondsToSelector:selector))) result) (- (id)methodSignatureForSelector:(SEL) selector is (@delegate methodSignatureForSelector:selector))) ;; Fast-forwarding path: ;; implement -forwardingTargetForSelector: (class MyFastProxy is NSObject (- (id)initWithObject:(id)delegate is (self init) (set @delegate delegate) self) (- (id)proxyName is "AFastForwardingProxy") (- (id)forwardingTargetForSelector:(SEL)selector is (if (@delegate respondsToSelector:selector) (then @delegate) (else nil)))) (class TestForwarding is NuTestCase (- testNormalForwarding is (set real ((RealThing alloc) init)) (set proxy ((MyRegularProxy alloc) initWithObject:real)) (assert_equal "RealThing" (real realName)) (assert_equal "ARegularProxy" (proxy proxyName)) (assert_equal "RealThing" (proxy realName)) (assert_equal "RealThingBase" (proxy baseName))) (- testFastForwarding is (set real ((RealThing alloc) init)) (set proxy ((MyFastProxy alloc) initWithObject:real)) (assert_equal "RealThing" (real realName)) (assert_equal "AFastForwardingProxy" (proxy proxyName)) (assert_equal "RealThing" (proxy realName)) (assert_equal "RealThingBase" (proxy baseName))))