Skip to content

Commit

Permalink
Extend BsonWriter to write byte[] as Binary.
Browse files Browse the repository at this point in the history
  • Loading branch information
lanwin committed May 18, 2010
1 parent 561c4dd commit 34ee4e6
Show file tree
Hide file tree
Showing 2 changed files with 272 additions and 182 deletions.
126 changes: 72 additions & 54 deletions source/MongoDB.Tests/UnitTests/Bson/TestBsonWriter.cs
Expand Up @@ -11,15 +11,17 @@ public class TestBsonWriter : BsonTestBase
{
private char euro = '\u20ac';

private string WriteStringAndGetHex(string val){
private string WriteStringAndGetHex(string val)
{
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
writer.Write(val, false);
return BitConverter.ToString(ms.ToArray());
}

[Test]
public void TestCalculateSizeOfComplexDoc(){
public void TestCalculateSizeOfComplexDoc()
{
var doc = new Document();
doc.Add("a", "a");
doc.Add("b", 1);
Expand All @@ -32,7 +34,8 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
public void TestCalculateSizeOfEmptyDoc(){
public void TestCalculateSizeOfEmptyDoc()
{
var doc = new Document();
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
Expand All @@ -41,10 +44,9 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
public void TestCalculateSizeOfSimpleDoc(){
var doc = new Document();
doc.Add("a", "a");
doc.Add("b", 1);
public void TestCalculateSizeOfSimpleDoc()
{
var doc = new Document {{"a", "a"}, {"b", 1}};

var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
Expand All @@ -54,7 +56,18 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
public void TestNullsDontThrowExceptions(){
public void TestLocalDateTimeIsWrittenAsUtcTime()
{
var dateTime = new DateTime(2010, 1, 1, 10, 0, 0, DateTimeKind.Local);

var base64 = Serialize(new Document("time", dateTime));

Assert.AreEqual("EwAAAAl0aW1lAIDaHOklAQAAAA==", base64);
}

[Test]
public void TestNullsDontThrowExceptions()
{
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
var doc = new Document().Add("n", null);
Expand All @@ -69,7 +82,8 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
public void TestWriteArrayDoc(){
public void TestWriteArrayDoc()
{
const string expected = "2000000002300002000000610002310002000000620002320002000000630000";
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
Expand All @@ -83,7 +97,8 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
public void TestWriteDocument(){
public void TestWriteDocument()
{
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
const string expected = "1400000002746573740005000000746573740000";
Expand All @@ -98,21 +113,39 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
public void TestWriteMultibyteString(){
public void TestWriteMultibyteString()
{
var val = new StringBuilder().Append(euro, 3).ToString();
var expected = BitConverter.ToString(Encoding.UTF8.GetBytes(val + '\0'));
Assert.AreEqual(expected, WriteStringAndGetHex(val));
}

[Test]
public void TestWriteMultibyteStringLong(){
public void TestWriteMultibyteStringLong()
{
var val = new StringBuilder().Append("ww").Append(euro, 180).ToString();
var expected = BitConverter.ToString(Encoding.UTF8.GetBytes(val + '\0'));
Assert.AreEqual(expected, WriteStringAndGetHex(val));
}

[Test]
public void TestWriteString(){
public void TestWriteSingle()
{
var expected = "000000E0FFFFEF47";
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
var val = Single.MaxValue;

writer.WriteValue(BsonType.Number, val);

var hexdump = BitConverter.ToString(ms.ToArray());
hexdump = hexdump.Replace("-", "");
Assert.AreEqual(expected, hexdump);
}

[Test]
public void TestWriteString()
{
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
const string expected = "54-65-73-74-73-2E-69-6E-73-65-72-74-73-00";
Expand All @@ -124,63 +157,48 @@ public class TestBsonWriter : BsonTestBase
}

[Test]
[ExpectedException(typeof(ArgumentException), UserMessage = "Shouldn't be able to write large document")]
public void TestWritingTooLargeDocument(){
public void TestWriteSymbol()
{
var expected = "0700000073796D626F6C00";

var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
var b = new Binary(new byte[BsonInfo.MaxDocumentSize]);
var big = new Document().Add("x", b);
MongoSymbol val = "symbol";
Assert.IsTrue(String.IsInterned(val) != null);
writer.WriteValue(BsonType.Symbol, val);
var hexdump = BitConverter.ToString(ms.ToArray()).Replace("-", "");

writer.WriteObject(big);
Assert.AreEqual(expected, hexdump);
}

[Test]
public void TestWriteUtcTimeByDefault(){
public void TestWriteUtcTimeByDefault()
{
var dateTime = new DateTime(2010, 1, 1, 10, 0, 0, DateTimeKind.Utc);

var base64 = Serialize(new Document("time", dateTime));

Assert.AreEqual("EwAAAAl0aW1lAADJU+klAQAAAA==",base64);
Assert.AreEqual("EwAAAAl0aW1lAADJU+klAQAAAA==", base64);
}

[Test]
public void TestLocalDateTimeIsWrittenAsUtcTime()
[ExpectedException(typeof(ArgumentException), UserMessage = "Shouldn't be able to write large document")]
public void TestWritingTooLargeDocument()
{
var dateTime = new DateTime(2010, 1, 1, 10, 0, 0, DateTimeKind.Local);
var ms = new MemoryStream();
var writer = new BsonWriter(ms, new BsonDocumentDescriptor());
var b = new Binary(new byte[BsonInfo.MaxDocumentSize]);
var big = new Document().Add("x", b);

var base64 = Serialize(new Document("time", dateTime));
writer.WriteObject(big);
}

Assert.AreEqual("EwAAAAl0aW1lAIDaHOklAQAAAA==", base64);
}

[Test]
public void TestWriteSingle(){
string expected = "000000E0FFFFEF47";
MemoryStream ms = new MemoryStream();
BsonWriter writer = new BsonWriter(ms, new BsonDocumentDescriptor());
Single val = Single.MaxValue;

writer.WriteValue(BsonType.Number, val);

string hexdump = BitConverter.ToString(ms.ToArray());
hexdump = hexdump.Replace("-","");
Assert.AreEqual(expected, hexdump);


public void TestWriteBytesAsBinary()
{
var bson = Serialize(new Document("bytes", new byte[] {10, 12}));

Assert.AreEqual("FwAAAAVieXRlcwAGAAAAAgIAAAAKDAA=",bson);
}

[Test]
public void TestWriteSymbol(){
string expected = "0700000073796D626F6C00";

MemoryStream ms = new MemoryStream();
BsonWriter writer = new BsonWriter(ms, new BsonDocumentDescriptor());
MongoSymbol val = "symbol";
Assert.IsTrue(String.IsInterned(val) != null);
writer.WriteValue(BsonType.Symbol, val);
string hexdump = BitConverter.ToString(ms.ToArray()).Replace("-","");

Assert.AreEqual(expected, hexdump);
}
}
}

0 comments on commit 34ee4e6

Please sign in to comment.