/*
* 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 org.bson;
import org.bson.codecs.BsonDocumentCodec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.bson.json.JsonMode;
import org.bson.json.JsonReader;
import org.bson.json.JsonWriter;
import org.bson.json.JsonWriterSettings;
import org.junit.Test;
import java.io.StringWriter;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
// Don't convert to Spock, as Groovy intercepts equals/hashCode methods that we are trying to test
public class BsonDocumentTest {
private BsonDocument emptyDocument = new BsonDocument();
private BsonDocument emptyRawDocument = new RawBsonDocument(emptyDocument, new BsonDocumentCodec());
private BsonDocument document = new BsonDocument()
.append("a", new BsonInt32(1))
.append("b", new BsonInt32(2))
.append("c", new BsonDocument("x", BsonBoolean.TRUE))
.append("d", new BsonArray(Arrays.<BsonValue>asList(new BsonDocument("y",
BsonBoolean.FALSE),
new BsonInt32(1))));
private BsonDocument rawDocument = new RawBsonDocument(document, new BsonDocumentCodec());
@Test
public void shouldBeEqualToItself() {
assertTrue(emptyDocument.equals(emptyDocument));
assertTrue(document.equals(document));
}
@Test
public void shouldBeEqualToEquivalentBsonDocument() {
assertTrue(emptyDocument.equals(emptyRawDocument));
assertTrue(document.equals(rawDocument));
assertTrue(emptyRawDocument.equals(emptyDocument));
assertTrue(rawDocument.equals(document));
}
@Test
public void shouldNotBeEqualToDifferentBsonDocument() {
// expect
assertFalse(emptyDocument.equals(document));
assertFalse(document.equals(emptyRawDocument));
assertFalse(document.equals(emptyRawDocument));
assertFalse(emptyRawDocument.equals(document));
assertFalse(rawDocument.equals(emptyDocument));
}
@Test
public void shouldHaveSameHashCodeAsEquivalentBsonDocument() {
assertEquals(emptyDocument.hashCode(), new BsonDocument().hashCode());
assertEquals(emptyDocument.hashCode(), emptyRawDocument.hashCode());
assertEquals(document.hashCode(), rawDocument.hashCode());
}
@Test
public void toJsonShouldReturnEquivalent() {
assertEquals(new BsonDocumentCodec().decode(new JsonReader(document.toJson()), DecoderContext.builder().build()),
document);
}
@Test
public void toJsonShouldRespectDefaultJsonWriterSettings() {
StringWriter writer = new StringWriter();
new BsonDocumentCodec().encode(new JsonWriter(writer), document, EncoderContext.builder().build());
assertEquals(writer.toString(), document.toJson());
}
@Test
public void toJsonShouldRespectJsonWriterSettings() {
StringWriter writer = new StringWriter();
JsonWriterSettings settings = JsonWriterSettings.builder().outputMode(JsonMode.SHELL).build();
new BsonDocumentCodec().encode(new JsonWriter(writer, settings), document, EncoderContext.builder().build());
assertEquals(writer.toString(), document.toJson(settings));
}
@Test
public void toStringShouldEqualToJson() {
assertEquals(document.toJson(), document.toString());
}
@Test
public void shouldParseJson() {
assertEquals(new BsonDocument("a", new BsonInt32(1)), BsonDocument.parse("{\"a\" : 1}"));
}
}