| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.web.bindery.requestfactory.shared; |
| |
| import com.google.gwt.core.client.GWT; |
| import com.google.gwt.event.shared.SimpleEventBus; |
| import com.google.gwt.junit.client.GWTTestCase; |
| |
| /** |
| * Tests the ability of instance services to inherit methods |
| * from a base class. |
| */ |
| public class ServiceInheritanceTest extends GWTTestCase { |
| |
| /** |
| * ServiceLocator that returns the base class or subclass implementation |
| * specified in the @{@link Service} annotation. |
| */ |
| public static class SumServiceLocator implements ServiceLocator { |
| public Object getInstance(Class<?> clazz) { |
| if (BaseImpl.class.equals(clazz)) { |
| return new BaseImpl(); |
| } else if (SubclassImpl.class.equals(clazz)) { |
| return new SubclassImpl(); |
| } |
| return null; |
| } |
| } |
| |
| /** |
| * The factory under test. |
| */ |
| protected interface Factory extends RequestFactory { |
| SumServiceBase baseContext(); |
| SumServiceSub subContext(); |
| } |
| |
| /** |
| * Specifies the base class implementation. |
| */ |
| @Service(value = BaseImpl.class, locator = SumServiceLocator.class) |
| interface SumServiceBase extends RequestContext { |
| Request<Integer> add(int n); |
| Request<Integer> subtract(int n); |
| } |
| |
| /** |
| * Specifies the subclass implementation. |
| */ |
| @Service(value = SubclassImpl.class, locator = SumServiceLocator.class) |
| interface SumServiceSub extends RequestContext { |
| Request<Integer> add(int n); |
| Request<Integer> subtract(int n); |
| } |
| |
| /** |
| * Base implementation of {@link SumServiceBase}. |
| */ |
| static class BaseImpl { |
| protected int initialValue; |
| |
| public BaseImpl() { |
| initialValue = 5; |
| } |
| |
| public Integer add(int n) { |
| return initialValue + n; |
| } |
| |
| public Integer subtract(int n) { |
| return initialValue - n; |
| } |
| } |
| |
| /** |
| * Subclass implementation of {@link SumServiceSub} |
| * inherits the add() method. |
| */ |
| static class SubclassImpl extends BaseImpl { |
| public SubclassImpl() { |
| /* |
| * Init with a different value to distinguish between base & subclass |
| * implementations in the tests |
| */ |
| initialValue = 8; |
| } |
| |
| @Override |
| public Integer subtract(int n) { |
| return 0; |
| } |
| } |
| |
| private static final int TEST_DELAY = 5000; |
| |
| private Factory factory; |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.web.bindery.requestfactory.gwt.RequestFactorySuite"; |
| } |
| |
| /** |
| * Call a method inherited from a base class. |
| */ |
| public void testInvokeInheritedMethod() { |
| delayTestFinish(TEST_DELAY); |
| factory.subContext().add(13).fire(new Receiver<Integer>() { |
| @Override |
| public void onSuccess(Integer response) { |
| assertEquals((Integer) 21, response); |
| finishTest(); |
| } |
| }); |
| } |
| |
| /** |
| * Call a method implemented in a base class. |
| */ |
| public void testInvokeMethodOnBaseClass() { |
| delayTestFinish(TEST_DELAY); |
| factory.baseContext().add(13).fire(new Receiver<Integer>() { |
| @Override |
| public void onSuccess(Integer response) { |
| assertEquals((Integer) 18, response); |
| finishTest(); |
| } |
| }); |
| } |
| |
| /** |
| * Call a method overridden in a subclass. |
| */ |
| public void testInvokeOverriddenMethod() { |
| delayTestFinish(TEST_DELAY); |
| factory.subContext().subtract(3).fire(new Receiver<Integer>() { |
| @Override |
| public void onSuccess(Integer response) { |
| assertEquals((Integer) 0, response); |
| finishTest(); |
| } |
| }); |
| } |
| |
| protected Factory createFactory() { |
| Factory toReturn = GWT.create(Factory.class); |
| toReturn.initialize(new SimpleEventBus()); |
| return toReturn; |
| } |
| |
| @Override |
| protected void gwtSetUp() { |
| factory = createFactory(); |
| } |
| |
| } |