03597d010c
Reviewed-by: mcimadamore
280 lines
7.8 KiB
Java
280 lines
7.8 KiB
Java
/*
|
|
* @test /nodynamiccopyright/
|
|
* @bug 6827009 8078561
|
|
* @summary Positive tests for strings in switch with few alternatives.
|
|
* @compile OneCaseSwitches.java
|
|
* @run main OneCaseSwitches
|
|
* @author Joseph D. Darcy
|
|
*/
|
|
|
|
import java.lang.reflect.*;
|
|
import java.lang.annotation.*;
|
|
import java.util.*;
|
|
import static java.lang.annotation.RetentionPolicy.*;
|
|
|
|
public class OneCaseSwitches {
|
|
@Retention(RUNTIME)
|
|
@interface TestMeForNull {}
|
|
|
|
@TestMeForNull
|
|
public static int zeroCasesNoDefault(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 0;
|
|
switch(s) {
|
|
}
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int zeroCasesWithDefault(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 2;
|
|
boolean addResult;
|
|
|
|
switch(s) {
|
|
default:
|
|
failures = 0;
|
|
addResult = stringSet.add(s);
|
|
if (addResult != expected) {
|
|
failures++;
|
|
System.err.println("zeroCaseWithDefault: Expectedly got add result of " + addResult +
|
|
" on string " + s);
|
|
}
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int zeroCasesWithDefaultBreak(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 2;
|
|
boolean addResult;
|
|
|
|
switch(s) {
|
|
default:
|
|
failures = zeroCasesWithDefault(s, stringSet, expected);
|
|
break;
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int oneCaseNoDefault(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 2;
|
|
boolean addResult;
|
|
|
|
switch(s) {
|
|
case "foo":
|
|
failures = 0;
|
|
addResult = stringSet.add(s);
|
|
if (addResult != expected) {
|
|
failures++;
|
|
System.err.println("oneCaseNoDefault: Unexpectedly got add result of " + addResult +
|
|
" on string " + s);
|
|
}
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int oneCaseNoDefaultBreak(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 2;
|
|
boolean addResult;
|
|
|
|
switch(s) {
|
|
case "foo":
|
|
failures = oneCaseNoDefaultBreak(s, stringSet, expected);
|
|
break;
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int oneCaseWithDefault(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 2;
|
|
boolean addResult;;
|
|
|
|
switch(s) {
|
|
case "foo":
|
|
failures = 0;
|
|
addResult = stringSet.add(s);
|
|
if (addResult != expected) {
|
|
failures++;
|
|
System.err.println("oneCaseNoDefault: Expectedly got add result of " + addResult +
|
|
" on string " + s);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int oneCaseBreakOnly(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 1;
|
|
switch(s) {
|
|
case "foo":
|
|
break;
|
|
}
|
|
failures = 0;
|
|
return failures;
|
|
}
|
|
|
|
@TestMeForNull
|
|
public static int oneCaseDefaultBreakOnly(String s, Set<String> stringSet, boolean expected) {
|
|
int failures = 1;
|
|
switch(s) {
|
|
default:
|
|
break;
|
|
}
|
|
failures = 0;
|
|
return failures;
|
|
}
|
|
|
|
|
|
static int testNullBehavior() {
|
|
int failures = 0;
|
|
int count = 0;
|
|
|
|
Method[] methods = OneCaseSwitches.class.getDeclaredMethods();
|
|
|
|
try {
|
|
for(Method method : methods) {
|
|
count++;
|
|
try {
|
|
if (method.isAnnotationPresent(TestMeForNull.class)) {
|
|
System.out.println("Testing method " + method);
|
|
method.invoke(null, (String)null, emptyStringSet, false);
|
|
failures++;
|
|
System.err.println("Didn't get NPE as expected from " + method);
|
|
}
|
|
} catch (InvocationTargetException ite) { // Expected
|
|
Throwable targetException = ite.getTargetException();
|
|
if (! (targetException instanceof NullPointerException)) {
|
|
failures++; // Wrong exception thrown
|
|
System.err.println("Didn't get expected target exception NPE, got " +
|
|
ite.getClass().getName());
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
|
|
if (count == 0) {
|
|
failures++;
|
|
System.err.println("Did not find any annotated methods.");
|
|
}
|
|
return failures;
|
|
}
|
|
|
|
static int testZeroCases() {
|
|
int failures = 0;
|
|
Set<String> noDefaultSet = new HashSet<String>();
|
|
Set<String> defaultSet = new HashSet<String>();
|
|
|
|
zeroCasesNoDefault(FOO, noDefaultSet, false);
|
|
for(String word : words) {
|
|
zeroCasesNoDefault(word, noDefaultSet, false);
|
|
}
|
|
|
|
if (!noDefaultSet.isEmpty()) {
|
|
failures++;
|
|
System.err.println("Non-empty set after zeroCasesNoDefault");
|
|
}
|
|
|
|
for(String word : words) {
|
|
zeroCasesWithDefault(word, defaultSet, true);
|
|
}
|
|
if (defaultSet.size() != words.length) {
|
|
failures++;
|
|
System.err.println("Missing strings after zeroCasesWithDefault");
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
static int testOneCaseNoDefault() {
|
|
int failures = 0;
|
|
Set<String> s = new HashSet<String>();
|
|
s.add("foo");
|
|
Set<String> fooSet = Collections.unmodifiableSet(s);
|
|
Set<String> testSet = new HashSet<String>();
|
|
|
|
oneCaseNoDefault(FOO, testSet, true);
|
|
if (!testSet.equals(fooSet)) {
|
|
failures++;
|
|
System.err.println("Unexpected result from oneCaseNoDefault: didn't get {\"Foo\"}");
|
|
}
|
|
|
|
for(String word : words) {
|
|
oneCaseNoDefault(word, testSet, false);
|
|
}
|
|
if (!testSet.equals(fooSet)) {
|
|
failures++;
|
|
System.err.println("Unexpected result from oneCaseNoDefault: didn't get {\"Foo\"}");
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
static int testBreakOnly() {
|
|
int failures = 0;
|
|
|
|
for(String word : words) {
|
|
failures += oneCaseBreakOnly(word, emptyStringSet, true);
|
|
failures += oneCaseDefaultBreakOnly(word, emptyStringSet, true);
|
|
}
|
|
|
|
return failures;
|
|
}
|
|
|
|
static int testExpressionEval() {
|
|
String s = "a";
|
|
int errors = 2;
|
|
|
|
System.out.println("Testing expression evaluation.");
|
|
|
|
switch (s + s) {
|
|
case "aa":
|
|
errors = 0;
|
|
break;
|
|
|
|
case "aaaa":
|
|
errors = 1;
|
|
System.err.println("Suspected bad expression evaluation.");
|
|
break;
|
|
|
|
default:
|
|
throw new RuntimeException("Should not reach here.");
|
|
}
|
|
return errors;
|
|
}
|
|
|
|
static final String FOO = "foo";
|
|
|
|
static final String[] words = {"baz",
|
|
"quux",
|
|
"wombat",
|
|
"\u0ccc\u0012"}; // hash collision with "foo"
|
|
|
|
final static Set<String> emptyStringSet = Collections.emptySet();
|
|
|
|
public static void main(String... args) {
|
|
int failures = 0;
|
|
|
|
failures += testNullBehavior();
|
|
failures += testZeroCases();
|
|
failures += testOneCaseNoDefault();
|
|
failures += testBreakOnly();
|
|
failures += testExpressionEval();
|
|
|
|
if (failures > 0) {
|
|
throw new RuntimeException();
|
|
}
|
|
}
|
|
}
|