blob: 26f4441d2726f8fe41b1044dc718f627dc7db3ab [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.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
/**
* Test comparison of various types of objects under various circumstances. Its
* main purpose is to ensure that identity comparisons work properly whether
* object values are null, non-null, or undefined (which is now being treated as
* equivalent to null); and also ensure no String equality comparisons occur.
*/
public class ObjectIdentityTest extends GWTTestCase {
/**
* An object that toString()s to a given value, used to ensure String equality
* is never used inappropriately.
*/
private static class Foo {
private String s;
public Foo(String s) {
this.s = s;
}
@Override
public String toString() {
return s;
}
}
private static volatile boolean TRUE = true;
/*
* Using volatile to ensure that the compiler is unsure about null-ness.
*/
private volatile String maybeNullStringIsNull = null;
private volatile Object maybeNullObjectIsNull = null;
private volatile Foo maybeNullFooIsNull = null;
private Object maybeNullTightenStringIsNull = maybeNullStringIsNull;
private Object maybeNullTightenFooIsNull = maybeNullFooIsNull;
private volatile String maybeNullStringIsUndefined = undefinedString();
private volatile Object maybeNullObjectIsUndefined = undefinedObject();
private volatile Foo maybeNullFooIsUndefined = undefinedFoo();
private Object maybeNullTightenStringIsUndefined = maybeNullStringIsUndefined;
private Object maybeNullTightenFooIsUndefined = maybeNullFooIsUndefined;
private String notNullString = "foo";
private String notNullStringOther = "bar";
private Object notNullObject = TRUE ? new Foo(notNullString) : new Object();
private Object notNullObjectOther = TRUE ? new Foo(notNullStringOther)
: new Object();
private Foo notNullFoo = new Foo(notNullString);
private Foo notNullFooOther = new Foo(notNullStringOther);
private Object notNullTightenString = notNullString;
private Object notNullTightenFoo = notNullFoo;
private volatile String maybeNullString = notNullString;
private volatile String maybeNullStringOther = notNullStringOther;
private volatile Object maybeNullObject = notNullObject;
private volatile Object maybeNullObjectOther = notNullObjectOther;
private volatile Foo maybeNullFoo = notNullFoo;
private volatile Foo maybeNullFooOther = notNullFooOther;
private Object maybeNullTightenString = maybeNullString;
private Object maybeNullTightenFoo = maybeNullFoo;
@Override
public String getModuleName() {
return "com.google.gwt.dev.jjs.CompilerSuite";
}
public void test_MaybeNullFoo_MaybeNullFoo() {
assertTrue(maybeNullFoo == maybeNullFoo);
assertTrue(maybeNullFoo != maybeNullFooOther);
assertTrue(maybeNullFooIsNull != maybeNullFoo);
assertTrue(maybeNullFooIsUndefined != maybeNullFoo);
assertTrue(maybeNullFooIsNull == maybeNullFooIsUndefined);
assertTrue(maybeNullFooIsUndefined == maybeNullFooIsNull);
}
public void test_MaybeNullFoo_MaybeNullObject() {
assertTrue(maybeNullFoo != maybeNullObject);
assertTrue(maybeNullFooIsNull != maybeNullObject);
assertTrue(maybeNullFooIsUndefined != maybeNullObject);
assertTrue(maybeNullFooIsNull == maybeNullObjectIsNull);
assertTrue(maybeNullFooIsNull == maybeNullObjectIsUndefined);
assertTrue(maybeNullFooIsUndefined == maybeNullObjectIsNull);
assertTrue(maybeNullFooIsUndefined == maybeNullObjectIsUndefined);
}
public void test_MaybeNullFoo_MaybeNullString() {
assertTrue(maybeNullFoo != maybeNullTightenString);
assertTrue(maybeNullFooIsNull != maybeNullTightenString);
assertTrue(maybeNullFooIsUndefined != maybeNullTightenString);
assertTrue(maybeNullFooIsNull == maybeNullTightenStringIsNull);
assertTrue(maybeNullFooIsNull == maybeNullTightenStringIsUndefined);
assertTrue(maybeNullFooIsUndefined == maybeNullTightenStringIsNull);
assertTrue(maybeNullFooIsUndefined == maybeNullTightenStringIsUndefined);
}
public void test_MaybeNullFoo_NotNullFoo() {
assertTrue(maybeNullFoo == notNullFoo);
assertTrue(maybeNullFoo != notNullFooOther);
assertTrue(maybeNullFooIsNull != notNullFoo);
assertTrue(maybeNullFooIsUndefined != notNullFoo);
}
public void test_MaybeNullFoo_NotNullObject() {
assertTrue(maybeNullFoo != notNullObject);
assertTrue(maybeNullFooIsNull != notNullObject);
assertTrue(maybeNullFooIsUndefined != notNullObject);
}
public void test_MaybeNullFoo_NotNullString() {
assertTrue(maybeNullFoo != notNullTightenString);
assertTrue(maybeNullFooIsNull != notNullTightenString);
assertTrue(maybeNullFooIsUndefined != notNullTightenString);
}
public void test_MaybeNullFoo_null() {
assertTrue(maybeNullFoo != null);
assertTrue(maybeNullFooIsNull == null);
assertTrue(maybeNullFooIsUndefined == null);
}
public void test_MaybeNullObject_MaybeNullFoo() {
assertTrue(maybeNullObject != maybeNullFoo);
assertTrue(maybeNullObjectIsNull != maybeNullFoo);
assertTrue(maybeNullObjectIsUndefined != maybeNullFoo);
assertTrue(maybeNullObjectIsNull == maybeNullFooIsNull);
assertTrue(maybeNullObjectIsNull == maybeNullFooIsUndefined);
assertTrue(maybeNullObjectIsUndefined == maybeNullFooIsNull);
assertTrue(maybeNullObjectIsUndefined == maybeNullFooIsUndefined);
}
public void test_MaybeNullObject_MaybeNullObject() {
assertTrue(maybeNullObject == maybeNullObject);
assertTrue(maybeNullObject != maybeNullObjectOther);
assertTrue(maybeNullObjectIsNull != maybeNullObject);
assertTrue(maybeNullObjectIsUndefined != maybeNullObject);
assertTrue(maybeNullObjectIsNull == maybeNullObjectIsUndefined);
assertTrue(maybeNullObjectIsUndefined == maybeNullObjectIsNull);
}
public void test_MaybeNullObject_MaybeNullString() {
assertTrue(maybeNullObject != maybeNullString);
assertTrue(maybeNullObjectIsNull != maybeNullString);
assertTrue(maybeNullObjectIsUndefined != maybeNullString);
assertTrue(maybeNullObjectIsNull == maybeNullStringIsNull);
assertTrue(maybeNullObjectIsNull == maybeNullStringIsUndefined);
assertTrue(maybeNullObjectIsUndefined == maybeNullStringIsNull);
assertTrue(maybeNullObjectIsUndefined == maybeNullStringIsUndefined);
}
public void test_MaybeNullObject_NotNullFoo() {
assertTrue(maybeNullObject != notNullFoo);
assertTrue(maybeNullObjectIsNull != notNullFoo);
assertTrue(maybeNullObjectIsUndefined != notNullFoo);
}
public void test_MaybeNullObject_NotNullObject() {
assertTrue(maybeNullObject == notNullObject);
assertTrue(maybeNullObjectIsNull != notNullObject);
assertTrue(maybeNullObjectIsUndefined != notNullObject);
}
public void test_MaybeNullObject_NotNullString() {
assertTrue(maybeNullObject != notNullString);
assertTrue(maybeNullObjectIsNull != notNullString);
assertTrue(maybeNullObjectIsUndefined != notNullString);
}
public void test_MaybeNullObject_null() {
assertTrue(maybeNullObject != null);
assertTrue(maybeNullObjectIsNull == null);
assertTrue(maybeNullObjectIsUndefined == null);
}
public void test_MaybeNullString_MaybeNullFoo() {
assertTrue(maybeNullString != maybeNullTightenFoo);
assertTrue(maybeNullStringIsNull != maybeNullTightenFoo);
assertTrue(maybeNullStringIsUndefined != maybeNullTightenFoo);
assertTrue(maybeNullStringIsNull == maybeNullTightenFooIsNull);
assertTrue(maybeNullStringIsNull == maybeNullTightenFooIsUndefined);
assertTrue(maybeNullStringIsUndefined == maybeNullTightenFooIsNull);
assertTrue(maybeNullStringIsUndefined == maybeNullTightenFooIsUndefined);
}
public void test_MaybeNullString_MaybeNullObject() {
assertTrue(maybeNullString != maybeNullObject);
assertTrue(maybeNullStringIsNull != maybeNullObject);
assertTrue(maybeNullStringIsUndefined != maybeNullObject);
assertTrue(maybeNullStringIsUndefined == maybeNullObjectIsNull);
assertTrue(maybeNullStringIsUndefined == maybeNullObjectIsUndefined);
assertTrue(maybeNullStringIsUndefined == maybeNullObjectIsNull);
assertTrue(maybeNullStringIsUndefined == maybeNullObjectIsUndefined);
}
public void test_MaybeNullString_MaybeNullString() {
assertTrue(maybeNullString == maybeNullString);
assertTrue(maybeNullString != maybeNullStringOther);
assertTrue(maybeNullStringIsNull != maybeNullString);
assertTrue(maybeNullStringIsUndefined != maybeNullString);
assertTrue(maybeNullStringIsNull == maybeNullStringIsNull);
assertTrue(maybeNullStringIsNull == maybeNullStringIsUndefined);
assertTrue(maybeNullStringIsUndefined == maybeNullStringIsNull);
assertTrue(maybeNullStringIsUndefined == maybeNullStringIsUndefined);
}
public void test_MaybeNullString_NotNullFoo() {
assertTrue(maybeNullString != notNullTightenFoo);
assertTrue(maybeNullStringIsNull != notNullTightenFoo);
assertTrue(maybeNullStringIsUndefined != notNullTightenFoo);
}
public void test_MaybeNullString_NotNullObject() {
assertTrue(maybeNullString != notNullObject);
assertTrue(maybeNullStringIsNull != notNullObject);
assertTrue(maybeNullStringIsUndefined != notNullObject);
}
public void test_MaybeNullString_NotNullString() {
assertTrue(maybeNullString == notNullString);
assertTrue(maybeNullStringIsNull != notNullString);
assertTrue(maybeNullStringIsUndefined != notNullString);
}
public void test_MaybeNullString_null() {
assertTrue(maybeNullString != null);
assertTrue(maybeNullStringIsNull == null);
assertTrue(maybeNullStringIsUndefined == null);
}
public void test_NotNullFoo_NotNullFoo() {
assertTrue(notNullFoo == notNullFoo);
assertTrue(notNullFoo != notNullFooOther);
}
public void test_NotNullFoo_NotNullObject() {
assertTrue(notNullFoo != notNullObject);
}
public void test_NotNullFoo_NotNullString() {
assertTrue(notNullFoo != notNullTightenString);
}
public void test_NotNullFoo_null() {
assertTrue(notNullFoo != null);
}
public void test_NotNullObject_NotNullFoo() {
assertTrue(notNullObject != notNullFoo);
}
public void test_NotNullObject_NotNullObject() {
assertTrue(notNullObject == notNullObject);
assertTrue(notNullObject != notNullObjectOther);
}
public void test_NotNullObject_NotNullString() {
assertTrue(notNullObject != notNullString);
}
public void test_NotNullObject_null() {
assertTrue(notNullObject != null);
}
public void test_NotNullString_NotNullFoo() {
assertTrue(notNullString != notNullTightenFoo);
}
public void test_NotNullString_NotNullObject() {
assertTrue(notNullString != notNullObject);
}
public void test_NotNullString_NotNullString() {
assertTrue(notNullString == notNullString);
assertTrue(notNullString != notNullStringOther);
}
public void test_NotNullString_null() {
assertTrue(notNullString != null);
}
public void test_null_MaybeNullFoo() {
assertTrue(null != maybeNullFoo);
assertTrue(null == maybeNullFooIsNull);
assertTrue(null == maybeNullFooIsUndefined);
}
public void test_null_MaybeNullObject() {
assertTrue(null != maybeNullObject);
assertTrue(null == maybeNullObjectIsNull);
assertTrue(null == maybeNullObjectIsUndefined);
}
public void test_null_MaybeNullString() {
assertTrue(null != maybeNullString);
assertTrue(null == maybeNullStringIsNull);
assertTrue(null == maybeNullStringIsUndefined);
}
public void test_null_NotNullFoo() {
assertTrue(null != notNullFoo);
}
public void test_null_NotNullObject() {
assertTrue(null != notNullObject);
}
public void test_null_NotNullString() {
assertTrue(null != notNullString);
}
public void test_null_null() {
assertTrue(null == null);
}
private Foo undefinedFoo() {
return GWT.isClient() ? undefinedFoo0() : null;
}
private Object undefinedObject() {
return GWT.isClient() ? undefinedObject0() : null;
}
private String undefinedString() {
return GWT.isClient() ? undefinedString0() : null;
}
private native Foo undefinedFoo0() /*-{
}-*/;
private native Object undefinedObject0() /*-{
}-*/;
private native String undefinedString0() /*-{
}-*/;
}