1   /*
2    * Copyright (c) 1998, 2005 Gargoyle Software Inc. All rights reserved.
3    *
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions are met:
6    *
7    * 1. Redistributions of source code must retain the above copyright notice,
8    *    this list of conditions and the following disclaimer.
9    * 2. Redistributions in binary form must reproduce the above copyright notice,
10   *    this list of conditions and the following disclaimer in the documentation
11   *    and/or other materials provided with the distribution.
12   * 3. The end-user documentation included with the redistribution, if any, must
13   *    include the following acknowledgment:
14   *
15   *       "This product includes software developed by Gargoyle Software Inc.
16   *        (http://www.GargoyleSoftware.com/)."
17   *
18   *    Alternately, this acknowledgment may appear in the software itself, if
19   *    and wherever such third-party acknowledgments normally appear.
20   * 4. The name "Gargoyle Software" must not be used to endorse or promote
21   *    products derived from this software without prior written permission.
22   *    For written permission, please contact info@GargoyleSoftware.com.
23   * 5. Products derived from this software may not be called "GSBase", nor may
24   *    "GSBase" appear in their name, without prior written permission of
25   *    Gargoyle Software Inc.
26   *
27   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
28   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
29   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARGOYLE
30   * SOFTWARE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
33   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
36   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37   */
38  package com.gargoylesoftware.base.objectstore;
39  
40  import junit.framework.TestCase;
41  
42  /***
43   * Tests for ReflectedObjectStore
44   *
45   * @version  $Revision: 1.7 $
46   * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
47   */
48  public class ReflectedObjectStoreTest extends TestCase {
49      /***
50       *  Create an instance
51       *
52       * @param  name The name of the test
53       */
54      public ReflectedObjectStoreTest( final String name ) {
55          super( name );
56      }
57  
58  
59      /***
60       * Test calling execute when no commands have been registered.  This should
61       * throw an ObjectStoreCommandNotSupportedException
62       */
63      public void testExecute_NoCommandsRegistered() {
64          final TestStore store = new TestStore();
65  
66          final ObjectStoreCommand commandB = new CommandB();
67  
68          try {
69              store.execute( commandB );
70              fail( "Expected exception" );
71          }
72          catch( final ObjectStoreCommandNotSupportedException e ) {
73              assertEquals( "command", commandB, e.getCommand() );
74          }
75      }
76  
77  
78      /***
79       * Test calling execute when some commands are registered but an unregistered
80       * is passed into execute
81       */
82      public void testExecute_SomeCommandsRegistered_DifferentCommandExecuted() {
83          final TestStore store = new TestStore();
84          store.registerCommand( CommandA.class, "methodA" );
85  
86          final ObjectStoreCommand commandB = new CommandB();
87  
88          try {
89              store.execute( commandB );
90              fail( "Expected exception" );
91          }
92          catch( final ObjectStoreCommandNotSupportedException e ) {
93              assertEquals( "command", commandB, e.getCommand() );
94          }
95      }
96  
97  
98      /***
99       * Simple test for execute
100      */
101     public void testExecute() {
102         final TestStore store = new TestStore();
103         store.registerCommand( CommandA.class, "methodA" );
104 
105         final String result = (String)store.execute( new CommandA() );
106 
107         assertEquals( "A", result );
108     }
109 
110 
111     /***
112      * Try to register something that isn't a command class
113      */
114     public void testRegisterCommand_NotACommand() {
115         final TestStore store = new TestStore();
116         try {
117             store.registerCommand( int.class, "methodA" );
118             fail( "Expected IllegalArgumentException" );
119         }
120         catch( final IllegalArgumentException e ) {
121             // expected path
122         }
123     }
124 
125 
126     /***
127      * Try registering a method that doesn't exist
128      */
129     public void testRegisterCommand_BadMethodName() {
130         final TestStore store = new TestStore();
131         try {
132             store.registerCommand( CommandA.class, "foobar" );
133             fail( "Excepted exception" );
134         }
135         catch( final IllegalArgumentException e ) {
136             // Expected path
137         }
138     }
139 
140 
141     private class TestStore extends ReflectedObjectStore {
142         /***
143          *  Create an instance
144          */
145         public TestStore() {
146         	if( false ) {
147         		// Trick so that the "find used methods" function won't identify methodA as unused
148         		methodA(null);
149         	}
150         }
151 
152 
153         private Object methodA( final CommandA command ) {
154             return "A";
155         }
156     }
157 
158 
159     private class CommandA extends ObjectStoreCommand {
160 
161 		private static final long serialVersionUID = 1L;
162     }
163 
164 
165     private class CommandB extends ObjectStoreCommand {
166 
167 		private static final long serialVersionUID = 1L;
168     }
169 }
170