Skip to content

Commit

Permalink
Corrected code formatting and added TestCodedInputOutputPosition
Browse files Browse the repository at this point in the history
  • Loading branch information
csharptest authored and rogerk committed Sep 21, 2013
1 parent 9cdc9f2 commit d63096d
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 0 deletions.
101 changes: 101 additions & 0 deletions src/ProtocolBuffers.Test/CodedOutputStreamTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -367,5 367,106 @@ public void TestNegativeEnumArray()
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);
}
}
}
}
2 changes: 2 additions & 0 deletions src/ProtocolBuffers/CodedInputStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 166,9 @@ public long Position
get
{
if (input != null)
{
return input.Position - ((bufferSize bufferSizeAfterLimit) - bufferPos);
}
return bufferPos;
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/ProtocolBuffers/CodedOutputStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 134,9 @@ public long Position
get
{
if (output != null)
{
return output.Position position;
}
return position;
}
}
Expand Down

0 comments on commit d63096d

Please sign in to comment.