using AcDream.Core.Textures; using DatReaderWriter.DBObjs; using DatReaderWriter.Enums; namespace AcDream.Core.Tests.Textures; public class SurfaceDecoderTests { [Fact] public void Decode_A8R8G8B8_ConvertsToRgba8() { // Source format is B, G, R, A in memory (little-endian ARGB). // One 2x2 image: red, green, blue, white pixels. var src = new byte[] { 0x00, 0x00, 0xFF, 0xFF, // red (B=0, G=0, R=255, A=255) 0x00, 0xFF, 0x00, 0xFF, // green 0xFF, 0x00, 0x00, 0xFF, // blue 0xFF, 0xFF, 0xFF, 0xFF, // white }; var rs = new RenderSurface { Width = 2, Height = 2, Format = PixelFormat.PFID_A8R8G8B8, SourceData = src, }; var decoded = SurfaceDecoder.DecodeRenderSurface(rs); Assert.Equal(2, decoded.Width); Assert.Equal(2, decoded.Height); Assert.Equal(16, decoded.Rgba8.Length); // 2*2*4 // red pixel, in RGBA: 255, 0, 0, 255 Assert.Equal(0xFF, decoded.Rgba8[0]); Assert.Equal(0x00, decoded.Rgba8[1]); Assert.Equal(0x00, decoded.Rgba8[2]); Assert.Equal(0xFF, decoded.Rgba8[3]); } [Fact] public void Decode_UnsupportedFormat_ReturnsMagenta() { var rs = new RenderSurface { Width = 4, Height = 4, Format = PixelFormat.PFID_INDEX16, // not implemented path SourceData = new byte[32], }; var decoded = SurfaceDecoder.DecodeRenderSurface(rs); Assert.Same(DecodedTexture.Magenta, decoded); } [Fact] public void Decode_NullSourceData_ReturnsMagenta() { var rs = new RenderSurface { Width = 4, Height = 4, Format = PixelFormat.PFID_A8R8G8B8, SourceData = null!, }; var decoded = SurfaceDecoder.DecodeRenderSurface(rs); Assert.Same(DecodedTexture.Magenta, decoded); } [Fact] public void Decode_TruncatedA8R8G8B8_ReturnsMagenta() { // Buffer too small for width*height*4. var rs = new RenderSurface { Width = 2, Height = 2, Format = PixelFormat.PFID_A8R8G8B8, SourceData = new byte[8], // should be 16 }; var decoded = SurfaceDecoder.DecodeRenderSurface(rs); Assert.Same(DecodedTexture.Magenta, decoded); } }