Index: tests/interceptor-slot.test =================================================================== diff -u -rae7d7d03bf76d21dd52d45181c3ab310e51845ec -r24cc5e107fd8d246061a9d4b4fafefc767811c2b --- tests/interceptor-slot.test (.../interceptor-slot.test) (revision ae7d7d03bf76d21dd52d45181c3ab310e51845ec) +++ tests/interceptor-slot.test (.../interceptor-slot.test) (revision 24cc5e107fd8d246061a9d4b4fafefc767811c2b) @@ -438,8 +438,162 @@ ? {c1 [Y info method definitionhandle bar]} "Z Y " } +# +# Test filter guards (define filter and guard separtely) +# +nx::test case filter-guard-separately { + + # + # Define a room with occupancy and methods for entering and leaving + # + nx::Class create Room { + :property name + :variable occupancy:integer 0 + + :public method enter {name} {incr ::occupancy} + :public method leave {name} {incr ::occupancy -1} + + # + # We are interested, what happens with the room, so we define a + # logging filter.... + # + :method loggingFilter args { + lappend ::_ [current calledmethod] + next + } + + # + # ... and we register it. + # + :filter add loggingFilter + } + + set ::_ {} + + ? {Room create r} ::r + r enter Uwe + r leave Uwe + r configure -name "Office" + ? {set ::_} "__objectparameter init enter leave configure" + + # + # Hmm, we not so much interested on all these calls. Just the + # "enter" and "leave" operations are fine. We could have certainly + # as well mixin for these two methods, but the guards are more + # general since the can as well trigger on arbitrary patterns. + # + + Room filter guard loggingFilter { + [current calledmethod] in {enter leave} + } + + r destroy + set ::_ {} + + ? {Room create r} ::r + r enter Uwe + r leave Uwe + r configure -name "Office" + ? {set ::_} "enter leave" + + r destroy + + # Now we define a subclass DangerRoom, which refines the filter by + # logging into a "dangerRoomLog". We want here entries for all + # operations. + + set ::_ {} + set ::dangerRoomLog {} + + nx::Class create DangerRoom -superclass Room { + :method loggingFilter args { + lappend ::dangerRoomLog [current calledmethod] + next + } + :filter add loggingFilter + } + + ? {DangerRoom create d} ::d + d enter Uwe + d leave Uwe + d configure -name "Safe Room" + ? {set ::_} "enter leave" + ? {expr [llength $::dangerRoomLog] > 2} 1 + + d destroy + +} + # +# Test filter guards (define filter together with guard) +# + +nx::test case filter-guard-separately { + + # + # Define a room with occupancy and methods for entering and leaving + # + nx::Class create Room { + :property name + :variable occupancy:integer 0 + + :public method enter {name} {incr ::occupancy} + :public method leave {name} {incr ::occupancy -1} + + # + # We are interested, what happens with the room, so we define a + # logging filter.... + # + :method loggingFilter args { + lappend ::_ [current calledmethod] + next + } + + # + # ... and we register it together with a guard. + # + :filter add {loggingFilter { + [current calledmethod] in {enter leave} + }} + } + + set ::_ {} + + ? {Room create r} ::r + r enter Uwe + r leave Uwe + r configure -name "Office" + ? {set ::_} "enter leave" + + # Now we define a subclass DangerRoom, which refines the filter by + # logging into a "dangerRoomLog". We want here entries for all + # operations. + + set ::_ {} + set ::dangerRoomLog {} + + nx::Class create DangerRoom -superclass Room { + + :method loggingFilter args { + lappend ::dangerRoomLog [current calledmethod] + next + } + :filter add loggingFilter + } + + ? {DangerRoom create d} ::d + d enter Uwe + d leave Uwe + d configure -name "Safe Room" + ? {set ::_} "enter leave" + ? {expr [llength $::dangerRoomLog] > 2} 1 + + d destroy +} + + +# # Local variables: # mode: tcl # tcl-indent-level: 2