/* * Copyright 2007 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.dev.jjs.test; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.user.client.ui.Widget; import java.io.Serializable; /** * Test type casts and <code>instanceof</code>. */ @SuppressWarnings("unused") public class ClassCastTest extends GWTTestCase { static class Apple extends Food implements CanEatRaw { } static interface CanEatRaw { } static abstract class Food { } static class Drink { } private volatile Object arrayOfInt = new int[3]; private volatile Object arrayOfWidget = new Widget[4]; private volatile Object arrayOfApple = new Apple[5]; private volatile Food foodItem = new Apple(); private volatile CanEatRaw rawFoodItem = new Apple(); private volatile Object drinkItem = new Drink(); @Override public String getModuleName() { return "com.google.gwt.dev.jjs.CompilerSuite"; } public void testArrayInterfaces() { assertTrue(arrayOfInt instanceof Serializable); assertTrue(arrayOfWidget instanceof Serializable); assertTrue(arrayOfInt instanceof Cloneable); assertTrue(arrayOfWidget instanceof Cloneable); assertFalse(arrayOfInt instanceof Food); assertFalse(arrayOfWidget instanceof Food); } public void testBaseToInterface() { CanEatRaw canEatRaw = (CanEatRaw) foodItem; } public void testBaseToInterfaceArrayElement() { CanEatRaw[] canEatRawArray = new CanEatRaw[3]; canEatRawArray[1] = (CanEatRaw) foodItem; } public void testBaseToInterfaceMethod() { CanEatRaw canEatRaw = (CanEatRaw) getFoodItem(); } @SuppressWarnings("cast") public void testBaseToInterfaceToConcreteCrazyInline() { Apple apple = (Apple) (CanEatRaw) (Food) new Apple(); } public void testBaseToInterfaceToConcreteField() { Apple apple = (Apple) getFoodAsRawFoodField(); } public void testBaseToInterfaceToConcreteInline() { Apple apple = (Apple) (CanEatRaw) foodItem; } public void testBaseToInterfaceToConcreteMethod() { Apple apple = (Apple) getFoodAsRawFoodMethod(); } public void testDownCastClass() { Apple apple = (Apple) foodItem; } public void testDownCastToArrayElement() { Apple[] appleArray = new Apple[3]; appleArray[2] = (Apple) foodItem; } public void testDownCastToArrayArrayElement() { Apple[][] appleArrayArray = new Apple[3][4]; appleArrayArray[2][2] = (Apple) foodItem; } public void testArrayToArrayArrayElement() { Apple[][] appleArrayArray = new Apple[3][5]; appleArrayArray[2] = (Apple[]) arrayOfApple; } public void testDownCastClassMethod() { Apple apple = (Apple) getFoodItem(); } public void testDownCastInterface() { Apple apple = (Apple) rawFoodItem; } public void testDownCastInterfaceToArrayElement() { Apple[] appleArray = new Apple[3]; appleArray[2] = (Apple) rawFoodItem; } public void testDownCastInterfaceMethod() { Apple apple = (Apple) getRawFoodItem(); } public void testInterfaceToBaseToConcreteField() { Apple apple = (Apple) getRawFoodAsFoodField(); } public void testInterfaceToBaseToConcreteInline() { Apple apple = (Apple) (Food) rawFoodItem; } public void testInterfaceToBaseToConcreteMethod() { Apple apple = (Apple) getRawFoodAsFoodMethod(); } public void testClassCastExceptionObjectToConcrete() { try { Apple apple = (Apple) drinkItem; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testClassCastExceptionToBase() { try { Food food = (Food) drinkItem; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testClassCastExceptionToInterface() { try { CanEatRaw canEatRaw = (CanEatRaw) drinkItem; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testClassCastExceptionArrayToConcrete() { try { Apple apple = (Apple) arrayOfWidget; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testClassCastExceptionObjectToArray() { try { Apple[] appleArray = (Apple[]) drinkItem; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testClassCastExceptionObjectToConcreteArrayElement() { try { Apple[] appleArray = new Apple[3]; appleArray[0] = (Apple) drinkItem; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testArrayStoreExceptionObjectToConcreteArrayElement() { try { Object[] appleArray = new Apple[3]; appleArray[0] = drinkItem; fail("Expected ArrayStoreException"); } catch (ArrayStoreException e) { // expected } } public void testClassCastExceptionArrayToArrayArrayElement() { try { Apple[][] appleArrayArray = new Apple[3][4]; appleArrayArray[2] = (Apple[]) arrayOfWidget; fail("Expected ClassCastException"); } catch (ClassCastException e) { // expected } } public void testArrayStoreExceptionArrayToArrayArrayElement() { try { Object[][] appleArrayArray = new Apple[3][4]; appleArrayArray[2] = (Object[]) arrayOfWidget; fail("Expected ArrayStoreException"); } catch (ArrayStoreException e) { // expected } } private CanEatRaw getFoodAsRawFoodField() { return (CanEatRaw) foodItem; } private CanEatRaw getFoodAsRawFoodMethod() { return (CanEatRaw) getFoodItem(); } private Food getFoodItem() { return foodItem; } private Food getRawFoodAsFoodField() { return (Food) rawFoodItem; } private Food getRawFoodAsFoodMethod() { return (Food) getRawFoodItem(); } private CanEatRaw getRawFoodItem() { return rawFoodItem; } }