blob: 5dbb1c8937451ca4d6a0b43f1236fee9cbb328ca [file] [log] [blame]
/*
* Copyright 2014 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;
/**
* Tests that initialization order for field follow the "quirky" Java semantics.
*/
public class FieldInitializationOrderTest extends GWTTestCase {
@Override
public String getModuleName() {
return "com.google.gwt.dev.jjs.CompilerSuite";
}
static abstract class Tester {
abstract void performTest();
}
static class ConstructorCastClasses extends Tester {
static class Base {
Base() {
assertEquals(0, ((Child) this).i);
}
}
static class Child extends Base {
int i = 1;
}
void performTest() {
new Child();
}
}
static class InitializerCastClasses extends Tester {
static class Base {
{
assertEquals(0, ((Child) this).i);
}
}
static class Child extends Base {
int i = 1;
}
void performTest() {
new Child();
}
}
static class InitializerPolymorphicDispatchClasses extends Tester {
static class Base {
{
m();
}
void m() { }
}
static class Child extends Base {
int i = 1;
void m() { assertEquals(0, i); }
}
void performTest() {
// Construct both parent and child to ensure that polymorphic dispatch for m() does not go
// away
new Base();
new Child();
}
}
static class ConstructorPolymorphicDispatchClasses extends Tester {
static class Base {
Base() {
m();
}
void m() { }
}
static class Child extends Base {
int i = 1;
void m() { assertEquals(0, i); }
}
void performTest() {
// Construct both parent and child to ensure that polymorphic dispatch for m() does not go
// away
new Base();
new Child();
}
}
static class IncorrectlyOptimizedCondition extends Tester {
static class Base {
Base() {
m();
}
void m() { }
}
static class Child extends Base {
String s = "blah";
void m() { assertTrue(s == null); }
}
void performTest() {
// Construct both parent and child to ensure that polymorphic dispatch for m() does not go
// away
new Base();
new Child();
}
}
public void testInitializerCast() {
new InitializerCastClasses().performTest();
}
public void testConstructorCast() {
new ConstructorCastClasses().performTest();
}
public void testInitializerPolymorphicDispatch() {
new InitializerPolymorphicDispatchClasses().performTest();
}
public void testConstructorPolymorphicDispatch() {
new ConstructorPolymorphicDispatchClasses().performTest();
}
public void testIncorrectlyOptimizedCondition() {
new IncorrectlyOptimizedCondition().performTest();
}
}