8e5cebf50001 — Michael Johnson 6 months ago
Add ChaCha256-specific tests
2 files changed, 90 insertions(+), 6 deletions(-)

A => src/Tests/Rngs/ChaCha256Tests.cs
M src/Tests/Vec128HwAccelRequiredFact.cs => src/Tests/Vec256HwAccelRequiredFact.cs
A => src/Tests/Rngs/ChaCha256Tests.cs +84 -0
@@ 0,0 1,84 @@ 
+#if X86_INTRINSICS
+using System;
+using Xunit;
+
+namespace RandN.Rngs
+{
+    public sealed class ChaChaVec256Tests
+    {
+        [Vec256HwAccelRequiredFact]
+        public void Regenerate20()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, 0, 0, 10);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            rng.Regenerate(buffer);
+            Assert.Equal(137206642u, buffer[0]);
+            Assert.Equal(0ul, rng.Stream);
+        }
+
+        [Vec256HwAccelRequiredFact]
+        public void Generate20()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, UInt64.MaxValue, 0, 10);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            rng.Generate(buffer);
+            Assert.Equal(137206642u, buffer[0]);
+            Assert.Equal(0ul, rng.Stream);
+        }
+
+        [Vec256HwAccelRequiredFact]
+        public void Regenerate12()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, 0, 0, 6);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            rng.Regenerate(buffer);
+            Assert.Equal(1488489079u, buffer[0]);
+            Assert.Equal(0ul, rng.Stream);
+        }
+
+        [Vec256HwAccelRequiredFact]
+        public void Generate12()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, UInt64.MaxValue, 0, 6);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            rng.Generate(buffer);
+            Assert.Equal(1488489079u, buffer[0]);
+            Assert.Equal(0ul, rng.Stream);
+        }
+
+        [Vec256HwAccelRequiredFact]
+        public void Regenerate8()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, 0, 0, 4);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            rng.Regenerate(buffer);
+            Assert.Equal(3680296248u, buffer[0]);
+            Assert.Equal(0ul, rng.Stream);
+        }
+
+        [Vec256HwAccelRequiredFact]
+        public void Generate8()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, UInt64.MaxValue, 0, 4);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            rng.Generate(buffer);
+            Assert.Equal(3680296248u, buffer[0]);
+            Assert.Equal(0ul, rng.Stream);
+        }
+
+        [Vec256HwAccelRequiredFact]
+        public void StreamModification()
+        {
+            var rng = ChaChaVec256.Create(new UInt32[] { 0, 0, 1, 0, 2, 0, 3, 0 }, 0, 0, 4);
+            Span<UInt32> buffer = stackalloc UInt32[64];
+            Span<UInt32> buffer2 = stackalloc UInt32[64];
+            rng.Regenerate(buffer);
+            rng.Stream = 1ul;
+            rng.Regenerate(buffer2);
+
+            for (Int32 i = 0; i < buffer.Length; i++)
+                Assert.NotEqual(buffer[i], buffer2[i]);
+        }
+    }
+}
+#endif

          
M src/Tests/Vec128HwAccelRequiredFact.cs => src/Tests/Vec256HwAccelRequiredFact.cs +6 -6
@@ 3,16 3,16 @@ using Xunit;
 
 namespace RandN;
 
-public sealed class Vec128HwAccelRequiredFact : FactAttribute
+public sealed class Vec256HwAccelRequiredFact : FactAttribute
 {
-    public Vec128HwAccelRequiredFact()
+    public Vec256HwAccelRequiredFact()
     {
 #if NET7_0_OR_GREATER
-            if (!System.Runtime.Intrinsics.Vector128.IsHardwareAccelerated)
-                Skip = "Vector128 is not hardware accelerated";
+            if (!System.Runtime.Intrinsics.Vector256.IsHardwareAccelerated)
+                Skip = "Vector256 is not hardware accelerated";
 #elif X86_INTRINSICS
-            if (!System.Runtime.Intrinsics.X86.Sse2.IsSupported)
-                Skip = "Vector128 is not hardware accelerated";
+            if (!System.Runtime.Intrinsics.X86.Avx2.IsSupported)
+                Skip = "Vector256 is not hardware accelerated";
 #endif
     }