/* * 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.junit.client.GWTTestCase; import com.google.web.bindery.event.shared.SimpleEventBus; /** * 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(); } /** * Demonstrate that mix-in interfaces work correctly. */ interface HasAdd { Request<Integer> add(int n); } /** * Specifies the base class implementation. */ @Service(value = BaseImpl.class, locator = SumServiceLocator.class) interface SumServiceBase extends RequestContext, HasAdd { Request<Integer> subtract(int n); } /** * Specifies the subclass implementation. */ @Service(value = SubclassImpl.class, locator = SumServiceLocator.class) interface SumServiceSub extends SumServiceBase { } /** * 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(); } }