blob: 404478131474c4efcdf1d26f793c040a7a1ce1b4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.johnzon.mapper;
import static java.util.Collections.emptyMap;
import org.apache.johnzon.mapper.access.FieldAccessMode;
import org.apache.johnzon.mapper.map.LazyConverterMap;
import org.junit.Assert;
import org.junit.Test;
import javax.json.JsonValue;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class MapperConfigTest {
@Test
public void testFindObjectConverterConverterForSpecificClass() {
ObjectConverter.Codec<ClassWithoutSupertypes> theConverter = new TheConverter<ClassWithoutSupertypes>();
Map<Class<?>, ObjectConverter.Codec<?>> converterMap = new HashMap<Class<?>, ObjectConverter.Codec<?>>(1);
converterMap.put(ClassWithoutSupertypes.class, theConverter);
MapperConfig config = createConfig(converterMap);
ObjectConverter.Reader converter = config.findObjectConverterReader(ClassWithoutSupertypes.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
@Test
public void testFindObjectConverterConverterForInterface() {
ObjectConverter.Codec<TheInterface> theConverter = new TheConverter<TheInterface>();
MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter.Codec<?>>singletonMap(TheInterface.class, theConverter));
ObjectConverter.Writer converter = config.findObjectConverterWriter(ClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
@Test
public void testFindObjectConverterConverterOnlyForSuperclass() {
ObjectConverter.Codec<ClassForTheInterface> theConverter = new TheConverter<ClassForTheInterface>();
MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter.Codec<?>>singletonMap(ClassForTheInterface.class, theConverter));
ObjectConverter.Reader converter = config.findObjectConverterReader(ExtendingClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
@Test
public void testFindObjectConverterConverterForInterfaceAndClass() {
ObjectConverter.Codec<TheInterface> interfaceConverter = new TheConverter<TheInterface>();
ObjectConverter.Codec<ClassForTheInterface> theConverter = new TheConverter<ClassForTheInterface>();
Map<Class<?>, ObjectConverter.Codec<?>> converterMap = new HashMap<Class<?>, ObjectConverter.Codec<?>>(2);
converterMap.put(TheInterface.class, interfaceConverter);
converterMap.put(ClassForTheInterface.class, theConverter);
MapperConfig config = createConfig(converterMap);
{
ObjectConverter.Reader converter = config.findObjectConverterReader(ClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
{
ObjectConverter.Writer converter = config.findObjectConverterWriter(ExtendingClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
}
@Test
public void testFindObjectConverterConverterForMoreInterfaces() {
ObjectConverter.Codec<TheInterface> firstConverter = new TheConverter<TheInterface>();
ObjectConverter.Codec<TheSecondInterface> secondConverter = new TheConverter<TheSecondInterface>();
Map<Class<?>, ObjectConverter.Codec<?>> converterMap = new HashMap<Class<?>, ObjectConverter.Codec<?>>(2);
converterMap.put(TheInterface.class, firstConverter);
converterMap.put(TheSecondInterface.class, secondConverter);
MapperConfig config = createConfig(converterMap);
ObjectConverter.Writer converter = config.findObjectConverterWriter(ClassWithTwoInterfaces.class);
Assert.assertNotNull(converter);
Assert.assertEquals(converterMap.get(ClassWithTwoInterfaces.class.getInterfaces()[0]), converter);
}
@Test
public void testFindObjectConverterConverterForInterfaceAndClassConverterSubclasses() {
TheAbstractConverter<ClassForTheInterface> theConverter = new TheAbstractConverter<ClassForTheInterface>() {};
MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter.Codec<?>>singletonMap(ClassForTheInterface.class, theConverter));
{
ObjectConverter.Writer converter = config.findObjectConverterWriter(ClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
{
ObjectConverter.Writer converter = config.findObjectConverterWriter(ExtendingClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
}
@Test
public void testfindObjectConverterConverterForObject() {
TheConverter<Object> theConverter = new TheConverter<Object>();
MapperConfig config = createConfig(Collections.<Class<?>, ObjectConverter.Codec<?>>singletonMap(Object.class, theConverter));
ObjectConverter.Reader converter = config.findObjectConverterReader(ClassForTheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
converter = config.findObjectConverterReader(TheInterface.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
converter = config.findObjectConverterReader(InterfaceExtendingTwoInterfaces.class);
Assert.assertNotNull(converter);
Assert.assertEquals(theConverter, converter);
}
private MapperConfig createConfig(Map<Class<?>, ObjectConverter.Codec<?>> converter) {
return new MapperConfig(new LazyConverterMap(),
Map.class.cast(converter), Map.class.cast(converter),
-1,
true,
true,
true,
false,
false,
false,
new FieldAccessMode(true, true),
StandardCharsets.UTF_8,
null,
false, false, null, false, false, emptyMap(), true, false, true,
null, null, null, null, null);
}
private static final class ClassWithoutSupertypes {}
private interface TheInterface {}
private static class ClassForTheInterface implements TheInterface {}
private static class ExtendingClassForTheInterface extends ClassForTheInterface {}
private interface TheSecondInterface {}
private static class ClassWithTwoInterfaces implements TheInterface, TheSecondInterface {}
private interface InterfaceExtendingTwoInterfaces extends TheInterface, TheSecondInterface {}
private static class TheConverter<T> implements ObjectConverter.Codec<T>{
@Override
public void writeJson(T instance, MappingGenerator jsonbGenerator) {
// dummy
}
@Override
public T fromJson(JsonValue jsonObject, Type targetType, MappingParser parser) {
// dummy
return null;
}
}
private static abstract class TheAbstractConverter<T extends TheInterface> implements ObjectConverter.Codec<T> {
@Override
public void writeJson(T instance, MappingGenerator jsonbGenerator) {
// dummy
}
@Override
public T fromJson(JsonValue jsonObject, Type targetType, MappingParser parser) {
// dummy
return null;
}
}
}