using XFESystem.Desktop; using Xunit; namespace XFESystem.Desktop.Tests; public sealed class PresentedPixelsTests { [Fact] public void FingerprintUsesRgbRowOrderAndExcludesAlphaAndPitchPadding() { int[] pixels = [unchecked((int)0xff112233), 0x445566, 0xabcdef, unchecked((int)0xff778899), 0xaabbcc, 0x123456]; Assert.True(DesktopPresentedPixels.TryFingerprint(pixels, 2, 2, 3, new(0, 0, 2, 2), 7, out var first)); ulong expected = 14695981039346656037; foreach (byte value in new byte[] { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc }) expected = unchecked((expected ^ value) * 1099511628211); Assert.Equal(expected.ToString("x16"), first.Fingerprint); Assert.Equal(7, first.PresentationSequence); pixels[0] ^= unchecked((int)0xff000000); pixels[2] = 0; pixels[5] = 0; Assert.True(DesktopPresentedPixels.TryFingerprint(pixels, 2, 2, 3, new(0, 0, 2, 2), 8, out var second)); Assert.Equal(first.Fingerprint, second.Fingerprint); Assert.Equal(8, second.PresentationSequence); pixels[4] ^= 1; Assert.True(DesktopPresentedPixels.TryFingerprint(pixels, 2, 2, 3, new(0, 0, 2, 2), 9, out var changed)); Assert.NotEqual(first.Fingerprint, changed.Fingerprint); } [Theory] [InlineData(-1, 0, 1, 1, 1)] [InlineData(0, -1, 1, 1, 1)] [InlineData(0, 0, 0, 1, 1)] [InlineData(0, 0, 1, 0, 1)] [InlineData(1, 0, 2, 1, 1)] [InlineData(0, 0, 1, 1, 0)] [InlineData(int.MaxValue, 0, int.MaxValue, 1, 1)] public void InvalidOrUnpresentedRegionsAreRejected(int x, int y, int width, int height, long sequence) { Assert.False(DesktopPresentedPixels.TryFingerprint(new int[4], 2, 2, 2, new(x, y, width, height), sequence, out _)); } [Fact] public void MissingRowsAndExcessiveDiagnosticRegionsAreRejected() { Assert.False(DesktopPresentedPixels.TryFingerprint(new int[3], 2, 2, 2, new(0, 0, 1, 1), 1, out _)); Assert.False(DesktopPresentedPixels.TryFingerprint(new int[4], 2, 2, 1, new(0, 0, 1, 1), 1, out _)); Assert.False(DesktopPresentedPixels.TryFingerprint(new int[513 * 513], 513, 513, 513, new(0, 0, 513, 513), 1, out _)); } }