jaroslav@355: /** jaroslav@355: * Back 2 Browser Bytecode Translator jaroslav@1787: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@355: * jaroslav@355: * This program is free software: you can redistribute it and/or modify jaroslav@355: * it under the terms of the GNU General Public License as published by jaroslav@355: * the Free Software Foundation, version 2 of the License. jaroslav@355: * jaroslav@355: * This program is distributed in the hope that it will be useful, jaroslav@355: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@355: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@355: * GNU General Public License for more details. jaroslav@355: * jaroslav@355: * You should have received a copy of the GNU General Public License jaroslav@355: * along with this program. Look for COPYING file in the top folder. jaroslav@355: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@355: */ jaroslav@355: package org.apidesign.bck2brwsr.tck; jaroslav@355: jaroslav@1985: import java.io.Serializable; jaroslav@1985: import java.lang.ClassValue; jaroslav@355: import org.apidesign.bck2brwsr.vmtest.Compare; jaroslav@355: import org.apidesign.bck2brwsr.vmtest.VMTest; jaroslav@355: import org.testng.annotations.Factory; jaroslav@355: jaroslav@355: /** jaroslav@355: * jaroslav@355: * @author Jaroslav Tulach jaroslav@355: */ jaroslav@1982: public class ReflectionClassValueTest { jaroslav@1982: private static final class StringValue extends ClassValue { jaroslav@1982: private final boolean upper; jaroslav@1982: jaroslav@1982: public StringValue(boolean upper) { jaroslav@1982: this.upper = upper; jaroslav@1982: } jaroslav@1982: jaroslav@1982: @Override jaroslav@1982: protected String computeValue(Class type) { jaroslav@1982: final String str = new String(type.toString()); jaroslav@1982: return upper ? str.toUpperCase() : str.toLowerCase(); jaroslav@1982: } jaroslav@1982: } jaroslav@1982: private static final StringValue UPPER = new StringValue(true); jaroslav@1982: private static final StringValue LOWER = new StringValue(false); jaroslav@1982: jaroslav@1982: @Compare public String upperRunnable() { jaroslav@1982: return UPPER.get(Runnable.class); jaroslav@1982: } jaroslav@1982: jaroslav@1982: @Compare public String lowerRunnable() { jaroslav@1982: return LOWER.get(Runnable.class); jaroslav@412: } jaroslav@412: jaroslav@1982: @Compare public boolean valueIsCached() { jaroslav@1982: String one = LOWER.get(Runnable.class); jaroslav@1982: String two = LOWER.get(Runnable.class); jaroslav@1982: return one == two; jaroslav@355: } jaroslav@355: jaroslav@1982: @Compare public String upperObject() { jaroslav@1982: return UPPER.get(Object.class); jaroslav@649: } jaroslav@649: jaroslav@1982: @Compare public String lowerObject() { jaroslav@1982: return LOWER.get(Object.class); jaroslav@886: } jaroslav@886: jaroslav@1982: @Compare public String upperLowerString() { jaroslav@1982: return UPPER.get(String.class) + LOWER.get(String.class); jaroslav@886: } jaroslav@886: jaroslav@1982: @Compare public String lowerUpperSeq() { jaroslav@1982: return LOWER.get(CharSequence.class) + UPPER.get(CharSequence.class); jaroslav@886: } jaroslav@886: jaroslav@1985: private static final class CountingNull extends ClassValue { jaroslav@1985: int cnt; jaroslav@1985: jaroslav@1985: @Override jaroslav@1985: protected Object computeValue(Class type) { jaroslav@1985: cnt++; jaroslav@1985: return null; jaroslav@1985: } jaroslav@1985: } jaroslav@1985: jaroslav@1985: @Compare public int getNullThreeTimes() { jaroslav@1985: CountingNull counter = new CountingNull(); jaroslav@1985: Object o1 = counter.get(Serializable.class); jaroslav@1985: Object o2 = counter.get(Serializable.class); jaroslav@1985: Object o3 = counter.get(Serializable.class); jaroslav@1985: assert o1 == null; jaroslav@1985: assert o2 == null; jaroslav@1985: assert o3 == null; jaroslav@1985: return counter.cnt; jaroslav@1985: } jaroslav@1985: jaroslav@1985: private static final class NewObj extends ClassValue { jaroslav@1985: int cnt; jaroslav@1985: jaroslav@1985: @Override jaroslav@1985: protected Integer computeValue(Class type) { jaroslav@1985: cnt++; jaroslav@1985: return new Integer(cnt); jaroslav@1985: } jaroslav@1985: } jaroslav@1985: jaroslav@1985: @Compare public boolean valueCanBeCleared() { jaroslav@1985: NewObj cache = new NewObj(); jaroslav@1985: Integer one = cache.get(Runnable.class); jaroslav@1985: Integer two = cache.get(Runnable.class); jaroslav@1985: assert one == two; jaroslav@1985: cache.remove(Runnable.class); jaroslav@1985: Integer three = cache.get(Runnable.class); jaroslav@1985: return one != three; jaroslav@1985: } jaroslav@1985: jaroslav@355: @Factory jaroslav@355: public static Object[] create() { jaroslav@1982: return VMTest.create(ReflectionClassValueTest.class); jaroslav@1838: } jaroslav@355: }