public void 断片化のストリームシークテスト() { var buf = GetRandam(100); var header = GetRandam(20); var last = GetRandam(20); var writer = new MessageWriter(); writer.Set(1, 16); writer.Write(buf, 0, buf.Length); Assert.AreEqual(buf.Length, writer.Position); writer.Seek(20, SeekOrigin.Current); Assert.AreEqual(buf.Length + 20, writer.Position); Assert.AreEqual(buf.Length + 20, writer.Length, "長さが拡張される"); writer.Seek(-10, SeekOrigin.Current); Assert.AreEqual(buf.Length + 20, writer.Length, "長さはそのまま"); writer.SetLength(buf.Length); Assert.AreEqual(buf.Length, writer.Length, "指定サイズになっている"); Assert.AreEqual(buf.Length, writer.Position, "短くなったので終端位置が変更される"); writer.Seek(0, SeekOrigin.Begin); Assert.AreEqual(0, writer.Position); writer.Write(header, 0, header.Length); Assert.AreEqual(header.Length, writer.Position); writer.Seek(-last.Length, SeekOrigin.End); Assert.AreEqual(buf.Length - last.Length, writer.Position, "終端位置からのシーク"); writer.Write(last, 0, last.Length); var list = new List <Fragment>(); writer.GetFragments(list); var combine = header.Concat(buf.Skip(header.Length).Take(buf.Length - header.Length - last.Length)).Concat(last); Assert.IsTrue(Equals(combine.ToArray(), list.ToBytes()), "再度結合しても問題ない"); list.TryReturn(); }
List <Fragment> GetStreamFragments(byte[] buf, short id, int size, int minWriteSize, int maxWriteSize) { var writer = new MessageWriter(); writer.Set(id, size); int offset = 0; while (offset < buf.Length) { var writeSize = minWriteSize + (int)(m_Random.NextDouble() * (maxWriteSize - minWriteSize)); if (offset + writeSize > buf.Length) { writeSize = buf.Length - offset; } writer.Write(buf, offset, writeSize); offset += writeSize; } var list = new List <Fragment>(); writer.GetFragments(list); return(list); }