/******************************************************************************* * Copyright (c) 2012-2016 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.everrest.core.impl.method; import org.everrest.core.method.TypeProducer; import org.everrest.core.util.ParameterizedTypeImpl; import org.junit.Before; import org.junit.Test; import java.util.List; import java.util.Set; import java.util.SortedSet; import static org.junit.Assert.assertEquals; public class TypeProducerFactoryTest { private TypeProducerFactory typeProducerFactory; @Before public void setUp() throws Exception { typeProducerFactory = new TypeProducerFactory(); } @Test public void createsProducerForListOfString() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(List.class, ParameterizedTypeImpl.newParameterizedType(List.class, String.class)); assertEquals(CollectionStringProducer.class, typeProducer.getClass()); } @Test public void createsProducerForSetOfString() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(Set.class, ParameterizedTypeImpl.newParameterizedType(Set.class, String.class)); assertEquals(CollectionStringProducer.class, typeProducer.getClass()); } @Test public void createsProducerForSortedSetOfString() throws Exception { TypeProducer typeProducer = typeProducerFactory .createTypeProducer(SortedSet.class, ParameterizedTypeImpl.newParameterizedType(SortedSet.class, String.class)); assertEquals(CollectionStringProducer.class, typeProducer.getClass()); } @Test public void createsProducerForListOfTypeThatHasStringConstructor() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(List.class, ParameterizedTypeImpl.newParameterizedType(List.class, StringConstructorClass.class)); assertEquals(CollectionStringConstructorProducer.class, typeProducer.getClass()); } @Test public void createsProducerForSetOfTypeThatHasStringConstructor() throws Exception { TypeProducer typeProducer = typeProducerFactory .createTypeProducer(Set.class, ParameterizedTypeImpl.newParameterizedType(Set.class, StringConstructorClass.class)); assertEquals(CollectionStringConstructorProducer.class, typeProducer.getClass()); } @Test public void createsProducerForSortedSetOfTypeThatHasStringConstructor() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(SortedSet.class, ParameterizedTypeImpl .newParameterizedType(SortedSet.class, StringConstructorClass.class)); assertEquals(CollectionStringConstructorProducer.class, typeProducer.getClass()); } @Test public void createsProducerForListOfTypeThatHasStringValueOfMethod() throws Exception { TypeProducer typeProducer = typeProducerFactory .createTypeProducer(List.class, ParameterizedTypeImpl.newParameterizedType(List.class, ValueOfStringClass.class)); assertEquals(CollectionStringValueOfProducer.class, typeProducer.getClass()); } @Test public void createsProducerForSetOfTypeThatHasStringValueOfMethod() throws Exception { TypeProducer typeProducer = typeProducerFactory .createTypeProducer(Set.class, ParameterizedTypeImpl.newParameterizedType(Set.class, ValueOfStringClass.class)); assertEquals(CollectionStringValueOfProducer.class, typeProducer.getClass()); } @Test public void createsProducerForSortedSetOfTypeThatHasStringValueOfMethod() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(SortedSet.class, ParameterizedTypeImpl.newParameterizedType(SortedSet.class, ValueOfStringClass.class)); assertEquals(CollectionStringValueOfProducer.class, typeProducer.getClass()); } @Test public void createsProducerForPrimitiveType() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(int.class, null); assertEquals(PrimitiveTypeProducer.class, typeProducer.getClass()); } @Test public void createsProducerForString() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(String.class, null); assertEquals(StringProducer.class, typeProducer.getClass()); } @Test public void createsProducerForTypeThatHasStringConstructor() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(StringConstructorClass.class, null); assertEquals(StringConstructorProducer.class, typeProducer.getClass()); } @Test public void createsProducerForTypeThatHasStringValueOfMethod() throws Exception { TypeProducer typeProducer = typeProducerFactory.createTypeProducer(ValueOfStringClass.class, null); assertEquals(StringValueOfProducer.class, typeProducer.getClass()); } @Test(expected = IllegalArgumentException.class) public void throwsExceptionWhenNeitherStringConstructorNorStringValueOfMethodAvailable() throws Exception { typeProducerFactory.createTypeProducer(NoStringConstructorNoValueOfClass.class, null); } public static class StringConstructorClass { public StringConstructorClass(String value) { } } public static class ValueOfStringClass { public static ValueOfStringClass valueOf(String value) { return new ValueOfStringClass(); } } public static class NoStringConstructorNoValueOfClass { } }