/*
* Copyright (c) 2008-2014 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 com.mongodb;
import org.bson.BasicBSONObject;
import org.bson.json.JsonMode;
import org.bson.json.JsonWriterSettings;
import org.bson.types.ObjectId;
import org.junit.Test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import static com.mongodb.MongoClient.getDefaultCodecRegistry;
import static java.util.Arrays.asList;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
public class BasicDBObjectTest {
@Test
public void testParse() {
BasicDBObject document = BasicDBObject.parse("{ 'int' : 1, 'string' : 'abc' }");
assertEquals(new BasicDBObject("int", 1).append("string", "abc"), document);
document = BasicDBObject.parse("{ 'int' : 1, 'string' : 'abc' }", getDefaultCodecRegistry().get(BasicDBObject.class));
assertEquals(new BasicDBObject("int", 1).append("string", "abc"), document);
document = BasicDBObject.parse("{_id : ObjectId('5524094c2cf8fb61dede210c')}");
assertEquals(new BasicDBObject("_id", new ObjectId("5524094c2cf8fb61dede210c")), document);
}
@Test
public void testToJson() {
BasicDBObject doc = new BasicDBObject("_id", new ObjectId("5522d5d12cf8fb556a991f45")).append("int", 1).append("string", "abc");
assertEquals("{ \"_id\" : { \"$oid\" : \"5522d5d12cf8fb556a991f45\" }, \"int\" : 1, \"string\" : \"abc\" }", doc.toJson());
assertEquals("{ \"_id\" : ObjectId(\"5522d5d12cf8fb556a991f45\"), \"int\" : 1, \"string\" : \"abc\" }",
doc.toJson(JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build()));
assertEquals("{ \"_id\" : { \"$oid\" : \"5522d5d12cf8fb556a991f45\" }, \"int\" : 1, \"string\" : \"abc\" }",
doc.toJson(getDefaultCodecRegistry().get(BasicDBObject.class)));
assertEquals("{ \"_id\" : ObjectId(\"5522d5d12cf8fb556a991f45\"), \"int\" : 1, \"string\" : \"abc\" }",
doc.toJson(JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build(),
getDefaultCodecRegistry().get(BasicDBObject.class)));
}
@Test
public void testGetDate() {
final Date date = new Date();
BasicDBObject doc = new BasicDBObject("foo", date);
assertTrue(doc.getDate("foo").equals(date));
}
@Test
public void testGetDateWithDefault() {
final Date date = new Date();
BasicDBObject doc = new BasicDBObject("foo", date);
assertTrue(doc.getDate("foo", new Date()).equals(date));
assertTrue(doc.getDate("bar", date).equals(date));
}
@Test
public void testGetObjectId() {
final ObjectId objId = ObjectId.get();
BasicDBObject doc = new BasicDBObject("foo", objId);
assertTrue(doc.getObjectId("foo").equals(objId));
}
@Test
public void testGetObjectIdWithDefault() {
final ObjectId objId = ObjectId.get();
BasicDBObject doc = new BasicDBObject("foo", objId);
assertTrue(doc.getObjectId("foo", ObjectId.get()).equals(objId));
assertTrue(doc.getObjectId("bar", objId).equals(objId));
}
@Test
public void testGetLongWithDefault() {
final long test = 100;
BasicDBObject doc = new BasicDBObject("foo", test);
assertTrue(doc.getLong("foo", 0L) == test);
assertTrue(doc.getLong("bar", 0L) == 0L);
}
@Test
public void testGetDoubleWithDefault() {
BasicDBObject doc = new BasicDBObject("foo", Double.MAX_VALUE);
assertTrue(doc.getDouble("foo", (double) 0) == Double.MAX_VALUE);
assertTrue(doc.getDouble("bar", Double.MIN_VALUE) == Double.MIN_VALUE);
}
@Test
public void testGetStringWithDefault() {
BasicDBObject doc = new BasicDBObject("foo", "badmf");
assertTrue(doc.getString("foo", "ID").equals("badmf"));
assertTrue(doc.getString("bar", "DEFAULT").equals("DEFAULT"));
}
@Test
public void testBuilderIsEmpty() {
BasicDBObjectBuilder b = BasicDBObjectBuilder.start();
assertTrue(b.isEmpty());
b.append("a", 1);
assertFalse(b.isEmpty());
assertEquals(b.get(), new BasicDBObject("a", 1));
}
@Test
@SuppressWarnings("deprecation")
public void testBuilderNested() {
BasicDBObjectBuilder b = BasicDBObjectBuilder.start();
b.add("a", 1);
b.push("b").append("c", 2).pop();
DBObject a = b.get();
assertEquals(a, com.mongodb.util.JSON.parse("{ 'a' : 1, 'b' : { 'c' : 2 } }"));
}
@Test
@SuppressWarnings("deprecation")
public void testDown1() {
BasicDBObjectBuilder b = BasicDBObjectBuilder.start();
b.append("x", 1);
b.push("y");
b.append("a", 2);
b.pop();
b.push("z");
b.append("b", 3);
assertEquals(b.get(), com.mongodb.util.JSON.parse("{ 'x' : 1 , 'y' : { 'a' : 2 } , 'z' : { 'b' : 3 } }"));
}
@Test
public void testEqualsAndHashCode() {
assertEquality(new BasicDBObject(), new BasicDBObject());
assertEquality(new BasicDBObject("x", 1), new BasicDBObject("x", 1));
assertEquality(new BasicBSONObject("x", 1), new BasicDBObject("x", 1));
assertInequality(new BasicDBObject("x", 1), new BasicDBObject("x", 2));
assertInequality(new BasicDBObject("x", 1), new BasicDBObject("y", 1));
assertEquality(new BasicDBObject("x", asList(1, 2, 3)), new BasicDBObject("x", new int[]{1, 2, 3}));
BasicDBList list = new BasicDBList();
list.put(0, 1);
list.put(1, 2);
list.put(2, 3);
assertEquality(new BasicDBObject("x", asList(1, 2, 3)), new BasicDBObject("x", list));
assertEquality(new BasicDBObject("x", 1).append("y", 2), new BasicDBObject("y", 2).append("x", 1));
assertEquality(new BasicDBObject("a", new BasicDBObject("y", 2).append("x", 1)),
new BasicDBObject("a", new BasicDBObject("x", 1).append("y", 2)));
assertEquality(new BasicDBObject("a", asList(new BasicDBObject("y", 2).append("x", 1))),
new BasicDBObject("a", asList(new BasicDBObject("x", 1).append("y", 2))));
assertEquality(new BasicDBObject("a", new BasicDBList().put(1, new BasicDBObject("y", 2).append("x", 1))),
new BasicDBObject("a", new BasicDBList().put(1, new BasicDBObject("x", 1).append("y", 2))));
Map<String, Object> first = new HashMap<String, Object>();
first.put("1", new BasicDBObject("y", 2).append("x", 1));
first.put("2", new BasicDBObject("a", 2).append("b", 1));
Map<String, Object> second = new TreeMap<String, Object>();
second.put("2", new BasicDBObject("b", 1).append("a", 2));
second.put("1", new BasicDBObject("x", 1).append("y", 2));
assertEquality(new BasicDBObject("a", first), new BasicDBObject("a", second));
}
void assertEquality(final BasicBSONObject x, final BasicBSONObject y) {
assertEquals(x, y);
assertEquals(y, x);
assertEquals(x.hashCode(), y.hashCode());
}
void assertInequality(final BasicBSONObject x, final BasicBSONObject y) {
assertThat(x, not(y));
assertThat(y, not(x));
assertThat(x.hashCode(), not(y.hashCode()));
}
}