aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2013-09-21 13:51:04 -0500
committerrogerk <devnull@localhost>2013-09-21 13:51:04 -0500
commitd63096d1b20d298d46c1ba217f45eda727d1c5fe (patch)
tree8357005b84aef94ca45679997a5d86de843b9799
parent9cdc9f2c741b9d35176cb6606ae3d5e355ebb7d6 (diff)
downloadprotobuf-d63096d1b20d298d46c1ba217f45eda727d1c5fe.tar.gz
protobuf-d63096d1b20d298d46c1ba217f45eda727d1c5fe.tar.bz2
protobuf-d63096d1b20d298d46c1ba217f45eda727d1c5fe.zip
Corrected code formatting and added TestCodedInputOutputPosition
-rw-r--r--src/ProtocolBuffers.Test/CodedOutputStreamTest.cs101
-rw-r--r--src/ProtocolBuffers/CodedInputStream.cs2
-rw-r--r--src/ProtocolBuffers/CodedOutputStream.cs2
3 files changed, 105 insertions, 0 deletions
diff --git a/src/ProtocolBuffers.Test/CodedOutputStreamTest.cs b/src/ProtocolBuffers.Test/CodedOutputStreamTest.cs
index 172c14bd..8e4e9090 100644
--- a/src/ProtocolBuffers.Test/CodedOutputStreamTest.cs
+++ b/src/ProtocolBuffers.Test/CodedOutputStreamTest.cs
@@ -367,5 +367,106 @@ namespace Google.ProtocolBuffers
for (int i = 0; i > -6; i--)
Assert.AreEqual(i, values[Math.Abs(i)]);
}
+
+ [TestMethod]
+ public void TestCodedInputOutputPosition()
+ {
+ byte[] content = new byte[110];
+ for (int i = 0; i < content.Length; i++)
+ content[i] = (byte)i;
+
+ byte[] child = new byte[120];
+ {
+ MemoryStream ms = new MemoryStream(child);
+ CodedOutputStream cout = CodedOutputStream.CreateInstance(ms, 20);
+ // Field 11: numeric value: 500
+ cout.WriteTag(11, WireFormat.WireType.Varint);
+ Assert.AreEqual(1, cout.Position);
+ cout.WriteInt32NoTag(500);
+ Assert.AreEqual(3, cout.Position);
+ //Field 12: length delimited 120 bytes
+ cout.WriteTag(12, WireFormat.WireType.LengthDelimited);
+ Assert.AreEqual(4, cout.Position);
+ cout.WriteBytesNoTag(ByteString.CopyFrom(content));
+ Assert.AreEqual(115, cout.Position);
+ // Field 13: fixed numeric value: 501
+ cout.WriteTag(13, WireFormat.WireType.Fixed32);
+ Assert.AreEqual(116, cout.Position);
+ cout.WriteSFixed32NoTag(501);
+ Assert.AreEqual(120, cout.Position);
+ cout.Flush();
+ }
+
+ byte[] bytes = new byte[130];
+ {
+ CodedOutputStream cout = CodedOutputStream.CreateInstance(bytes);
+ // Field 1: numeric value: 500
+ cout.WriteTag(1, WireFormat.WireType.Varint);
+ Assert.AreEqual(1, cout.Position);
+ cout.WriteInt32NoTag(500);
+ Assert.AreEqual(3, cout.Position);
+ //Field 2: length delimited 120 bytes
+ cout.WriteTag(2, WireFormat.WireType.LengthDelimited);
+ Assert.AreEqual(4, cout.Position);
+ cout.WriteBytesNoTag(ByteString.CopyFrom(child));
+ Assert.AreEqual(125, cout.Position);
+ // Field 3: fixed numeric value: 500
+ cout.WriteTag(3, WireFormat.WireType.Fixed32);
+ Assert.AreEqual(126, cout.Position);
+ cout.WriteSFixed32NoTag(501);
+ Assert.AreEqual(130, cout.Position);
+ cout.Flush();
+ }
+ //Now test Input stream:
+ {
+ CodedInputStream cin = CodedInputStream.CreateInstance(new MemoryStream(bytes), new byte[50]);
+ uint tag;
+ int intValue = 0;
+ string ignore;
+ Assert.AreEqual(0, cin.Position);
+ // Field 1:
+ Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 1);
+ Assert.AreEqual(1, cin.Position);
+ Assert.IsTrue(cin.ReadInt32(ref intValue) && intValue == 500);
+ Assert.AreEqual(3, cin.Position);
+ //Field 2:
+ Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 2);
+ Assert.AreEqual(4, cin.Position);
+ uint childlen = cin.ReadRawVarint32();
+ Assert.AreEqual(120u, childlen);
+ Assert.AreEqual(5, cin.Position);
+ int oldlimit = cin.PushLimit((int)childlen);
+ Assert.AreEqual(5, cin.Position);
+ // Now we are reading child message
+ {
+ // Field 11: numeric value: 500
+ Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 11);
+ Assert.AreEqual(6, cin.Position);
+ Assert.IsTrue(cin.ReadInt32(ref intValue) && intValue == 500);
+ Assert.AreEqual(8, cin.Position);
+ //Field 12: length delimited 120 bytes
+ Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 12);
+ Assert.AreEqual(9, cin.Position);
+ ByteString bstr = null;
+ Assert.IsTrue(cin.ReadBytes(ref bstr) && bstr.Length == 110 && bstr.ToByteArray()[109] == 109);
+ Assert.AreEqual(120, cin.Position);
+ // Field 13: fixed numeric value: 501
+ Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 13);
+ // ROK - Previously broken here, this returned 126 failing to account for bufferSizeAfterLimit
+ Assert.AreEqual(121, cin.Position);
+ Assert.IsTrue(cin.ReadSFixed32(ref intValue) && intValue == 501);
+ Assert.AreEqual(125, cin.Position);
+ Assert.IsTrue(cin.IsAtEnd);
+ }
+ cin.PopLimit(oldlimit);
+ Assert.AreEqual(125, cin.Position);
+ // Field 3: fixed numeric value: 501
+ Assert.IsTrue(cin.ReadTag(out tag, out ignore) && tag >> 3 == 3);
+ Assert.AreEqual(126, cin.Position);
+ Assert.IsTrue(cin.ReadSFixed32(ref intValue) && intValue == 501);
+ Assert.AreEqual(130, cin.Position);
+ Assert.IsTrue(cin.IsAtEnd);
+ }
+ }
}
} \ No newline at end of file
diff --git a/src/ProtocolBuffers/CodedInputStream.cs b/src/ProtocolBuffers/CodedInputStream.cs
index a63ce174..293b735a 100644
--- a/src/ProtocolBuffers/CodedInputStream.cs
+++ b/src/ProtocolBuffers/CodedInputStream.cs
@@ -166,7 +166,9 @@ namespace Google.ProtocolBuffers
get
{
if (input != null)
+ {
return input.Position - ((bufferSize + bufferSizeAfterLimit) - bufferPos);
+ }
return bufferPos;
}
}
diff --git a/src/ProtocolBuffers/CodedOutputStream.cs b/src/ProtocolBuffers/CodedOutputStream.cs
index 9688d5cb..d267b75e 100644
--- a/src/ProtocolBuffers/CodedOutputStream.cs
+++ b/src/ProtocolBuffers/CodedOutputStream.cs
@@ -134,7 +134,9 @@ namespace Google.ProtocolBuffers
get
{
if (output != null)
+ {
return output.Position + position;
+ }
return position;
}
}