package org.mongodb.morphia.mapping;
import com.mongodb.BasicDBList;
import com.mongodb.BasicDBObject;
import org.bson.types.ObjectId;
import org.junit.Assert;
import org.junit.Test;
import org.mongodb.morphia.TestBase;
import org.mongodb.morphia.annotations.Embedded;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
import org.mongodb.morphia.annotations.Property;
import org.mongodb.morphia.mapping.cache.DefaultEntityCache;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static java.util.Arrays.asList;
public class MappedFieldTest extends TestBase {
@Test
public void arrayFieldMapping() {
final MappedField field = new MappedField(getField(TestEntity.class, "arrayOfInt"), TestEntity.class, getMorphia().getMapper());
Assert.assertFalse(field.isSingleValue());
Assert.assertTrue(field.isMultipleValues());
Assert.assertTrue(field.isArray());
Assert.assertTrue(field.getType().isArray());
Assert.assertEquals("arrayOfInt", field.getJavaFieldName());
Assert.assertEquals("arrayOfInt", field.getNameToStore());
}
@Test
public void basicFieldMapping() {
final MappedField field = new MappedField(getField(TestEntity.class, "name"), TestEntity.class, getMorphia().getMapper());
Assert.assertTrue(field.isSingleValue());
Assert.assertTrue(String.class == field.getType());
Assert.assertEquals("name", field.getJavaFieldName());
Assert.assertEquals("n", field.getNameToStore());
}
@Test
public void collectionFieldMapping() {
final MappedField field = new MappedField(getField(TestEntity.class, "listOfString"), TestEntity.class, getMorphia().getMapper());
Assert.assertFalse(field.isSingleValue());
Assert.assertTrue(field.isMultipleValues());
Assert.assertFalse(field.isArray());
Assert.assertTrue(List.class == field.getType());
Assert.assertTrue(String.class == field.getSubType());
Assert.assertEquals("listOfString", field.getJavaFieldName());
Assert.assertEquals("listOfString", field.getNameToStore());
}
@Test
public void idFieldMapping() {
final MappedField field = new MappedField(getField(TestEntity.class, "id"), TestEntity.class, getMorphia().getMapper());
Assert.assertTrue(field.isSingleValue());
Assert.assertTrue(ObjectId.class == field.getType());
Assert.assertEquals("id", field.getJavaFieldName());
Assert.assertEquals("_id", field.getNameToStore());
}
@Test
public void nestedCollectionsMapping() {
final MappedField field = new MappedField(getField(TestEntity.class, "listOfListOfString"),
TestEntity.class,
getMorphia().getMapper());
Assert.assertFalse(field.isSingleValue());
Assert.assertTrue(field.isMultipleValues());
Assert.assertFalse(field.isArray());
Assert.assertTrue(List.class == field.getType());
final List<MappedField> level1Types = field.getTypeParameters();
final MappedField typeParameter = level1Types.get(0);
Assert.assertTrue(List.class == typeParameter.getConcreteType());
final List<MappedField> level2Types = typeParameter.getTypeParameters();
final MappedField nested = level2Types.get(0);
Assert.assertTrue(String.class == nested.getConcreteType());
Assert.assertEquals("listOfListOfString", field.getJavaFieldName());
Assert.assertEquals("listOfListOfString", field.getNameToStore());
final BasicDBList list = new BasicDBList();
list.add(dbList("a", "b", "c"));
list.add(dbList("d", "e", "f"));
final TestEntity entity = getMorphia().getMapper()
.fromDb(getDs(), new BasicDBObject("listOfListOfString", list),
new TestEntity(),
new DefaultEntityCache());
final List<String> strings = asList("a", "b", "c");
final List<String> strings1 = asList("d", "e", "f");
final List<List<String>> expected = new ArrayList<List<String>>();
expected.add(strings);
expected.add(strings1);
Assert.assertEquals(expected, entity.listOfListOfString);
}
private BasicDBList dbList(final String... values) {
final BasicDBList list = new BasicDBList();
Collections.addAll(list, values);
return list;
}
private Field getField(final Class c, final String field) {
try {
return c.getDeclaredField(field);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
@Entity
private static class TestEntity {
@Id
private ObjectId id;
@Property("n")
private String name;
private List<String> listOfString;
private List<List<String>> listOfListOfString;
private int[] arrayOfInt;
private Map<String, Integer> mapOfInts;
private List<Embed> listOfEmbeds;
}
@Embedded
private static class Embed {
private String embedName;
private List<Embed> embeddeds;
}
}