/
dev-npgsql
/
npgsql
Обзор
Документация
Войти
/
dev-npgsql
/
npgsql
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
v4.1.13
test/Npgsql.Tests/WriteBufferTests.cs
98 строк
4 KB
Christopher Moore
Account for unicode characters outside the basic multilingual plane during chunked string writes (#3734)
29 май 2021, 12:43
29 май 2021, 12:43
334b882
Код
Авторство
О чём код?
using System.IO; using Npgsql.Util; using NUnit.Framework; namespace Npgsql.Tests { class WriteBufferTests { [Test, IssueLink("https://github.com/npgsql/npgsql/issues/1275")] public void WriteZeroChars() { // Fill up the buffer entirely WriteBuffer.WriteBytes(new byte[WriteBuffer.Size], 0, WriteBuffer.Size); Assert.That(WriteBuffer.WriteSpaceLeft, Is.Zero); int charsUsed; bool completed; WriteBuffer.WriteStringChunked("hello", 0, 5, true, out charsUsed, out completed); Assert.That(charsUsed, Is.Zero); Assert.That(completed, Is.False); WriteBuffer.WriteStringChunked("hello".ToCharArray(), 0, 5, true, out charsUsed, out completed); Assert.That(charsUsed, Is.Zero); Assert.That(completed, Is.False); } [Test, IssueLink("https://github.com/npgsql/npgsql/issues/2849")] public void ChunkedStringEncodingFits() { WriteBuffer.WriteBytes(new byte[WriteBuffer.Size - 1], 0, WriteBuffer.Size - 1); Assert.That(WriteBuffer.WriteSpaceLeft, Is.EqualTo(1)); var charsUsed = 1; var completed = true; // This unicode character is three bytes when encoded in UTF8 Assert.That(() => WriteBuffer.WriteStringChunked("\uD55C", 0, 1, true, out charsUsed, out completed), Throws.Nothing); Assert.That(charsUsed, Is.EqualTo(0)); Assert.That(completed, Is.False); } [Test, IssueLink("https://github.com/npgsql/npgsql/issues/2849")] public void ChunkedByteArrayEncodingFits() { WriteBuffer.WriteBytes(new byte[WriteBuffer.Size - 1], 0, WriteBuffer.Size - 1); Assert.That(WriteBuffer.WriteSpaceLeft, Is.EqualTo(1)); var charsUsed = 1; var completed = true; // This unicode character is three bytes when encoded in UTF8 Assert.That(() => WriteBuffer.WriteStringChunked("\uD55C".ToCharArray(), 0, 1, true, out charsUsed, out completed), Throws.Nothing); Assert.That(charsUsed, Is.EqualTo(0)); Assert.That(completed, Is.False); } [Test, IssueLink("https://github.com/npgsql/npgsql/issues/3733")] public void ChunkedStringEncodingFitsWithSurrogates() { WriteBuffer.WriteBytes(new byte[WriteBuffer.Size - 1]); Assert.That(WriteBuffer.WriteSpaceLeft, Is.EqualTo(1)); var charsUsed = 1; var completed = true; var cyclone = "🌀"; Assert.That(() => WriteBuffer.WriteStringChunked(cyclone, 0, cyclone.Length, true, out charsUsed, out completed), Throws.Nothing); Assert.That(charsUsed, Is.EqualTo(0)); Assert.That(completed, Is.False); } [Test, IssueLink("https://github.com/npgsql/npgsql/issues/3733")] public void ChunkedCharArrayEncodingFitsWithSurrogates() { WriteBuffer.WriteBytes(new byte[WriteBuffer.Size - 1]); Assert.That(WriteBuffer.WriteSpaceLeft, Is.EqualTo(1)); var charsUsed = 1; var completed = true; var cyclone = "🌀"; Assert.That(() => WriteBuffer.WriteStringChunked(cyclone.ToCharArray(), 0, cyclone.Length, true, out charsUsed, out completed), Throws.Nothing); Assert.That(charsUsed, Is.EqualTo(0)); Assert.That(completed, Is.False); } #pragma warning disable CS8625 [SetUp] public void SetUp() { Underlying = new MemoryStream(); WriteBuffer = new NpgsqlWriteBuffer(null, Underlying, NpgsqlReadBuffer.DefaultSize, PGUtil.UTF8Encoding); } #pragma warning restore CS8625 // ReSharper disable once InconsistentNaming NpgsqlWriteBuffer WriteBuffer = default!; // ReSharper disable once InconsistentNaming MemoryStream Underlying = default!; } }