/* * Copyright 2014 Artur. * * 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.jaxygen.typeconverter.jaxygen.typeconverter; import static junit.framework.TestCase.assertEquals; import org.jaxygen.typeconverter.TypeConverter; import org.jaxygen.typeconverter.TypeConverterFactory; import org.jaxygen.typeconverter.exceptions.ConversionError; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import org.junit.runner.RunWith; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; /** * * @author Artur */ @RunWith(MockitoJUnitRunner.class) public class NestedClassesConversionsTest { @Mock private TypeConverter<B, A> bToAConverterMock; @Mock private TypeConverter<A, B> aToBConverterMock; @Mock private TypeConverter<A, C> aToCConverterMock; @Mock private TypeConverter<C, A> cToAConverterMock; @Mock private TypeConverter<C, B> cToBConverterMock; private final A a = new A(); private final B b = new B(); private final C c = new C(); public static class A { private Long value = null; public Long getValue() { return value; } public void setValue(Long value) { this.value = value; } } public static class B extends A { private String bValue = null; public String getbValue() { return bValue; } public void setbValue(String bValue) { this.bValue = bValue; } } public static class C extends B { private Double cValue = 0.0d; public Double getcValue() { return cValue; } public void setcValue(Double cValue) { this.cValue = cValue; } } public NestedClassesConversionsTest() { } @Before public void setUp() throws ConversionError { Mockito.when(bToAConverterMock.convert(b)).thenReturn(a); Mockito.when(aToBConverterMock.convert(a)).thenReturn(b); Mockito.when(aToCConverterMock.convert(a)).thenReturn(c); Mockito.when(cToAConverterMock.convert(c)).thenReturn(a); Mockito.when(cToBConverterMock.convert(c)).thenReturn(b); Mockito.when(bToAConverterMock.from()).thenReturn(B.class); Mockito.when(bToAConverterMock.to()).thenReturn(A.class); Mockito.when(cToAConverterMock.from()).thenReturn(C.class); Mockito.when(cToAConverterMock.to()).thenReturn(A.class); Mockito.when(aToBConverterMock.from()).thenReturn(A.class); Mockito.when(aToBConverterMock.to()).thenReturn(B.class); Mockito.when(aToCConverterMock.from()).thenReturn(A.class); Mockito.when(aToCConverterMock.to()).thenReturn(C.class); Mockito.when(cToBConverterMock.from()).thenReturn(C.class); Mockito.when(cToBConverterMock.to()).thenReturn(B.class); Mockito.when(cToAConverterMock.from()).thenReturn(C.class); Mockito.when(cToAConverterMock.to()).thenReturn(A.class); } @Test public void test_shallConvertCtoA() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("check_shallConvertBtoA"); // given factory.registerConverter(cToAConverterMock); // when A aFromC = factory.convert(c, A.class); // then Mockito.verify(cToAConverterMock).convert(c); assertEquals(a, aFromC); } @Test public void test_shallConvertCtoA_2() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallConvertCtoA_2"); // given factory.registerConverter(cToAConverterMock); factory.registerConverter(bToAConverterMock); // when A aFromC = factory.convert(c, A.class); // then Mockito.verify(cToAConverterMock).convert(c); assertEquals(a, aFromC); } @Test public void test_shallConvertBtoA() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallConvertBtoA"); // given factory.registerConverter(cToAConverterMock); factory.registerConverter(bToAConverterMock); // when A aFromB = factory.convert(b, A.class); // then Mockito.verify(bToAConverterMock).convert(b); assertEquals(a, aFromB); } @Test public void test_shallConvertAtoC() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallConvertAtoC"); // given factory.registerConverter(cToAConverterMock); factory.registerConverter(bToAConverterMock); factory.registerConverter(aToCConverterMock); factory.registerConverter(aToBConverterMock); // when A aFromB = factory.convert(b, A.class); // then Mockito.verify(bToAConverterMock).convert(b); assertEquals(a, aFromB); } @Test public void test_shallConvertAtoB() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallConvertAtoB"); // given factory.registerConverter(cToAConverterMock); factory.registerConverter(bToAConverterMock); factory.registerConverter(aToCConverterMock); factory.registerConverter(aToBConverterMock); // when B bFromA = factory.convert(a, B.class); // then Mockito.verify(aToBConverterMock).convert(a); assertEquals(b, bFromA); } @Test public void test_shallConvertCtoA_usingNested() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallConvertCtoA_usingNested"); // given Mockito.when(bToAConverterMock.convert(c)).thenReturn(a); factory.registerConverter(bToAConverterMock); // when A aFromC = factory.convert(c, A.class); // then Mockito.verify(bToAConverterMock).convert(c); assertEquals(a, aFromC); } @Test(expected = ConversionError.class) public void test_shallConvertAtoB_throw_ConversionError() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallConvertAtoB_throw_ConversionError"); // given factory.registerConverter(cToAConverterMock); factory.registerConverter(bToAConverterMock); factory.registerConverter(aToCConverterMock); B bFromA = null; try { // when bFromA = factory.convert(a, B.class); } finally { // then Mockito.verify(aToBConverterMock, Mockito.never()).convert(a); Mockito.verify(cToAConverterMock, Mockito.never()).convert(Matchers.any(C.class)); Mockito.verify(bToAConverterMock, Mockito.never()).convert(Matchers.any(B.class)); Mockito.verify(aToCConverterMock, Mockito.never()).convert(a); assertNull(bFromA); } } @Test public void test_shallForceConvertAtoB_using_BtoC() throws ConversionError { TypeConverterFactory factory = TypeConverterFactory.instance("test_shallForceConvertAtoB_using_BtoC"); // given factory.registerConverter(cToAConverterMock); factory.registerConverter(bToAConverterMock); factory.registerConverter(aToCConverterMock); factory.registerConverter(A.class, B.class, aToCConverterMock); B bFromA; // when bFromA = factory.convert(a, B.class); // then Mockito.verify(aToBConverterMock, Mockito.never()).convert(a); Mockito.verify(cToAConverterMock, Mockito.never()).convert(Matchers.any(C.class)); Mockito.verify(bToAConverterMock, Mockito.never()).convert(Matchers.any(B.class)); Mockito.verify(aToCConverterMock).convert(a); assertEquals(c, bFromA); } }