Skip to content

Commit aa895a4

Browse files
committed
Added unit tests for StringMemoryManager<TTo>
1 parent 46c0273 commit aa895a4

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

Microsoft.Toolkit.HighPerformance/Extensions/ReadOnlyMemoryExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public static ReadOnlyMemory<TTo> Cast<TFrom, TTo>(this ReadOnlyMemory<TFrom> me
8181
return new ProxyMemoryManager<TFrom, TTo>(memoryManager, start, length).Memory;
8282
}
8383

84-
// Throws when the memory instance has an unsupported backing store (eg. a string)
84+
// Throws when the memory instance has an unsupported backing store
8585
static ReadOnlyMemory<TTo> ThrowArgumentExceptionForUnsupportedMemory()
8686
{
8787
throw new ArgumentException("The input instance doesn't have a supported underlying data store.");

UnitTests/UnitTests.HighPerformance.Shared/Extensions/Test_MemoryExtensions.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,66 @@ public unsafe void Test_MemoryExtensions_FromMemoryManager_CastFromByte_Pin(int
447447
Assert.IsTrue(p1 == p2);
448448
}
449449

450+
[TestCategory("MemoryExtensions")]
451+
[TestMethod]
452+
public void Test_MemoryExtensions_FromString_CastFromByteAndBack()
453+
{
454+
var data = new string('a', 128);
455+
Memory<char> memoryOfChars = MemoryMarshal.AsMemory(data.AsMemory());
456+
Memory<float> memoryOfFloats = memoryOfChars.Cast<char, float>();
457+
Memory<char> memoryBack = memoryOfFloats.Cast<float, char>();
458+
459+
Assert.AreEqual(memoryOfChars.Length, memoryBack.Length);
460+
461+
Assert.IsTrue(MemoryMarshal.TryGetString(memoryOfChars, out var text, out int start, out int length));
462+
Assert.AreSame(text!, data);
463+
Assert.AreEqual(start, 0);
464+
Assert.AreEqual(length, data.Length);
465+
466+
Assert.IsTrue(memoryOfChars.Equals(memoryBack));
467+
468+
Span<char> span1 = memoryOfChars.Span;
469+
Span<char> span2 = memoryBack.Span;
470+
471+
Assert.IsTrue(span1 == span2);
472+
}
473+
474+
[TestCategory("MemoryExtensions")]
475+
[TestMethod]
476+
[DataRow(64, 0, 0)]
477+
[DataRow(64, 4, 0)]
478+
[DataRow(64, 0, 4)]
479+
[DataRow(64, 4, 4)]
480+
[DataRow(64, 4, 0)]
481+
[DataRow(256, 16, 0)]
482+
[DataRow(256, 4, 16)]
483+
[DataRow(256, 64, 0)]
484+
[DataRow(256, 64, 8)]
485+
public unsafe void Test_MemoryExtensions_FromString_CastAndPin(int size, int preOffset, int postOffset)
486+
{
487+
var data = new string('a', size);
488+
Memory<char> memoryOfChars = MemoryMarshal.AsMemory(data.AsMemory()).Slice(preOffset);
489+
Memory<byte> memoryOfBytes = memoryOfChars.Cast<char, byte>().Slice(postOffset);
490+
491+
using (var handle1 = memoryOfBytes.Pin())
492+
{
493+
void* p1 = handle1.Pointer;
494+
void* p2 = Unsafe.AsPointer(ref data.DangerousGetReferenceAt(preOffset + (postOffset * sizeof(byte) / sizeof(char))));
495+
496+
Assert.IsTrue(p1 == p2);
497+
}
498+
499+
Memory<int> memoryOfInts = memoryOfChars.Cast<char, int>().Slice(postOffset);
500+
501+
using (var handle2 = memoryOfInts.Pin())
502+
{
503+
void* p3 = handle2.Pointer;
504+
void* p4 = Unsafe.AsPointer(ref data.DangerousGetReferenceAt(preOffset + (postOffset * sizeof(int) / sizeof(char))));
505+
506+
Assert.IsTrue(p3 == p4);
507+
}
508+
}
509+
450510
[TestCategory("MemoryExtensions")]
451511
[TestMethod]
452512
public void Test_MemoryExtensions_EmptyMemoryStream()

0 commit comments

Comments
 (0)