001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020package org.apache.mina.statemachine.transition; 021 022import java.lang.reflect.Method; 023 024import org.apache.mina.statemachine.State; 025import org.apache.mina.statemachine.context.StateContext; 026import org.apache.mina.statemachine.event.Event; 027import org.apache.mina.statemachine.transition.MethodTransition; 028 029import com.agical.rmock.extension.junit.RMockTestCase; 030 031/** 032 * Tests {@link MethodTransition}. 033 * 034 * @author <a href="http://mina.apache.org">Apache MINA Project</a> 035 */ 036public class MethodTransitionTest extends RMockTestCase { 037 State currentState; 038 039 State nextState; 040 041 TestStateContext context; 042 043 Target target; 044 045 Method subsetAllArgsMethod1; 046 047 Method subsetAllArgsMethod2; 048 049 Event noArgsEvent; 050 051 Event argsEvent; 052 053 Object[] args; 054 055 protected void setUp() throws Exception { 056 super.setUp(); 057 058 currentState = new State("current"); 059 nextState = new State("next"); 060 target = (Target) mock(Target.class); 061 subsetAllArgsMethod1 = Target.class.getMethod("subsetAllArgs", new Class[] { TestStateContext.class, B.class, 062 A.class, Integer.TYPE }); 063 subsetAllArgsMethod2 = Target.class.getMethod("subsetAllArgs", new Class[] { Event.class, B.class, B.class, 064 Boolean.TYPE }); 065 066 args = new Object[] { new A(), new B(), new C(), new Integer(627438), Boolean.TRUE }; 067 context = (TestStateContext) mock(TestStateContext.class); 068 noArgsEvent = new Event("event", context, new Object[0]); 069 argsEvent = new Event("event", context, args); 070 } 071 072 public void testExecuteWrongEventId() throws Exception { 073 startVerification(); 074 MethodTransition t = new MethodTransition("otherEvent", nextState, "noArgs", target); 075 assertFalse(t.execute(noArgsEvent)); 076 } 077 078 public void testExecuteNoArgsMethodOnNoArgsEvent() throws Exception { 079 target.noArgs(); 080 startVerification(); 081 MethodTransition t = new MethodTransition("event", nextState, "noArgs", target); 082 assertTrue(t.execute(noArgsEvent)); 083 } 084 085 public void testExecuteNoArgsMethodOnArgsEvent() throws Exception { 086 target.noArgs(); 087 startVerification(); 088 MethodTransition t = new MethodTransition("event", nextState, "noArgs", target); 089 assertTrue(t.execute(argsEvent)); 090 } 091 092 public void testExecuteExactArgsMethodOnNoArgsEvent() throws Exception { 093 startVerification(); 094 MethodTransition t = new MethodTransition("event", nextState, "exactArgs", target); 095 assertFalse(t.execute(noArgsEvent)); 096 } 097 098 public void testExecuteExactArgsMethodOnArgsEvent() throws Exception { 099 target.exactArgs((A) args[0], (B) args[1], (C) args[2], ((Integer) args[3]).intValue(), 100 ((Boolean) args[4]).booleanValue()); 101 startVerification(); 102 MethodTransition t = new MethodTransition("event", nextState, "exactArgs", target); 103 assertTrue(t.execute(argsEvent)); 104 } 105 106 public void testExecuteSubsetExactArgsMethodOnNoArgsEvent() throws Exception { 107 startVerification(); 108 MethodTransition t = new MethodTransition("event", nextState, "subsetExactArgs", target); 109 assertFalse(t.execute(noArgsEvent)); 110 } 111 112 public void testExecuteSubsetExactArgsMethodOnArgsEvent() throws Exception { 113 target.subsetExactArgs((A) args[0], (A) args[1], ((Integer) args[3]).intValue()); 114 startVerification(); 115 MethodTransition t = new MethodTransition("event", nextState, "subsetExactArgs", target); 116 assertTrue(t.execute(argsEvent)); 117 } 118 119 public void testExecuteAllArgsMethodOnArgsEvent() throws Exception { 120 target.allArgs(argsEvent, context, (A) args[0], (B) args[1], (C) args[2], ((Integer) args[3]).intValue(), 121 ((Boolean) args[4]).booleanValue()); 122 startVerification(); 123 MethodTransition t = new MethodTransition("event", nextState, "allArgs", target); 124 assertTrue(t.execute(argsEvent)); 125 } 126 127 public void testExecuteSubsetAllArgsMethod1OnArgsEvent() throws Exception { 128 target.subsetAllArgs(context, (B) args[1], (A) args[2], ((Integer) args[3]).intValue()); 129 startVerification(); 130 MethodTransition t = new MethodTransition("event", nextState, subsetAllArgsMethod1, target); 131 assertTrue(t.execute(argsEvent)); 132 } 133 134 public void testExecuteSubsetAllArgsMethod2OnArgsEvent() throws Exception { 135 target.subsetAllArgs(argsEvent, (B) args[1], (B) args[2], ((Boolean) args[4]).booleanValue()); 136 startVerification(); 137 MethodTransition t = new MethodTransition("event", nextState, subsetAllArgsMethod2, target); 138 assertTrue(t.execute(argsEvent)); 139 } 140 141 public interface Target { 142 void noArgs(); 143 144 void exactArgs(A a, B b, C c, int integer, boolean bool); 145 146 void allArgs(Event event, StateContext ctxt, A a, B b, C c, int integer, boolean bool); 147 148 void subsetExactArgs(A a, A b, int integer); 149 150 void subsetAllArgs(TestStateContext ctxt, B b, A c, int integer); 151 152 void subsetAllArgs(Event event, B b, B c, boolean bool); 153 } 154 155 public interface TestStateContext extends StateContext { 156 } 157 158 public static class A { 159 } 160 161 public static class B extends A { 162 } 163 164 public static class C extends B { 165 } 166}