/* * Copyright 2015 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.gwt.core.interop; import com.google.gwt.junit.client.GWTTestCase; import jsinterop.annotations.JsType; /** * Tests JsInterop bridge methods. */ public class JsTypeBridgeTest extends GWTTestCase { @Override public String getModuleName() { return "com.google.gwt.core.Interop"; } @JsType private interface JsListInterface { void add(Object o); } private interface Collection { void add(Object o); } private static class CollectionBase implements Collection { Object x; public void add(Object o) { x = o + "CollectionBase"; } } private interface List extends Collection, JsListInterface { void add(Object o); } private static class FooImpl extends CollectionBase implements Collection { @Override public void add(Object o) { super.add(o); x = x.toString() + "FooImpl"; } } private static class ListImpl extends CollectionBase implements List { @Override public void add(Object o) { x = o + "ListImpl"; } } public void testBridges() { ListImpl listWithExport = new ListImpl(); // Exports .add(). FooImpl listNoExport = new FooImpl(); // Does not export .add(). // Use a loose type reference to force polymorphic dispatch. Collection collectionWithExport = listWithExport; // Calls through a bridge method. collectionWithExport.add("Loose"); assertEquals("LooseListImpl", listWithExport.x); // Use a loose type reference to force polymorphic dispatch. Collection collectionNoExport = listNoExport; collectionNoExport.add("Loose"); assertEquals("LooseCollectionBaseFooImpl", listNoExport.x); // Calls directly. listNoExport.add("Tight"); assertEquals("TightCollectionBaseFooImpl", listNoExport.x); listWithExport.add("Tight"); assertEquals("TightListImpl", listWithExport.x); } }