blob: 88410ff159bef97435043fa778eba68500392710 [file] [log] [blame]
/*
* Copyright 2008 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 java.util.Arrays;
import java.util.Iterator;
/**
* This test is intended to exercise as many code paths and node types as
* possible in the Java to JavaScript compiler. This test is not at all intended
* to execute correctly.
*/
@SuppressWarnings("hiding")
public class CoverageTest extends CoverageBase {
/**
* TODO: document me.
*/
public class Inner extends Super {
public int x = 3;
public final int y = 4;
public Inner() {
// ExplicitConstructorCall
this(4);
}
public Inner(int i) {
// ExplicitConstructorCall
super(i);
}
@Override
public void foo() {
final int z = this.y;
new Inner() {
{
x = z;
this.x = z;
Inner.this.x = z;
next = CoverageTest.this.next;
next.foo();
CoverageTest.this.next.foo();
CoverageTest.this.x = z;
CoverageTest.super.x = z;
}
@Override
public void foo() {
x = z;
this.x = z;
Inner.this.x = z;
next = CoverageTest.this.next;
next.foo();
CoverageTest.this.next.foo();
CoverageTest.this.x = z;
CoverageTest.super.x = z;
}
};
class NamedLocal extends Inner {
@Override
@SuppressWarnings("unused")
public void foo() {
CoverageTest.this.getNext();
Inner.this.bar();
super.bar();
int x = z;
}
// JDT bug? This works in 5.0 but not in 1.4
// TODO: will javac compile it?
class NamedLocalSub extends NamedLocal {
@Override
@SuppressWarnings("unused")
public void foo() {
Inner.this.bar();
NamedLocal.this.foo();
super.foo();
int x = z;
}
}
}
testEmptyStatement();
new InnerSub().new InnerSubSub().fda();
new SecondMain().new FunkyInner();
/*
* The statement below causes a javac bug in openJdk and sun's java 6. It
* produces incorrect bytecode that fails with a java.lang.VerifyError --
* see Google's internal issue 1628473. This is likely to be an hindrance
* if and when GWT attempts to read bytecode directly.
*/
// new NamedLocal().new NamedLocalSub().foo();
}
public void bar() {
}
private void testAllocationExpression() {
// AllocationExpression
o = new Super();
assertEquals("3", o.toString());
o = new Super(42);
assertEquals("42", o.toString());
}
private void testAndAndExpression() {
// AND_AND_Expression
i = 2;
z = i == 1 && betterNotEval();
assertFalse(z);
}
private void testArrayAllocationExpression() {
// ArrayAllocationExpression
ia = new int[4];
assertEquals(4, ia.length);
iaa = new int[4][3];
assertEquals(4, iaa.length);
assertEquals(3, iaa[2].length);
iaaa = new int[4][3][];
assertEquals(4, iaaa.length);
assertEquals(3, iaaa[2].length);
assertNull(iaaa[2][2]);
}
private void testArrayInitializer() {
// ArrayInitializer
ia = new int[] {i, j};
assertEquals(2, ia.length);
assertEquals(j, ia[1]);
iaa = new int[][] {{i, j}};
assertEquals(1, iaa.length);
assertEquals(2, iaa[0].length);
assertEquals(j, iaa[0][1]);
iaa = new int[][] { {i, j}, ia};
assertEquals(2, iaa.length);
assertEquals(2, iaa[0].length);
assertEquals(j, iaa[0][1]);
assertEquals(ia, iaa[1]);
}
private void testArrayReference() {
ia = new int[] {i, j};
// ArrayReference
i = ia[0];
assertEquals(ia[0], i);
ia[0] = i;
}
private void testAssertStatement() {
// AssertStatement
if (!CoverageTest.class.desiredAssertionStatus()) {
return;
}
i = 1;
try {
assert i == 2;
throw new Error();
} catch (AssertionError e) {
}
try {
assert i == 3 : true;
fail();
} catch (AssertionError e) {
assertEquals("true", e.getMessage());
}
try {
assert i == 3 : 'c';
fail();
} catch (AssertionError e) {
assertEquals("c", e.getMessage());
}
try {
assert i == 3 : 1.1;
fail();
} catch (AssertionError e) {
assertEquals("1.1", e.getMessage());
}
try {
assert i == 3 : 1.5f;
fail();
} catch (AssertionError e) {
assertEquals("1.5", e.getMessage());
}
try {
assert i == 3 : 5;
fail();
} catch (AssertionError e) {
assertEquals("5", e.getMessage());
}
try {
assert i == 3 : 6L;
fail();
} catch (AssertionError e) {
assertEquals("6", e.getMessage());
}
try {
assert i == 3 : "foo";
fail();
} catch (AssertionError e) {
assertEquals("foo", e.getMessage());
}
try {
assert i == 3 : new Object() {
@Override
public String toString() {
return "bar";
}
};
fail();
} catch (AssertionError e) {
assertEquals("bar", e.getMessage());
}
}
private void testAssignment() {
// Assignment
i = j;
assertEquals(j, i);
}
private void testBinaryExpression() {
// BinaryExpression
i = 4;
i = i + j;
assertEquals(6, i);
i = i - j;
assertEquals(4, i);
i = i * j;
assertEquals(8, i);
i = i / j;
assertEquals(4, i);
i = i % j;
assertEquals(0, i);
i = 7;
i = i & j;
assertEquals(2, i);
i = 0;
i = i | j;
assertEquals(2, i);
i = 7;
i = i ^ j;
assertEquals(5, i);
i = i << j;
assertEquals(20, i);
i = i >> j;
assertEquals(5, i);
i = i >>> j;
assertEquals(1, i);
}
private void testBreakContinueLabelStatement() {
// BreakStatement, ContinueStatement
z = true;
i = 0;
x = 0;
outer : while (z) {
++x;
inner : while (z) {
++i;
if (i == 1) {
continue;
}
if (i == 2) {
continue inner;
}
if (i == 3) {
continue outer;
}
if (i == 4) {
break;
}
if (i == 5) {
break inner;
}
if (i == 6) {
break outer;
}
}
}
assertEquals(6, i);
assertEquals(4, x);
}
private void testCaseSwitchStatement() {
// CaseStatement, SwitchStatement
i = 6;
switch (j) {
case 1:
++i;
// fallthrough
case 2:
i += 2;
// fallthrough
case 3:
i += 3;
// fallthrough
case 4:
i += 4;
// fallthrough
default:
i += 0;
}
assertEquals(15, i);
}
@SuppressWarnings("cast")
private void testCastExpression() {
// CastExpression
o = (Super) o;
}
private void testCharLiteral() {
// CharLiteral
i = 'c';
assertEquals("c", String.valueOf((char) i));
}
private void testClassLiteralAccess() {
// ClassLiteralAccess
o = Super.class;
String str = o.toString();
// Class metadata could be disabled
if (!str.startsWith("class Class$")) {
assertEquals("class com.google.gwt.dev.jjs.test.CoverageTest$Super",
str);
}
}
private void testCompoundAssignment() {
// CompoundAssignment
i = 4;
i += j;
assertEquals(6, i);
i -= j;
assertEquals(4, i);
i *= j;
assertEquals(8, i);
i /= j;
assertEquals(4, i);
i %= j;
assertEquals(0, i);
i = 7;
i &= j;
assertEquals(2, i);
i = 0;
i |= j;
assertEquals(2, i);
i = 7;
i ^= j;
assertEquals(5, i);
i <<= j;
assertEquals(20, i);
i >>= j;
assertEquals(5, i);
i >>>= j;
assertEquals(1, i);
}
private void testConditionalExpression() {
// ConditionalExpression
z = false;
i = z ? 7 : j;
assertEquals(j, i);
}
private void testDoStatement() {
// DoStatement
i = 3;
z = false;
do {
i += j;
} while (z);
assertEquals(5, i);
}
private void testEmptyStatement() {
// EmptyStatement
;
}
private void testEqualExpression() {
// EqualExpression
i = 3;
assertFalse(i == j);
assertTrue(i != j);
assertFalse(i < j);
assertFalse(i <= j);
assertTrue(i > j);
assertTrue(i >= j);
}
private void testForeachStatement() {
ia = new int[] {i, j};
// Array of primitive.
for (int q : ia) {
i = q;
}
// Array of primitive with unboxing.
for (Integer q : ia) {
i = q;
}
// Array of object.
for (String str : sa) {
s = str;
}
// Iterable.
for (Object obj : Arrays.asList(new Object(), new Object())) {
o = obj;
}
// Iterable with unboxing.
for (int q : Arrays.asList(1, 2, 3)) {
i = q;
}
// Iterable with generic cast.
for (String str : Arrays.asList(sa)) {
s = str;
}
// Iterable with array element.
for (String[] stra : Arrays.asList(sa, sa, sa)) {
s = sa[0];
}
// Iterable Iterator subclass.
class SubIterator<T> implements Iterator<T> {
private final Iterator<T> it;
public SubIterator(Iterator<T> it) {
this.it = it;
}
@Override
public boolean hasNext() {
return it.hasNext();
}
@Override
public T next() {
return it.next();
}
@Override
public void remove() {
it.remove();
}
}
class SubIterableString implements Iterable<String> {
@Override
public SubIterator<String> iterator() {
return new SubIterator<String>(Arrays.asList(sa).iterator());
}
}
for (String str : new SubIterableString()) {
s = str;
}
}
private void testForStatement() {
// ForStatement
i = 0;
for (int q = 0, v = 4; q < v; ++q) {
i += q;
}
assertEquals(6, i);
for (i = 0; i < 4; ++i) {
}
assertEquals(4, i);
}
private void testIfStatement() {
// IfStatement
z = false;
if (z) {
fail();
}
if (z) {
fail();
} else {
assertFalse(z);
}
if (!z) {
assertFalse(z);
} else {
fail();
}
}
private void testInstanceOfExpression() {
// InstanceOfExpression
Object o = CoverageTest.this;
assertTrue(o instanceof CoverageBase);
}
private void testLiterals() {
// DoubleLiteral
d = 3.141592653589793;
assertEquals(3, (int) d);
// FalseLiteral
assertFalse(false);
// FloatLiteral
f = 3.1415927f;
assertEquals(3, (int) f);
// IntLiteral
i = 4;
// IntLiteralMinValue
i = -2147483648;
// LongLiteral
l = 4L;
// LongLiteralMinValue
l = -9223372036854775808L;
// NullLiteral
o = null;
// StringLiteral
s = "f'oo\b\t\n\f\r\"\\";
assertEquals("f" + '\'' + 'o' + 'o' + '\b' + '\t' + '\n' + '\f' + '\r' + '"' + '\\', s);
// TrueLiteral
assertTrue(true);
}
private void testOrOrExpression() {
// OR_OR_Expression
i = 1;
assertTrue(i == 1 || betterNotEval());
}
private void testPostfixExpression() {
// PostfixExpression
i = 1;
assertEquals(1, i++);
assertEquals(2, i--);
}
private void testPrefixExpression() {
// PrefixExpression
i = 1;
assertEquals(2, ++i);
assertEquals(1, --i);
}
private void testQualifiedAllocationExpression() {
// QualifiedAllocationExpression
o = new Inner();
o = CoverageTest.this.new Inner();
o = new CoverageTest().new Inner();
}
private void testQualifiedNameReference() {
// QualifiedNameReference
CoverageTest m = new CoverageTest();
ia = new int[2];
assertEquals("1", 2, ia.length);
assertEquals("2", 2, m.j);
assertEquals("3", 4, m.y);
assertEquals("4", 2, new CoverageTest().j);
assertEquals("5", 4, new CoverageTest().y);
assertEquals("6", 2, m.next.j);
assertEquals("7", 4, m.next.y);
assertEquals("8", 2, new CoverageTest().next.j);
assertEquals("9", 4, new CoverageTest().next.y);
assertEquals("A", 2, m.getNext().j);
assertEquals("B", 4, m.getNext().y);
assertEquals("C", 2, new CoverageTest().getNext().j);
assertEquals("D", 4, new CoverageTest().getNext().y);
}
private void testReferenceCalls() {
// MessageSend, QualifiedSuperReference, QualifiedThisReference,
// SuperReference, ThisReference
Inner other = new Inner();
foo();
this.foo();
other.foo();
CoverageTest.this.foo();
super.foo();
Inner.super.foo();
CoverageTest.super.foo();
sfoo();
this.sfoo();
CoverageTest.sfoo();
Inner.sfoo();
Super.sfoo();
other.sfoo();
CoverageTest.this.sfoo();
super.sfoo();
Inner.super.sfoo();
CoverageTest.super.sfoo();
}
private Inner testReferences() {
// FieldReference, QualifiedSuperReference, QualifiedThisReference,
// SuperReference, ThisReference
Inner other = new Inner();
i = 3;
i = i + j + x + y;
assertEquals(12, i);
i = this.i + this.j + this.x + this.y;
assertEquals(21, i);
i = CoverageTest.i + CoverageTest.j;
assertEquals(8, i);
i = Inner.i + Inner.j;
assertEquals(10, i);
i = Super.i + Super.j;
assertEquals(12, i);
i = other.i + other.j + other.x + other.y;
assertEquals(21, i);
i = Inner.this.i + Inner.this.j + Inner.this.x + Inner.this.y;
assertEquals(30, i);
i = CoverageTest.this.i + CoverageTest.this.j + CoverageTest.this.x
+ CoverageTest.this.y;
assertEquals(15, i);
i = super.i + super.j + super.x + super.y;
assertEquals(25, i);
i = Inner.super.i + Inner.super.j + Inner.super.x + Inner.super.y;
assertEquals(35, i);
i = CoverageTest.super.i + CoverageTest.super.j + CoverageTest.super.x
+ CoverageTest.super.y;
assertEquals(10, i);
return other;
}
private void testReturnStatement() {
// ReturnStatement
assertEquals("foo", doReturnFoo());
if (true) {
return;
}
fail();
}
private void testSynchronizedStatement() {
// SynchronizedStatement
synchronized (inner) {
inner.i = i;
}
}
private void testTryCatchFinallyThrowStatement() {
// ThrowStatement, TryStatement
try {
i = 3;
if (true) {
throw new Exception();
}
fail();
} catch (Exception e) {
} finally {
i = 7;
}
assertEquals(7, i);
try {
try {
i = 3;
} catch (Throwable t) {
fail();
}
} catch (Throwable t) {
fail();
} finally {
i = 7;
}
assertEquals(7, i);
}
private void testUnaryExpression() {
// UnaryExpression
i = 4;
assertEquals(-4, -i);
assertEquals(-5, ~i);
z = true;
assertFalse(!z);
}
private void testWhileStatement() {
// WhileStatement
z = false;
while (z) {
fail();
}
}
}
/**
* TODO: document me.
*/
public static class Super {
public static int i = 2;
public static final int j = 2;
// Initializer
static {
Super.i = 1;
}
// Initializer
static {
Super.i = 3;
}
protected static void sfoo() {
}
public int x = 2;
public final int y = 4;
// Initializer
{
x = 1;
}
// Initializer
{
x = 3;
}
public Super() {
}
public Super(int i) {
x = i;
}
public void foo() {
}
@Override
public String toString() {
return String.valueOf(x);
}
}
private static class InnerSub extends Inner {
private class InnerSubSub extends InnerSub {
{
asdfasdfasdf = InnerSub.this.asdfasdfasdf;
InnerSub.this.asdfasdfasdf = asdfasdfasdf;
asdfasdfasdf = super.asdfasdfasdf;
super.asdfasdfasdf = asdfasdfasdf;
}
void fda() {
asdfasdfasdf = InnerSub.this.asdfasdfasdf;
InnerSub.this.asdfasdfasdf = asdfasdfasdf;
asdfasdfasdf = super.asdfasdfasdf;
super.asdfasdfasdf = asdfasdfasdf;
}
}
private int asdfasdfasdf = 3;
InnerSub() {
new CoverageTest().super();
}
}
private static class SecondMain {
private class FunkyInner extends Inner {
FunkyInner() {
new CoverageTest().super();
}
}
}
public static double d;
public static float f;
public static int i = 1 + 2 + 3;
public static int[] ia;
public static int[][] iaa;
public static int[][][] iaaa;
public static final int j = 2;
public static long l;
public static Object o;
public static String s = "foo";
public static String[] sa = new String[]{"foo", "bar", "bar"};
public static CoverageTest singleton;
public static boolean z;
public static boolean betterNotEval() {
fail();
return false;
}
@Override
public void gwtSetUp() throws Exception {
super.gwtSetUp();
x = 3;
d = 0;
f = 0;
i = 1 + 2 + 3;
ia = null;
iaa = null;
iaaa = null;
l = 0;
o = null;
s = "foo";
sa = new String[]{"foo", "bar", "bar"};
z = false;
}
protected static void sfoo() {
}
private static String doReturnFoo() {
if (true) {
return "foo";
}
fail();
return "bar";
}
public final Inner inner = new Inner();
public CoverageTest next;
public int x = 3;
public final int y = 4;
public CoverageTest() {
if (singleton == null) {
singleton = this;
}
next = this;
}
@Override
public void foo() {
}
@Override
public String getModuleName() {
return "com.google.gwt.dev.jjs.CompilerSuite";
}
public CoverageTest getNext() {
return next;
}
public void testAllocationExpression() {
inner.testAllocationExpression();
}
public void testAndAndExpression() {
inner.testAndAndExpression();
}
public void testArrayAllocationExpression() {
inner.testArrayAllocationExpression();
}
public void testArrayInitializer() {
inner.testArrayInitializer();
}
public void testArrayReference() {
inner.testArrayReference();
}
public void testAssertStatement() {
inner.testAssertStatement();
}
public void testAssignment() {
inner.testAssignment();
}
public void testBinaryExpression() {
inner.testBinaryExpression();
}
public void testBreakContinueLabelStatement() {
inner.testBreakContinueLabelStatement();
}
public void testCaseSwitchStatement() {
inner.testCaseSwitchStatement();
}
public void testCastExpression() {
inner.testCastExpression();
}
public void testCharLiteral() {
inner.testCharLiteral();
}
public void testClassLiteralAccess() {
inner.testClassLiteralAccess();
}
public void testCompoundAssignment() {
inner.testCompoundAssignment();
}
public void testConditionalExpression() {
inner.testConditionalExpression();
}
public void testDoStatement() {
inner.testDoStatement();
}
public void testEmptyStatement() {
inner.testEmptyStatement();
}
public void testEqualExpression() {
inner.testEqualExpression();
}
public void testForeachStatement() {
inner.testForeachStatement();
}
public void testForStatement() {
inner.testForStatement();
}
public void testIfStatement() {
inner.testIfStatement();
}
public void testInstanceOfExpression() {
inner.testInstanceOfExpression();
}
public void testLiterals() {
inner.testLiterals();
}
public void testOrOrExpression() {
inner.testOrOrExpression();
}
public void testPostfixExpression() {
inner.testPostfixExpression();
}
public void testPrefixExpression() {
inner.testPrefixExpression();
}
public void testQualifiedAllocationExpression() {
inner.testQualifiedAllocationExpression();
}
public void testQualifiedNameReference() {
inner.testQualifiedNameReference();
}
public void testReferenceCalls() {
inner.testReferenceCalls();
}
public void testReferences() {
inner.testReferences();
}
public void testReturnStatement() {
inner.testReturnStatement();
}
public void testSynchronizedStatement() {
inner.testSynchronizedStatement();
}
public void testTryCatchFinallyThrowStatement() {
inner.testTryCatchFinallyThrowStatement();
}
public void testUnaryExpression() {
inner.testUnaryExpression();
}
public void testWhileStatement() {
inner.testWhileStatement();
}
}
abstract class CoverageBase extends GWTTestCase {
public static int i = 1;
public static final int j = 2;
protected static void sfoo() {
}
public int x = 3;
public final int y = 4;
public void foo() {
}
}