/*
* JBoss, Home of Professional Open Source.
*
* Copyright 2012 Red Hat, Inc. and/or its affiliates, and individual
* contributors as indicated by the @author tags.
*
* 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 org.xnio;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.InvalidObjectException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.reflect.Member;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
/**
* Test for {@link Option} and subclasses.
*
* @author <a href="mailto:flavia.rainone@jboss.com">Flavia Rainone</a>
*
*/
public class OptionTestCase {
public static enum Color {WHITE, YELLOW, BLUE, RED, GREEN, BLACK};
// simple options
public static final Option<Boolean> SIMPLE_BOOLEAN_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_BOOLEAN_OPTION", Boolean.class);
public static final Option<Byte> SIMPLE_BYTE_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_BYTE_OPTION", Byte.class);
public static final Option<Character> SIMPLE_CHAR_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_CHAR_OPTION", Character.class);
public static final Option<Short> SIMPLE_SHORT_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_SHORT_OPTION", Short.class);
public static final Option<Integer> SIMPLE_INT_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_INT_OPTION", Integer.class);
public static final Option<Long> SIMPLE_LONG_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_LONG_OPTION", Long.class);
public static final Option<String> SIMPLE_STRING_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_STRING_OPTION", String.class);
public static final Option<Property> SIMPLE_PROPERTY_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_PROPERTY_OPTION", Property.class);
public static final Option<Calendar> SIMPLE_CALENDAR_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_CALENDAR_OPTION", Calendar.class);
public static final Option<Color> SIMPLE_COLOR_OPTION = Option.simple(OptionTestCase.class, "SIMPLE_COLOR_OPTION", Color.class);
// invalid simple options
static final Option<Short> NON_PUBLIC_SIMPLE_OPTION = Option.simple(OptionTestCase.class, "NON_PUBLIC_SIMPLE_OPTION", Short.class);
public Option<Boolean> NON_STATIC_SIMPLE_OPTION = Option.simple(OptionTestCase.class, "NON_STATIC_SIMPLE_OPTION", Boolean.class);
// sequence option
public static final Option<Sequence<String>> STRING_SEQUENCE_OPTION = Option.sequence(OptionTestCase.class, "STRING_SEQUENCE_OPTION", String.class);
// invalid sequence options
private static final Option<Sequence<Integer>> PRIVATE_SEQUENCE_OPTION = Option.sequence(OptionTestCase.class, "PRIVATE_SEQUENCE_OPTION", Integer.class);
public final Option<Sequence<Byte>> NON_STATIC_SEQUENCE_OPTION = Option.sequence(OptionTestCase.class, "NON_STATIC_SE_OPTION", Byte.class);
// type option
@SuppressWarnings("rawtypes")
public static final Option<Class<? extends Collection>> COLLECTION_TYPE_OPTION = Option.type(OptionTestCase.class, "COLLECTION_TYPE_OPTION", Collection.class);
// invalid type options
static final Option<Class<? extends Member>> NON_PUBLIC_TYPE_OPTION = Option.type(OptionTestCase.class, "NON_PUBLIC_TYPE_OPTION", Member.class);
public final Option<Class<? extends OutputStream>> NON_STATIC_TYPE_OPTION = Option.type(OptionTestCase.class, "NON_STATIC_TYPE_OPTION", OutputStream.class);
// type sequence option
public static final Option<Sequence<Class<? extends Writer>>> WRITER_TYPE_SEQUENCE_OPTION = Option.typeSequence(OptionTestCase.class, "WRITER_TYPE_SEQUENCE_OPTION", Writer.class);
// invalid type sequence options
private static final Option<Sequence<Class<? extends Writer>>> PRIVATE_TYPE_SEQUENCE_OPTION = Option.typeSequence(OptionTestCase.class, "PRIVATE_TYPE_SEQUENCE_OPTION", Writer.class);
public final Option<Sequence<Class<? extends Writer>>> NON_STATIC_TYPE_SEQUENCE_OPTION = Option.typeSequence(OptionTestCase.class, "NON_STATIC_TYPE_SEQUENCE_OPTION", Writer.class);
// null option
public static final Option<?> NULL_OPTION = null;
@Test
public void simpleBooleanOption() throws Exception {
final Option<Boolean> option = SIMPLE_BOOLEAN_OPTION;
// test cast
assertSame(Boolean.TRUE, option.cast(true));
assertSame(Boolean.FALSE, option.cast(false));
ClassCastException expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_BOOLEAN_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertSame(Boolean.TRUE, option.parseValue("true", getClass().getClassLoader()));
assertSame(Boolean.FALSE, option.parseValue("false", getClass().getClassLoader()));
assertSame(Boolean.FALSE, option.parseValue("nothing", getClass().getClassLoader()));
// test serialization
Option<Boolean> recoveredOption = this.<Option<Boolean>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleByteOption() throws Exception {
final Option<Byte> option = SIMPLE_BYTE_OPTION;
// test cast
assertEquals(Byte.valueOf((byte) 10), option.cast((byte) 10));
assertEquals(Byte.valueOf((byte) 0), option.cast((byte) 0));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_BYTE_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals(Byte.valueOf((byte) 25), option.parseValue("25", getClass().getClassLoader()));
assertEquals(Byte.valueOf((byte) -15), option.parseValue("-15", getClass().getClassLoader()));
expected = null;
try {
option.parseValue("nothing", getClass().getClassLoader());
} catch (NumberFormatException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<Byte> recoveredOption = this.<Option<Byte>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleCharOption() throws Exception {
final Option<Character> option = SIMPLE_CHAR_OPTION;
// test cast
assertEquals(Character.valueOf('1'), option.cast('1'));
assertEquals(Character.valueOf('a'), option.cast('a'));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_CHAR_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// no parsing of chars for this test
// test serialization
Option<Character> recoveredOption = this.<Option<Character>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleShortOption() throws Exception {
final Option<Short> option = SIMPLE_SHORT_OPTION;
// test cast
assertEquals(Short.valueOf((short) 50), option.cast((short) 50));
assertEquals(Short.valueOf((short) -1), option.cast((short) -1));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_SHORT_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals(Short.valueOf((short) 37), option.parseValue("37", getClass().getClassLoader()));
assertEquals(Short.valueOf((short) 1000), option.parseValue("1000", getClass().getClassLoader()));
expected = null;
try {
option.parseValue("anything", getClass().getClassLoader());
} catch (NumberFormatException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<Short> recoveredOption = this.<Option<Short>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleIntegerOption() throws Exception {
final Option<Integer> option = SIMPLE_INT_OPTION;
// test cast
assertEquals(Integer.valueOf(25987), option.cast(25987));
assertEquals(Integer.valueOf(-10345), option.cast(-10345));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_INT_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals(Integer.valueOf(-10), option.parseValue("-10", getClass().getClassLoader()));
assertEquals(Integer.valueOf(1), option.parseValue("1", getClass().getClassLoader()));
expected = null;
try {
option.parseValue("foo", getClass().getClassLoader());
} catch (NumberFormatException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<Integer> recoveredOption = this.<Option<Integer>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleLongOption() throws Exception {
final Option<Long> option = SIMPLE_LONG_OPTION;
// test cast
assertEquals(Long.valueOf(30l), option.cast(30l));
assertEquals(Long.valueOf(-10345024546l), option.cast(-10345024546l));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_LONG_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals(Long.valueOf(-10), option.parseValue("-10", getClass().getClassLoader()));
assertEquals(Long.valueOf(25987000000l), option.parseValue("25987000000", getClass().getClassLoader()));
expected = null;
try {
option.parseValue("zip", getClass().getClassLoader());
} catch (NumberFormatException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<Long> recoveredOption = this.<Option<Long>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleStringOption() throws Exception {
final Option<String> option = SIMPLE_STRING_OPTION;
// test cast
assertEquals("any text", option.cast("any text"));
assertEquals("do", option.cast("do"));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_STRING_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals("parse this", option.parseValue("parse this", getClass().getClassLoader()));
assertEquals("", option.parseValue("", getClass().getClassLoader()));
// test serialization
Option<String> recoveredOption = this.<Option<String>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simplePropertyOption() throws Exception {
final Option<Property> option = SIMPLE_PROPERTY_OPTION;
// test cast
assertEquals(Property.of("KEY", "value"), option.cast(Property.of("KEY", "value")));
assertEquals(Property.of("key", "VALUE"), option.cast(Property.of("key", "VALUE")));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_PROPERTY_OPTION", option.getName());
// tet hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals(Property.of("1", "1"), option.parseValue("1=1", getClass().getClassLoader()));
assertEquals(Property.of("key", "value"), option.parseValue("key=value", getClass().getClassLoader()));
expected = null;
try {
option.parseValue("-", getClass().getClassLoader());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<Property> recoveredOption = this.<Option<Property>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleObjectOption() throws Exception {
// check how would it be like to create an option of any type that not String, Property, byte, short, etc.
final Option<Calendar> option = SIMPLE_CALENDAR_OPTION;
// test cast
final Calendar calendar1 = Calendar.getInstance(), calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(0);
assertSame(calendar1, option.cast(calendar1));
assertSame(calendar2, option.cast(calendar2));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_CALENDAR_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
expected = null;
try {
option.parseValue(DateFormat.getInstance().format(calendar1.getTime()), getClass().getClassLoader());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<Calendar> recoveredOption = this.<Option<Calendar>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void simpleEnumOption() throws Exception {
final Option<Color> option = SIMPLE_COLOR_OPTION;
// test cast
assertEquals(Color.WHITE, option.cast(Color.WHITE));
assertEquals(Color.BLUE, option.cast(Color.BLUE));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("SIMPLE_COLOR_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertSame(Color.RED, option.parseValue(Color.RED.toString(), getClass().getClassLoader()));
assertSame(Color.GREEN, option.parseValue(Color.GREEN.toString(), getClass().getClassLoader()));
// test serialization
Option<Color> recoveredOption = this.<Option<Color>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void invalidSimpleOption() throws Exception {
Exception expected = null;
try {
Option.simple(OptionTestCase.class, null, String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.simple(null, "name", String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.simple(OptionTestCase.class, "name", null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.simple(OptionTestCase.class, "name", Integer.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(NON_STATIC_SIMPLE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(NON_PUBLIC_SIMPLE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.simple(OptionTestCase.class, "NULL_OPTION", Object.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.simple(OptionTestCase.class, "name", Integer.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
}
@Test
public void sequenceOption() throws Exception {
final Option<Sequence<String>> option = STRING_SEQUENCE_OPTION;
// test cast
final Sequence<String> sequence1 = Sequence.empty();
final Sequence<String> sequence2 = Sequence.of("1", "2");
assertEquals(sequence1, option.cast(sequence1));
assertEquals(sequence1, option.cast(new Object[0]));
assertEquals(sequence1, option.cast(new ArrayList<String>()));
assertEquals(sequence2, option.cast(sequence2));
assertEquals(sequence2, option.cast(new Object[] {"1", "2"}));
final Collection<String> collection2 = new ArrayList<String>();
collection2.add("1");
assertFalse(sequence2.equals(option.cast(collection2)));
collection2.add("2");
assertEquals(sequence2, option.cast(collection2));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("STRING_SEQUENCE_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
expected = null;
assertEquals(sequence1, option.parseValue("", getClass().getClassLoader()));
assertEquals(sequence2, option.parseValue("1,2", getClass().getClassLoader()));
// test serialization
Option<Sequence<String>> recoveredOption = this.<Option<Sequence<String>>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void invalidSequenceOption() throws Exception {
Exception expected = null;
try {
Option.sequence(OptionTestCase.class, null, String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.sequence(null, "name", String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.sequence(OptionTestCase.class, "name", null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.sequence(OptionTestCase.class, "name", Integer.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(NON_STATIC_SEQUENCE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(PRIVATE_SEQUENCE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.sequence(OptionTestCase.class, "NULL_OPTION", Object.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.sequence(OptionTestCase.class, "name", Integer.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
}
@SuppressWarnings("rawtypes")
@Test
public void typeOption() throws Exception {
final Option<Class<? extends Collection>> option = COLLECTION_TYPE_OPTION;
// test cast
assertEquals(List.class, option.cast(List.class));
assertEquals(HashSet.class, option.cast(HashSet.class));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("COLLECTION_TYPE_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
assertEquals(Set.class, option.parseValue(Set.class.getName(), getClass().getClassLoader()));
assertEquals(ArrayList.class, option.parseValue(ArrayList.class.getName(), getClass().getClassLoader()));
expected = null;
try {
option.parseValue(String.class.getName(), getClass().getClassLoader());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
try {
option.parseValue("nonono", getClass().getClassLoader());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<?> recoveredOption = this.<Option<?>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void invalidTypeOption() throws Exception {
Exception expected = null;
try {
Option.type(OptionTestCase.class, null, String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.type(null, "name", String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.type(OptionTestCase.class, "name", null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.type(OptionTestCase.class, "name", Collection.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(NON_STATIC_TYPE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(NON_PUBLIC_TYPE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.type(OptionTestCase.class, "NULL_OPTION", Object.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.type(OptionTestCase.class, "OPTION", Integer.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
}
@SuppressWarnings("unchecked")
@Test
public void typeSequenceOption() throws Exception {
final Option<Sequence<Class<? extends Writer>>> option = WRITER_TYPE_SEQUENCE_OPTION;
// test cast
final List<Class<? extends Writer>> writerList1 = new ArrayList<Class<? extends Writer>>();
writerList1.add(FileWriter.class);
writerList1.add(BufferedWriter.class);
final Sequence<Class<? extends Writer>> sequence1 = Sequence.<Class<? extends Writer>>of(FileWriter.class, BufferedWriter.class);
final Sequence<Class<? extends Writer>> sequence2 = Sequence.empty();
assertEquals(sequence1, option.cast(sequence1));
assertEquals(sequence1, option.cast(new Object[]{FileWriter.class, BufferedWriter.class}));
assertEquals(sequence1, option.cast(writerList1));
assertEquals(sequence2, option.cast(sequence2));
assertEquals(sequence2, option.cast(new Object[0]));
assertEquals(sequence2, option.cast(new ArrayList<Class<? extends Writer>>()));
Exception expected = null;
try {
option.cast(new Object());
} catch (ClassCastException e) {
expected = e;
}
assertNotNull(expected);
// test getName()
assertEquals("WRITER_TYPE_SEQUENCE_OPTION", option.getName());
// test hashCode()
assertEquals(option.hashCode(), option.hashCode());
// test parsing
final Sequence<Class<? extends Writer>> sequence3 = Sequence.<Class<? extends Writer>> of(OutputStreamWriter.class);
assertEquals(sequence3, option.parseValue(OutputStreamWriter.class.getName(), getClass().getClassLoader()));
assertEquals(sequence2, option.parseValue("", getClass().getClassLoader()));
assertEquals(sequence1, option.parseValue(FileWriter.class.getName() + "," + BufferedWriter.class.getName(), getClass().getClassLoader()));
expected = null;
try {
option.parseValue(String.class.getName(), getClass().getClassLoader());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
try {
option.parseValue("nonono", getClass().getClassLoader());
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
// test serialization
Option<?> recoveredOption = this.<Option<?>>checkSerialization(option);
assertEquals(option.getName(), recoveredOption.getName());
// test toString()
assertNotNull(option.toString());
}
@Test
public void invalidTypeSequenceOption() throws Exception {
Exception expected = null;
try {
Option.typeSequence(OptionTestCase.class, null, String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.typeSequence(null, "name", String.class);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.typeSequence(OptionTestCase.class, "name", null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.typeSequence(OptionTestCase.class, "OPTION", Collection.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(NON_STATIC_TYPE_SEQUENCE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(PRIVATE_TYPE_SEQUENCE_OPTION);
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.type(OptionTestCase.class, "NULL_OPTION", Object.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
checkSerialization(Option.type(OptionTestCase.class, "OPTION", Integer.class));
} catch (InvalidObjectException e) {
expected = e;
}
assertNotNull(expected);
}
@Test
public void optionFromString() {
String prefix = getClass().getName() + ".";
ClassLoader classLoader = getClass().getClassLoader();
assertSame(SIMPLE_BOOLEAN_OPTION, Option.fromString(prefix + "SIMPLE_BOOLEAN_OPTION", classLoader));
assertSame(SIMPLE_BYTE_OPTION, Option.fromString(prefix + "SIMPLE_BYTE_OPTION", classLoader));
assertSame(SIMPLE_CHAR_OPTION, Option.fromString(prefix + "SIMPLE_CHAR_OPTION", classLoader));
assertSame(SIMPLE_SHORT_OPTION, Option.fromString(prefix + "SIMPLE_SHORT_OPTION", classLoader));
assertSame(SIMPLE_INT_OPTION, Option.fromString(prefix + "SIMPLE_INT_OPTION", classLoader));
assertSame(SIMPLE_LONG_OPTION, Option.fromString(prefix + "SIMPLE_LONG_OPTION", classLoader));
assertSame(SIMPLE_STRING_OPTION, Option.fromString(prefix + "SIMPLE_STRING_OPTION", classLoader));
assertSame(SIMPLE_PROPERTY_OPTION, Option.fromString(prefix + "SIMPLE_PROPERTY_OPTION", classLoader));
assertSame(SIMPLE_CALENDAR_OPTION, Option.fromString(prefix + "SIMPLE_CALENDAR_OPTION", classLoader));
assertSame(SIMPLE_COLOR_OPTION, Option.fromString(prefix + "SIMPLE_COLOR_OPTION", classLoader));
assertSame(STRING_SEQUENCE_OPTION, Option.fromString(prefix + "STRING_SEQUENCE_OPTION", classLoader));
assertSame(COLLECTION_TYPE_OPTION, Option.fromString(prefix + "COLLECTION_TYPE_OPTION", classLoader));
assertSame(WRITER_TYPE_SEQUENCE_OPTION, Option.fromString(prefix + "WRITER_TYPE_SEQUENCE_OPTION", classLoader));
IllegalArgumentException expected = null;
try {
Option.fromString(prefix + "NON_STATIC_SIMPLE_OPTION", classLoader);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.fromString(prefix + "NON_PUBLIC_SIMPLE_OPTION", classLoader);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.fromString(prefix + "NULL_OPTION", classLoader);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.fromString(prefix + "NON_EXISTENT_OPTION", classLoader);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.fromString("Foo.OPTION", classLoader);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
Option.fromString("NO_DOT", classLoader);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
@Test
public void setBuilder() {
Option.SetBuilder setBuilder = Option.setBuilder();
assertTrue(setBuilder.create().isEmpty());
assertSame(setBuilder, setBuilder.add(SIMPLE_BYTE_OPTION));
final Set<Option<?>> set1 = setBuilder.create();
assertNotNull(set1);
assertEquals(1, set1.size());
assertTrue(set1.contains(SIMPLE_BYTE_OPTION));
assertSame(setBuilder, setBuilder.add(SIMPLE_COLOR_OPTION));
final Set<Option<?>> set2 = setBuilder.create();
assertNotNull(set2);
assertEquals(2, set2.size());
assertTrue(set2.contains(SIMPLE_BYTE_OPTION));
assertTrue(set2.contains(SIMPLE_COLOR_OPTION));
IllegalArgumentException expected = null;
try {
setBuilder.add(NULL_OPTION);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
final List<Option<?>> options = new ArrayList<Option<?>>();
assertSame(setBuilder, setBuilder.addAll(options));
final Set<Option<?>> set3 = setBuilder.create();
assertNotNull(set3);
assertEquals(2, set3.size());
assertTrue(set3.contains(SIMPLE_BYTE_OPTION));
assertTrue(set3.contains(SIMPLE_COLOR_OPTION));
options.add(COLLECTION_TYPE_OPTION);
options.add(STRING_SEQUENCE_OPTION);
assertSame(setBuilder, setBuilder.addAll(options));
final Set<Option<?>> set4 = setBuilder.create();
assertNotNull(set4);
assertEquals(4, set4.size());
assertTrue(set4.contains(SIMPLE_BYTE_OPTION));
assertTrue(set4.contains(SIMPLE_COLOR_OPTION));
assertTrue(set4.contains(COLLECTION_TYPE_OPTION));
assertTrue(set4.contains(STRING_SEQUENCE_OPTION));
options.add(null);
expected = null;
try {
setBuilder.addAll(options);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
expected = null;
try {
setBuilder.addAll(null);
} catch (IllegalArgumentException e) {
expected = e;
}
assertNotNull(expected);
}
@SuppressWarnings("unchecked")
private <T> T checkSerialization(T object) throws Exception {
final ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
final ObjectOutput output = new ObjectOutputStream(new BufferedOutputStream(byteOutputStream));
try{
output.writeObject(object);
}
finally{
output.close();
}
final ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray());
final ObjectInput input = new ObjectInputStream(new BufferedInputStream(byteInputStream));
final T recoveredObject;
try{
recoveredObject = (T) input.readObject();
}
finally{
input.close();
}
assertNotNull(recoveredObject);
assertEquals(object, recoveredObject);
return recoveredObject;
}
}