|  | @@ -1,6 +1,187 @@
 | 
	
		
			
				|  |  | -namespace Renci.SshNet.Tests.Classes.Common
 | 
	
		
			
				|  |  | +using System;
 | 
	
		
			
				|  |  | +using System.Diagnostics;
 | 
	
		
			
				|  |  | +using System.Diagnostics.CodeAnalysis;
 | 
	
		
			
				|  |  | +using System.Linq;
 | 
	
		
			
				|  |  | +using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
	
		
			
				|  |  | +using Renci.SshNet.Common;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace Renci.SshNet.Tests.Classes.Common
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    class ExtensionsTest_IsEqualTo_ByteArray
 | 
	
		
			
				|  |  | +    [TestClass]
 | 
	
		
			
				|  |  | +    [SuppressMessage("ReSharper", "InvokeAsExtensionMethod")]
 | 
	
		
			
				|  |  | +    public class ExtensionsTest_IsEqualTo_ByteArray
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | +        private Random _random;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestInitialize]
 | 
	
		
			
				|  |  | +        public void Init()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            _random = new Random();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ShouldThrowArgumentNullExceptionWhenLeftIsNull()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            const byte[] left = null;
 | 
	
		
			
				|  |  | +            var right = CreateBuffer(1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Extensions.IsEqualTo(left, right);
 | 
	
		
			
				|  |  | +                Assert.Fail();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (ArgumentNullException ex)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsNull(ex.InnerException);
 | 
	
		
			
				|  |  | +                Assert.AreEqual("left", ex.ParamName);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ShouldThrowArgumentNullExceptionWhenRightIsNull()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var left = CreateBuffer(1);
 | 
	
		
			
				|  |  | +            const byte[] right = null;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Extensions.IsEqualTo(left, right);
 | 
	
		
			
				|  |  | +                Assert.Fail();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (ArgumentNullException ex)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsNull(ex.InnerException);
 | 
	
		
			
				|  |  | +                Assert.AreEqual("right", ex.ParamName);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ShouldThrowArgumentNullExceptionWhenLeftAndRightAreNull()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            const byte[] left = null;
 | 
	
		
			
				|  |  | +            const byte[] right = null;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Extensions.IsEqualTo(left, right);
 | 
	
		
			
				|  |  | +                Assert.Fail();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (ArgumentNullException ex)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Assert.IsNull(ex.InnerException);
 | 
	
		
			
				|  |  | +                Assert.AreEqual("left", ex.ParamName);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ShouldReturnFalseWhenLeftIsNotEqualToRight()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Assert.IsFalse(Extensions.IsEqualTo(new byte[] {0x0a}, new byte[] {0x0a, 0x0d}));
 | 
	
		
			
				|  |  | +            Assert.IsFalse(Extensions.IsEqualTo(new byte[] { 0x0a, 0x0d }, new byte[] { 0x0a }));
 | 
	
		
			
				|  |  | +            Assert.IsFalse(Extensions.IsEqualTo(new byte[0], new byte[] { 0x0a }));
 | 
	
		
			
				|  |  | +            Assert.IsFalse(Extensions.IsEqualTo(new byte[] { 0x0a, 0x0d }, new byte[0]));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ShouldReturnTrueWhenLeftIsEqualToRight()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            Assert.IsTrue(Extensions.IsEqualTo(new byte[] { 0x0a, 0x0d }, new byte[] { 0x0a, 0x0d }));
 | 
	
		
			
				|  |  | +            Assert.IsTrue(Extensions.IsEqualTo(new byte[0], new byte[0]));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void ShouldReturnTrueWhenLeftIsSameAsRight()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var left = new byte[] { 0x0d, 0x0d };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Assert.IsTrue(Extensions.IsEqualTo(left, left));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void Performance_LargeArray_Equal()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var buffer = CreateBuffer(50000);
 | 
	
		
			
				|  |  | +            var left = buffer.Concat(new byte[] {0x0a});
 | 
	
		
			
				|  |  | +            var right = buffer.Concat(new byte[] { 0x0a });
 | 
	
		
			
				|  |  | +            const int runs = 10000;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Performance(left, right, runs);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void Performance_LargeArray_NotEqual_DifferentLength()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var left = CreateBuffer(50000);
 | 
	
		
			
				|  |  | +            var right = left.Concat(new byte[] {0x0a});
 | 
	
		
			
				|  |  | +            const int runs = 10000;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Performance(left, right, runs);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void Performance_LargeArray_NotEqual_SameLength()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var buffer = CreateBuffer(50000);
 | 
	
		
			
				|  |  | +            var left = buffer.Concat(new byte[] { 0x0a });
 | 
	
		
			
				|  |  | +            var right = buffer.Concat(new byte[] { 0x0b });
 | 
	
		
			
				|  |  | +            const int runs = 10000;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Performance(left, right, runs);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        [TestMethod]
 | 
	
		
			
				|  |  | +        public void Performance_LargeArray_Same()
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var left = CreateBuffer(50000);
 | 
	
		
			
				|  |  | +            var right = left.Concat(new byte[] { 0x0a });
 | 
	
		
			
				|  |  | +            const int runs = 10000;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Performance(left, right, runs);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private void Performance(byte[] left, byte[] right, int runs)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var stopWatch = new Stopwatch();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            GC.Collect();
 | 
	
		
			
				|  |  | +            GC.WaitForPendingFinalizers();
 | 
	
		
			
				|  |  | +            GC.Collect();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            stopWatch.Start();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (var i = 0; i < runs; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                Extensions.IsEqualTo(left, right);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            GC.Collect();
 | 
	
		
			
				|  |  | +            GC.WaitForPendingFinalizers();
 | 
	
		
			
				|  |  | +            GC.Collect();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            stopWatch.Stop();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Console.WriteLine(stopWatch.ElapsedMilliseconds);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            stopWatch.Restart();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (var i = 0; i < runs; i++)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                var result = Enumerable.SequenceEqual(left, right);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            GC.Collect();
 | 
	
		
			
				|  |  | +            GC.WaitForPendingFinalizers();
 | 
	
		
			
				|  |  | +            GC.Collect();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            stopWatch.Stop();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            Console.WriteLine(stopWatch.ElapsedMilliseconds);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        private byte[] CreateBuffer(int length)
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            var buffer = new byte[length];
 | 
	
		
			
				|  |  | +            _random.NextBytes(buffer);
 | 
	
		
			
				|  |  | +            return buffer;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |