diff --git a/tests/ImageSharp.Tests/PixelAccessorTests.cs b/tests/ImageSharp.Tests/PixelAccessorTests.cs
new file mode 100644
index 0000000000..ab71d8de79
--- /dev/null
+++ b/tests/ImageSharp.Tests/PixelAccessorTests.cs
@@ -0,0 +1,168 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+namespace ImageSharp.Tests
+{
+ using Xunit;
+
+ ///
+ /// Tests the class.
+ ///
+ public class PixelAccessorTests
+ {
+ [Fact]
+ public void CopyFromZYX()
+ {
+ CopyFromZYX(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyFromZYXOptimized()
+ {
+ CopyFromZYX(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyFromZYXW()
+ {
+ CopyFromZYXW(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyFromZYXWOptimized()
+ {
+ CopyFromZYXW(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyToZYX()
+ {
+ CopyToZYX(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyToZYXOptimized()
+ {
+ CopyToZYX(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyToZYXW()
+ {
+ CopyToZYXW(new Image(1, 1));
+ }
+
+ [Fact]
+ public void CopyToZYXWOptimized()
+ {
+ CopyToZYXW(new Image(1, 1));
+ }
+
+ private static void CopyFromZYX(Image image)
+ where TColor : struct, IPackedPixel
+ where TPacked : struct
+ {
+ using (PixelAccessor pixels = image.Lock())
+ {
+ byte red = 1;
+ byte green = 2;
+ byte blue = 3;
+ byte alpha = 255;
+
+ using (PixelRow row = new PixelRow(1, ComponentOrder.ZYX))
+ {
+ row.Bytes[0] = blue;
+ row.Bytes[1] = green;
+ row.Bytes[2] = red;
+
+ pixels.CopyFrom(row, 0);
+
+ Color color = (Color) (object) pixels[0, 0];
+ Assert.Equal(red, color.R);
+ Assert.Equal(green, color.G);
+ Assert.Equal(blue, color.B);
+ Assert.Equal(alpha, color.A);
+ }
+ }
+ }
+
+ private static void CopyFromZYXW(Image image)
+ where TColor : struct, IPackedPixel
+ where TPacked : struct
+ {
+ using (PixelAccessor pixels = image.Lock())
+ {
+ byte red = 1;
+ byte green = 2;
+ byte blue = 3;
+ byte alpha = 4;
+
+ using (PixelRow row = new PixelRow(1, ComponentOrder.ZYXW))
+ {
+ row.Bytes[0] = blue;
+ row.Bytes[1] = green;
+ row.Bytes[2] = red;
+ row.Bytes[3] = alpha;
+
+ pixels.CopyFrom(row, 0);
+
+ Color color = (Color) (object) pixels[0, 0];
+ Assert.Equal(red, color.R);
+ Assert.Equal(green, color.G);
+ Assert.Equal(blue, color.B);
+ Assert.Equal(alpha, color.A);
+ }
+ }
+ }
+
+ private static void CopyToZYX(Image image)
+ where TColor : struct, IPackedPixel
+ where TPacked : struct
+ {
+ using (PixelAccessor pixels = image.Lock())
+ {
+ byte red = 1;
+ byte green = 2;
+ byte blue = 3;
+
+ using (PixelRow row = new PixelRow(1, ComponentOrder.ZYX))
+ {
+ pixels[0, 0] = (TColor) (object) new Color(red, green, blue);
+
+ pixels.CopyTo(row, 0);
+
+ Assert.Equal(blue, row.Bytes[0]);
+ Assert.Equal(green, row.Bytes[1]);
+ Assert.Equal(red, row.Bytes[2]);
+ }
+ }
+ }
+
+ private static void CopyToZYXW(Image image)
+ where TColor : struct, IPackedPixel
+ where TPacked : struct
+ {
+ using (PixelAccessor pixels = image.Lock())
+ {
+ byte red = 1;
+ byte green = 2;
+ byte blue = 3;
+ byte alpha = 4;
+
+ using (PixelRow row = new PixelRow(1, ComponentOrder.ZYXW))
+ {
+ pixels[0, 0] = (TColor) (object) new Color(red, green, blue, alpha);
+
+ pixels.CopyTo(row, 0);
+
+ Assert.Equal(blue, row.Bytes[0]);
+ Assert.Equal(green, row.Bytes[1]);
+ Assert.Equal(red, row.Bytes[2]);
+ Assert.Equal(alpha, row.Bytes[3]);
+ }
+ }
+ }
+ }
+}