/* * Copyright 2017 MongoDB, Inc. * * 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.bson.codecs.pojo; import org.bson.codecs.pojo.entities.CollectionNestedPojoModel; import org.bson.codecs.pojo.entities.GenericHolderModel; import org.bson.codecs.pojo.entities.NestedGenericHolderMapModel; import org.bson.codecs.pojo.entities.SimpleGenericsModel; import org.bson.codecs.pojo.entities.SimpleModel; import org.bson.codecs.pojo.entities.conventions.AnnotationInheritedModel; import org.bson.codecs.pojo.entities.conventions.AnnotationModel; import org.bson.codecs.pojo.entities.conventions.FieldSelectionModel; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; public final class ClassModelTest { @Test @SuppressWarnings("rawtypes") public void testSimpleGenericsModel() { ClassModel<?> classModel = ClassModel.builder(SimpleGenericsModel.class).build(); FieldModel<?> fieldModel = classModel.getFieldModels().get(0); assertEquals("SimpleGenericsModel", classModel.getName()); assertEquals(SimpleGenericsModel.class, classModel.getType()); assertFalse(classModel.useDiscriminator()); assertEquals("_t", classModel.getDiscriminatorKey()); assertEquals("SimpleGenericsModel", classModel.getDiscriminator()); assertNull(classModel.getIdFieldModel()); assertEquals(4, classModel.getFieldModels().size()); assertEquals(fieldModel, classModel.getFieldModel(fieldModel.getDocumentFieldName())); assertTrue(classModel.getInstanceCreatorFactory() instanceof InstanceCreatorFactoryImpl); } @Test @SuppressWarnings("rawtypes") public void testCollectionNestedPojoModelFieldTypes() { TypeData<String> string = TypeData.builder(String.class).build(); TypeData<SimpleModel> simple = TypeData.builder(SimpleModel.class).build(); TypeData<ArrayList> list = TypeData.builder(ArrayList.class).addTypeParameter(simple).build(); TypeData<ArrayList> listList = TypeData.builder(ArrayList.class).addTypeParameter(list).build(); TypeData<HashSet> set = TypeData.builder(HashSet.class).addTypeParameter(simple).build(); TypeData<HashSet> setSet = TypeData.builder(HashSet.class).addTypeParameter(set).build(); TypeData<HashMap> map = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(simple).build(); TypeData<ArrayList> listMap = TypeData.builder(ArrayList.class).addTypeParameter(map).build(); TypeData<HashMap> mapMap = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(map).build(); TypeData<HashMap> mapList = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(list).build(); TypeData<HashMap> mapListMap = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(listMap).build(); TypeData<HashMap> mapSet = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(set).build(); TypeData<ArrayList> listMapList = TypeData.builder(ArrayList.class).addTypeParameter(mapList).build(); TypeData<ArrayList> listMapSet = TypeData.builder(ArrayList.class).addTypeParameter(mapSet).build(); ClassModel<?> classModel = ClassModel.builder(CollectionNestedPojoModel.class).build(); assertEquals(list, classModel.getFieldModels().get(0).getTypeData()); assertEquals(listList, classModel.getFieldModels().get(1).getTypeData()); assertEquals(set, classModel.getFieldModels().get(2).getTypeData()); assertEquals(setSet, classModel.getFieldModels().get(3).getTypeData()); assertEquals(map, classModel.getFieldModels().get(4).getTypeData()); assertEquals(mapMap, classModel.getFieldModels().get(5).getTypeData()); assertEquals(mapList, classModel.getFieldModels().get(6).getTypeData()); assertEquals(mapListMap, classModel.getFieldModels().get(7).getTypeData()); assertEquals(mapSet, classModel.getFieldModels().get(8).getTypeData()); assertEquals(listMap, classModel.getFieldModels().get(9).getTypeData()); assertEquals(listMapList, classModel.getFieldModels().get(10).getTypeData()); assertEquals(listMapSet, classModel.getFieldModels().get(11).getTypeData()); } @Test @SuppressWarnings("rawtypes") public void testMappingConcreteGenericTypes() { TypeData<String> string = TypeData.builder(String.class).build(); TypeData<SimpleModel> simple = TypeData.builder(SimpleModel.class).build(); TypeData<HashMap> map = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(simple).build(); TypeData<GenericHolderModel> genericHolder = TypeData.builder(GenericHolderModel.class).addTypeParameter(map).build(); ClassModel<?> classModel = ClassModel.builder(NestedGenericHolderMapModel.class).build(); assertEquals(genericHolder, classModel.getFieldModels().get(0).getTypeData()); } @Test @SuppressWarnings("rawtypes") public void testMappingSimpleGenericsModelTypes() { TypeData<Object> object = TypeData.builder(Object.class).build(); TypeData<Integer> integer = TypeData.builder(Integer.class).build(); TypeData<String> string = TypeData.builder(String.class).build(); TypeData<ArrayList> list = TypeData.builder(ArrayList.class).addTypeParameter(object).build(); TypeData<HashMap> map = TypeData.builder(HashMap.class).addTypeParameter(string).addTypeParameter(object).build(); ClassModel<?> classModel = ClassModel.builder(SimpleGenericsModel.class).build(); assertEquals(integer, classModel.getFieldModels().get(0).getTypeData()); assertEquals(object, classModel.getFieldModels().get(1).getTypeData()); assertEquals(list, classModel.getFieldModels().get(2).getTypeData()); assertEquals(map, classModel.getFieldModels().get(3).getTypeData()); } @Test public void testAnnotationModel() { ClassModel<?> classModel = ClassModel.builder(AnnotationModel.class).build(); FieldModel<?> fieldModel = classModel.getFieldModels().get(0); assertEquals("AnnotationModel", classModel.getName()); assertEquals(AnnotationModel.class, classModel.getType()); assertTrue(classModel.useDiscriminator()); assertEquals("_cls", classModel.getDiscriminatorKey()); assertEquals("MyAnnotationModel", classModel.getDiscriminator()); assertEquals(fieldModel, classModel.getIdFieldModel()); assertEquals(3, classModel.getFieldModels().size()); assertEquals(fieldModel, classModel.getFieldModel(fieldModel.getDocumentFieldName())); assertTrue(classModel.getInstanceCreatorFactory() instanceof InstanceCreatorFactoryImpl); } @Test public void testInheritedClassAnnotations() { ClassModel<?> classModel = ClassModel.builder(AnnotationInheritedModel.class).build(); assertTrue(classModel.useDiscriminator()); assertEquals("_cls", classModel.getDiscriminatorKey()); assertEquals("AnnotationInheritedModel", classModel.getDiscriminator()); assertEquals(2, classModel.getFieldModels().size()); FieldModel<?> fieldModel = classModel.getFieldModel("_id"); assertEquals(fieldModel, classModel.getIdFieldModel()); assertEquals(fieldModel, classModel.getFieldModel(fieldModel.getDocumentFieldName())); fieldModel = classModel.getFieldModel("child"); assertTrue(fieldModel.useDiscriminator()); } @Test public void testFieldSelection() { ClassModel<?> classModel = ClassModel.builder(FieldSelectionModel.class).build(); assertEquals(2, classModel.getFieldModels().size()); assertEquals("myFinalField", classModel.getFieldModels().get(0).getFieldName()); assertEquals("myIntField", classModel.getFieldModels().get(1).getFieldName()); } }