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.dao.BasicDAO; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; /** * @author Uwe Schaefer, (us@thomas-daily.de) */ public class CollectionOfValuesTest extends TestBase { @Test public void testCity() { getMorphia().map(City.class); City city = new City(); city.name = "My city"; city.array = new byte[]{4, 5}; for (byte i = 0; i < 2; i++) { for (byte j = 0; j < 2; j++) { city.cells[i][j] = (i * 100 + j); } } getDs().save(city); City loaded = getDs().get(city); Assert.assertEquals(city.name, loaded.name); compare(city.array, loaded.array); for (int i = 0; i < city.cells.length; i++) { compare(city.cells[i], loaded.cells[i]); } } @Test @SuppressWarnings("unchecked") public void testCreateEntityWithBasicDBList() throws Exception { BasicDAO<TestEntity, ObjectId> dao; dao = new BasicDAO<TestEntity, ObjectId>(TestEntity.class, getDs()); TestEntity entity = new TestEntity(); List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); data.add(new BasicDBObject("type", "text") .append("data", new BasicDBObject("text", "sometext"))); entity.setData(data); dao.save(entity); final TestEntity fetched = dao.get(entity.getId()); Assert.assertEquals(entity, fetched); } @Test public void testListOfListMapping() throws Exception { getMorphia().map(ContainsListOfList.class); getDs().delete(getDs().find(ContainsListOfList.class)); final ContainsListOfList entity = new ContainsListOfList(); entity.strings = new ArrayList<List<String>>(); entity.strings.add(Arrays.asList("element1", "element2")); entity.strings.add(Collections.singletonList("element3")); entity.integers = new ArrayList<List<Integer>>(); entity.integers.add(Arrays.asList(1, 2)); entity.integers.add(Collections.singletonList(3)); getDs().save(entity); final ContainsListOfList loaded = getDs().get(entity); Assert.assertNotNull(loaded.strings); Assert.assertEquals(entity.strings, loaded.strings); Assert.assertEquals(entity.strings.get(0), loaded.strings.get(0)); Assert.assertEquals(entity.strings.get(0).get(0), loaded.strings.get(0).get(0)); Assert.assertNotNull(loaded.integers); Assert.assertEquals(entity.integers, loaded.integers); Assert.assertEquals(entity.integers.get(0), loaded.integers.get(0)); Assert.assertEquals(entity.integers.get(0).get(0), loaded.integers.get(0).get(0)); Assert.assertNotNull(loaded.id); } @Test public void testTwoDimensionalArrayMapping() throws Exception { getMorphia().map(ContainsTwoDimensionalArray.class); final ContainsTwoDimensionalArray entity = new ContainsTwoDimensionalArray(); entity.oneDimArray = "Joseph".getBytes(); entity.twoDimArray = new byte[][]{"Joseph".getBytes(), "uwe".getBytes()}; getDs().save(entity); final ContainsTwoDimensionalArray loaded = getDs().get(ContainsTwoDimensionalArray.class, entity.id); Assert.assertNotNull(loaded.id); Assert.assertNotNull(loaded.oneDimArray); Assert.assertNotNull(loaded.twoDimArray); compare(entity.oneDimArray, loaded.oneDimArray); compare(entity.twoDimArray[0], loaded.twoDimArray[0]); compare(entity.twoDimArray[1], loaded.twoDimArray[1]); } private void compare(final byte[] left, final byte[] right) { Assert.assertArrayEquals(left, right); } private void compare(final int[] left, final int[] right) { Assert.assertArrayEquals(left, right); } @Entity("CreateEntityWithDBListIT-TestEntity") public static class TestEntity { @Id private ObjectId id; private BasicDBList data; public BasicDBList getData() { return data; } public void setData(final List<?> data) { this.data = new BasicDBList(); this.data.addAll(data); } public ObjectId getId() { return id; } @Override public int hashCode() { int result = id != null ? id.hashCode() : 0; result = 31 * result + (data != null ? data.hashCode() : 0); return result; } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final TestEntity that = (TestEntity) o; return id != null ? id.equals(that.id) : that.id == null && !(data != null ? !data.equals(that.data) : that.data != null); } } public static class ContainsListOfList { @Id private ObjectId id; private List<List<String>> strings; private List<List<Integer>> integers; } public static class ContainsTwoDimensionalArray { @Id private ObjectId id; private byte[] oneDimArray; private byte[][] twoDimArray; } @Entity(noClassnameStored = true) public static class City { @Id private ObjectId id; private String name; @Embedded private byte[] array; private int[][] cells = new int[2][2]; } }