Initial commit

This commit is contained in:
zavolo
2026-06-05 00:53:35 +03:00
commit e59e4424a4
7686 changed files with 352420 additions and 0 deletions
@@ -0,0 +1,59 @@
using System.Buffers;
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class BitArraySerializerTests
{
[Fact]
public void SerializeTest()
{
var value = new BitArray(32) { [0] = true };
var expectedValue = "01000000".ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(value, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedValue);
}
[MemberData(nameof(GetData), parameters: new[] { 0 })]
[MemberData(nameof(GetData), parameters: new[] { 1 })]
[MemberData(nameof(GetData), parameters: new[] { 2 })]
[MemberData(nameof(GetData), parameters: new[] { 31 })]
[MemberData(nameof(GetData), parameters: new[] { 1, 2 })]
[MemberData(nameof(GetData), parameters: new[] { 1, 2, 3 })]
[MemberData(nameof(GetData), parameters: new[] { 1, 2, 31 })]
[Theory]
public void DeserializeTest(byte[] value, BitArray expectedValue)
{
//var stream = new MemoryStream(value);
//var br = new BinaryReader(stream);
var serializer = CreateSerializer();
ReadOnlyMemory<byte> buffer = value;
var actualValue = serializer.Deserialize(ref buffer);
actualValue.ShouldBeEquivalentTo(expectedValue);
}
public static IEnumerable<object[]> GetData(params int[] bitOfNSetToTrue)
{
var bitArray = new BitArray(32);
foreach (var i in bitOfNSetToTrue)
{
bitArray.Set(i, true);
}
var buffer = new byte[4];
bitArray.CopyTo(buffer, 0);
var allData = new List<object[]> { new object[] { buffer, bitArray } };
return allData;
}
private BitArraySerializer CreateSerializer() => new();
}
@@ -0,0 +1,61 @@
using System.Buffers;
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class BooleanSerializerTests
{
[Fact]
public void Deserialize_ErrorData_Throws_Argument_Exception()
{
var value = new byte[] { 1, 2, 3, 4 };
//var br = new BinaryReader(new MemoryStream(value));
//var buffer = new ReadOnlySequence<byte>(value);
ReadOnlyMemory<byte> buffer = value;
var serializer = CreateSerializer();
//Assert.Throws<ArgumentException>(() => serializer.Deserialize(ref reader));
Assert.Throws<ArgumentException>(() =>
{
//var reader = new SequenceReader<byte>(new ReadOnlySequence<byte>(value));
//serializer.Deserialize(ref reader);
serializer.Deserialize(ref buffer);
});
}
[InlineData(new byte[] { 55, 151, 121, 188 }, false)]
[InlineData(new byte[] { 181, 117, 114, 153 }, true)]
[Theory]
public void DeserializeTest(byte[] value,
bool expectedValue)
{
//var stream = new MemoryStream(value);
//var br = new BinaryReader(stream);
var serializer = CreateSerializer();
//var reader = new SequenceReader<byte>(new ReadOnlySequence<byte>(value));
ReadOnlyMemory<byte> buffer = value;
var actualValue = serializer.Deserialize(ref buffer);
actualValue.ShouldBe(expectedValue);
}
[InlineData(false, new byte[] { 55, 151, 121, 188 })]
[InlineData(true, new byte[] { 181, 117, 114, 153 })]
[Theory]
public void SerializeTest(bool value,
byte[] expectedValue)
{
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(value, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedValue);
}
private BooleanSerializer CreateSerializer() => new();
}
@@ -0,0 +1,86 @@
// ReSharper disable StringLiteralTypo
using System.Buffers;
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class BytesSerializerTests
{
[MemberData(nameof(GetSerializeTestDataLengthLessThan254))]
[MemberData(nameof(GetSerializeTestDataLengthGreaterThan253))]
[Theory]
public void Serialize_Data_Test(string inputBytesData, string expectedBytesData)
{
// Arrange
var dataBytes = inputBytesData.ToBytes();
var expectedBytes = expectedBytesData.ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
// Act
serializer.Serialize(dataBytes, writer);
// Assert
var serializedBytes = writer.WrittenSpan.ToArray();
serializedBytes.ShouldBeEquivalentTo(expectedBytes);
}
[MemberData(nameof(GetSerializeTestDataLengthLessThan254))]
[MemberData(nameof(GetSerializeTestDataLengthGreaterThan253))]
[Theory]
public void Deserialize_Data_Test(string expectedBytesData, string inputBytesData)
{
// Arrange
var expectedBytes = expectedBytesData.ToBytes();
var inputBytes = inputBytesData.ToBytes();
//var br = new BinaryReader(new MemoryStream(inputBytes));
//var buffer = new ReadOnlySequence<byte>(inputBytes);
var serializer = CreateSerializer();
//var reader = new SequenceReader<byte>(new ReadOnlySequence<byte>(inputBytes));
ReadOnlyMemory<byte> buffer = inputBytes;
// Act
var actualData = serializer.Deserialize(ref buffer);
// Assert
actualData.ShouldBeEquivalentTo(expectedBytes);
}
public static IEnumerable<object[]> GetSerializeTestDataLengthLessThan254()
{
// 1
yield return new object[] { "8A", "018A0000" };
// 3
yield return new object[] { "B05EDE", "03B05EDE" };
// 253
yield return new object[]
{
"2586A2E2FA26A0CAED85146EC93A1EEE417A45165C0909097B39A7D8FEDB6D4BCCEEC3C74F4054732CEA1EB8C355E259C8A54A19C02C5040A6F61A7881D688A7D69CD8F89281588CD3B7097EAEBA11B757A871442614CE093D1B43CE571951C9AF7DA7AA32BF0D2C4755E7092E9563CA379FCB4C5736B67070F67CDD8D18166FF2C134603518DDBD890CE2294C698E8A1B45FAB17882EB0141863E45583DC4CE09D005F2C0897DDBC026CD12CDCF42F02C4F652AE882237DA65B03EB35317E5E6D58B3E1E00C5CF10C7EE6E5B4768900F761B831C8B6B21E10EE96B0DC05C4B94A21B1D2F877D71C7DEDD6A467A92FA856B58FFF05A45573CF2E67DF78",
"FD2586A2E2FA26A0CAED85146EC93A1EEE417A45165C0909097B39A7D8FEDB6D4BCCEEC3C74F4054732CEA1EB8C355E259C8A54A19C02C5040A6F61A7881D688A7D69CD8F89281588CD3B7097EAEBA11B757A871442614CE093D1B43CE571951C9AF7DA7AA32BF0D2C4755E7092E9563CA379FCB4C5736B67070F67CDD8D18166FF2C134603518DDBD890CE2294C698E8A1B45FAB17882EB0141863E45583DC4CE09D005F2C0897DDBC026CD12CDCF42F02C4F652AE882237DA65B03EB35317E5E6D58B3E1E00C5CF10C7EE6E5B4768900F761B831C8B6B21E10EE96B0DC05C4B94A21B1D2F877D71C7DEDD6A467A92FA856B58FFF05A45573CF2E67DF780000"
};
}
public static IEnumerable<object[]> GetSerializeTestDataLengthGreaterThan253()
{
// 254
yield return new object[]
{
"E3015AEB327305D451B5BFFEAA5E1AEB15DE811373FC0B159D333DB5439715FD19570BCB43C6F3E31D2FF6B501817F67479BCADE30F395B86FDF73ACC354A1D90C2F592FD88CB83337F7D2D249775A2FE4B3EF169AAD2ABD7405940CEFCE9BC025E02FE81F4437C2606E2AD2CF807E334F954671302CD53C47EB8462E44AD73F9FDB3095827542DD6060F3EF2E1472A3B11F0857CBE65B3839C3AD95DE71F0625A6CBDE94B8F3CD1F28993DE72BB9F089C6E30968CB3E365F0AE2D35490AD958C04DE9FF433C5C710D44DF7710C5A5B9A96A113659933B7212BC6BB2715FD7B080E2E01E7583AF6A99967A0E559E74363ACAEE7A94D1A601CF0DAD4B6DC5",
"FEFE0000E3015AEB327305D451B5BFFEAA5E1AEB15DE811373FC0B159D333DB5439715FD19570BCB43C6F3E31D2FF6B501817F67479BCADE30F395B86FDF73ACC354A1D90C2F592FD88CB83337F7D2D249775A2FE4B3EF169AAD2ABD7405940CEFCE9BC025E02FE81F4437C2606E2AD2CF807E334F954671302CD53C47EB8462E44AD73F9FDB3095827542DD6060F3EF2E1472A3B11F0857CBE65B3839C3AD95DE71F0625A6CBDE94B8F3CD1F28993DE72BB9F089C6E30968CB3E365F0AE2D35490AD958C04DE9FF433C5C710D44DF7710C5A5B9A96A113659933B7212BC6BB2715FD7B080E2E01E7583AF6A99967A0E559E74363ACAEE7A94D1A601CF0DAD4B6DC50000"
};
// 512
yield return new object[]
{
"1CBB65F9B0CA8EB14FB956E0A7C3285B7A4FCCEACD3E6A12FB231ACC6F53C8ACDE096C2D6619F4DC44DF78EA1C22D0C97B42B3913BAFB20611CB092D8DDE854A91F47CB0C21F61813430469E7C3DCBDC2520494D690A0356965E49351917C4127B3BF76B0531510BD684158565B9CFCD08C51DC9F8A4650EE8B7637ED67CC2E1641713B6D111539902991E81F83B35950302EAC773F1FAC6DE8FA9448A4B40554DD4FDDDB969AC9706AB51CE84C562826C2695A977C20C09874C5264548234F658A83CD59C2870E9AF31423C782368E91852E0AA3F7A73C512017DEAB1D4443E46B61CE5FB9D2ADD800771C7D879C0E457319ACA3D12A1A8737094B079D901C8DCB7BC69428D3502532867CE086788667888D91ADEBCC59342D32ACD76E42D9663260D2069C13DEF4FF35F592287A7B7ECF7A630FC2DF995F736D658C779A4DF255F1BD8629BF427B329A3BBD0AFC2359B5ABD9CACA622723B1990B469DDFAF09D809D28260E5F75035B3EEAB9D1010E4F82E6FF77617C2A48B8E61F47BF264B36E4E4ED7C87F97661395B64DEF2A68C6A980F3EDB930D5B1487E131198B7481D2245C94D938A85A7233EFCA6F30958F147C0C400CA4BB4E6785CAF6581C9C067D2784A7A33EC34C1A52AF1031EB23AA57EBACCC57731466C04759968CA8412FEB11344B1BD377D41A7DEABE8D19DBA4ADF556D99A6095AB49F968CC890066C3",
"FE0002001CBB65F9B0CA8EB14FB956E0A7C3285B7A4FCCEACD3E6A12FB231ACC6F53C8ACDE096C2D6619F4DC44DF78EA1C22D0C97B42B3913BAFB20611CB092D8DDE854A91F47CB0C21F61813430469E7C3DCBDC2520494D690A0356965E49351917C4127B3BF76B0531510BD684158565B9CFCD08C51DC9F8A4650EE8B7637ED67CC2E1641713B6D111539902991E81F83B35950302EAC773F1FAC6DE8FA9448A4B40554DD4FDDDB969AC9706AB51CE84C562826C2695A977C20C09874C5264548234F658A83CD59C2870E9AF31423C782368E91852E0AA3F7A73C512017DEAB1D4443E46B61CE5FB9D2ADD800771C7D879C0E457319ACA3D12A1A8737094B079D901C8DCB7BC69428D3502532867CE086788667888D91ADEBCC59342D32ACD76E42D9663260D2069C13DEF4FF35F592287A7B7ECF7A630FC2DF995F736D658C779A4DF255F1BD8629BF427B329A3BBD0AFC2359B5ABD9CACA622723B1990B469DDFAF09D809D28260E5F75035B3EEAB9D1010E4F82E6FF77617C2A48B8E61F47BF264B36E4E4ED7C87F97661395B64DEF2A68C6A980F3EDB930D5B1487E131198B7481D2245C94D938A85A7233EFCA6F30958F147C0C400CA4BB4E6785CAF6581C9C067D2784A7A33EC34C1A52AF1031EB23AA57EBACCC57731466C04759968CA8412FEB11344B1BD377D41A7DEABE8D19DBA4ADF556D99A6095AB49F968CC890066C3"
};
}
private BytesSerializer CreateSerializer() => new();
}
@@ -0,0 +1,44 @@
using System.Buffers;
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class DoubleSerializerTests
{
[InlineData(1.2345d)]
[InlineData(-1.2345d)]
[InlineData(10000.2345d)]
[Theory]
public void SerializeTest(double a)
{
var bytes = BitConverter.GetBytes(a);
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(a, writer);
var actualBytes = writer.WrittenSpan.ToArray();
actualBytes.ShouldBeEquivalentTo(bytes);
}
[InlineData("8D976E1283C0F33F", 1.2345d)]
[InlineData("8D976E1283C0F3BF", -1.2345d)]
[InlineData("759318041E88C340", 10000.2345d)]
[Theory]
public void DeserializeTest(string data, double expectedValue)
{
var dataBytes = data.ToBytes();
//var br = new BinaryReader(new MemoryStream(dataBytes));
var serializer = CreateSerializer();
ReadOnlyMemory<byte> buffer = dataBytes;
var actualValue = serializer.Deserialize(ref buffer);
actualValue.ShouldBe(expectedValue);
}
private DoubleSerializer CreateSerializer() => new();
}
@@ -0,0 +1,30 @@
namespace MyTelegram.Schema.Serializer;
public static class Extensions
{
public static byte[] ToBytes(this string hex)
{
return HexToBytes(hex);
}
//public static string ToHexString(this MemoryStream memoryStream) => memoryStream.ToArray().ToHexString();
public static string ToHexString(this byte[] bytes) => BitConverter.ToString(bytes).Replace("-", string.Empty);
private static byte[] HexToBytes(string hex)
{
var text = hex.Replace(" ", string.Empty)
.Replace("\r\n", string.Empty)
.Replace("\n", string.Empty)
.Replace("-", string.Empty)
;
return StringToByteArray(text);
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
}
@@ -0,0 +1,37 @@
using System.Buffers;
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class Int128SerializerTests
{
[Fact]
public void SerializeTest()
{
var value = "C0CC11F66E1111B8529BB89742D77959".ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(value, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(value);
}
[Fact]
public void DeserializeTest()
{
var expectedBytes = "C0CC11F66E1111B8529BB89742D77959".ToBytes();
//var stream = new MemoryStream(expectedBytes);
//var br = new BinaryReader(stream);
var serializer = CreateSerializer();
//var reader = new SequenceReader<byte>(new ReadOnlySequence<byte>(expectedBytes));
ReadOnlyMemory<byte> buffer = expectedBytes;
var actualBytes = serializer.Deserialize(ref buffer);
actualBytes.ShouldBeEquivalentTo(expectedBytes);
}
private Int128Serializer CreateSerializer() => new();
}
@@ -0,0 +1,39 @@
using System.Buffers;
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class Int256SerializerTests
{
[Fact]
public void DeserializeTest()
{
var expectedBytes = "6B5DB1FB13049F1CBC9FE635C66786F220BF979222CF064F1A59DD0C23971293".ToBytes();
//var stream = new MemoryStream(expectedBytes);
//var br = new BinaryReader(stream);
ReadOnlyMemory<byte> buffer = expectedBytes;
var serializer = CreateSerializer();
var actualBytes = serializer.Deserialize(ref buffer);
actualBytes.ShouldBeEquivalentTo(expectedBytes);
}
[Fact]
public void SerializeTest()
{
var expectedBytes = "6B5DB1FB13049F1CBC9FE635C66786F220BF979222CF064F1A59DD0C23971293".ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(expectedBytes, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedBytes);
}
private Int256Serializer CreateSerializer() => new();
}
@@ -0,0 +1,33 @@
namespace MyTelegram.Schema.Serializer;
public class Int32SerializerTests
{
[Fact]
public void SerializeTest()
{
var expectedValue = new byte[] { 01, 0, 0, 0 };
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(1, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedValue);
}
[Fact]
public void DeserializeTest()
{
var value = new byte[] { 01, 0, 0, 0 };
var expectedValue = 1;
ReadOnlyMemory<byte> buffer = value;
var serializer = CreateSerializer();
var actualValue = serializer.Deserialize(ref buffer);
actualValue.ShouldBeEquivalentTo(expectedValue);
}
private Int32Serializer CreateSerializer() => new();
}
@@ -0,0 +1,32 @@
namespace MyTelegram.Schema.Serializer;
public class Int64SerializerTests
{
[Fact]
public void SerializeTest()
{
var expectedBytes = "6300000000000000".ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(99L, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedBytes);
}
[Fact]
public void DeserializeTest()
{
var expectedBytes = "6300000000000000".ToBytes();
ReadOnlyMemory<byte> buffer = expectedBytes;
var serializer = CreateSerializer();
var actualBytes = serializer.Deserialize(ref buffer);
actualBytes.ShouldBeEquivalentTo(99L);
}
private Int64Serializer CreateSerializer() => new();
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,43 @@
// ReSharper disable StringLiteralTypo
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
public class StringSerializerTests
{
[Fact]
public void SerializeTest()
{
var value = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+<>?:{}[],./;'";
var expectedValue =
"576162636465666768696A6B6C6D6E6F707172737475767778797A4142434445464748494A4B4C4D4E4F505152535455565758595A3132333435363738393021402324255E262A28295F2B3C3E3F3A7B7D5B5D2C2E2F3B27"
.ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(value, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedValue);
}
[Fact]
public void DeserializeTest()
{
var expectedValue = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+<>?:{}[],./;'";
var value =
"576162636465666768696A6B6C6D6E6F707172737475767778797A4142434445464748494A4B4C4D4E4F505152535455565758595A3132333435363738393021402324255E262A28295F2B3C3E3F3A7B7D5B5D2C2E2F3B27"
.ToBytes();
//var stream = new MemoryStream(value);
//var br = new BinaryReader(stream);
ReadOnlyMemory<byte> buffer = value;
var serializer = CreateSerializer();
var actualValue = serializer.Deserialize(ref buffer);
actualValue.ShouldBeEquivalentTo(expectedValue);
}
private StringSerializer CreateSerializer() => new();
}
@@ -0,0 +1,47 @@
using MyTelegram.Schema.Extensions;
namespace MyTelegram.Schema.Serializer;
//public abstract class SerializeTestBase
//{
// protected void SerializeTest<TData>(TData t, byte[] expectedValue)
// {
// }
//}
public class UInt32SerializerTests
{
[Fact]
public void SerializeTest()
{
var expectedBytes = "09000080".ToBytes();
//var stream = new MemoryStream();
//var bw = new BinaryWriter(stream);
var value = int.MaxValue + 10u;
using var writer = new ArrayPoolBufferWriter<byte>();
var serializer = CreateSerializer();
serializer.Serialize(value, writer);
writer.WrittenSpan.ToArray().ShouldBeEquivalentTo(expectedBytes);
}
[Fact]
public void DeserializeTest()
{
var expectedBytes = "09000080".ToBytes();
//var stream = new MemoryStream(expectedBytes);
//var br = new BinaryReader(stream);
//var buffer = new ReadOnlySequence<byte>(expectedBytes);
var expectedValue = int.MaxValue + 10u;
var serializer = CreateSerializer();
ReadOnlyMemory<byte> buffer = expectedBytes;
var actualBytes = serializer.Deserialize(ref buffer);
actualBytes.ShouldBeEquivalentTo(expectedValue);
}
private UInt32Serializer CreateSerializer() => new();
}