public void HonorsReportInterval()
        {
            int    testInterval = 20;
            string pw           = TestValues.GetPw(5);
            ulong  pwCount      = 0;
            var    intervals    = new List <int>();
            var    previousTime = DateTime.Now;
            var    logic        = new LogicImplementation();
            var    cancelSource = new CancellationTokenSource();
            var    cancelToken  = cancelSource.Token;
            var    progress     = new Progress <ulong>((count) =>
            {
                pwCount    = count;
                DateTime t = DateTime.Now;
                intervals.Add((int)(t - previousTime).TotalMilliseconds);
                previousTime = t;
            });
            var collisionFound = new Progress <string>((result) => { });

            logic.ReportInterval = testInterval;
            var task      = Task.Run(() => { logic.SearchCollisions(Sha1Hash.CalculateFromString(pw), progress, collisionFound, cancelToken); });
            var startTime = DateTime.Now;

            while ((intervals.Count() < 4) && ((DateTime.Now - startTime).TotalMilliseconds < 500))
            {
                Thread.Sleep(5);
            }
            Assert.IsFalse((intervals.Count() == 0), $"SearchCollisions - does not report progress through its 'progress' object.");
            cancelSource.Cancel();
            intervals.RemoveAt(0);
            int interval = (intervals[0] + intervals[1] + intervals[2]) / 3;

            Assert.IsTrue((Math.Abs(testInterval - interval) < 20),
                          $"SearchCollisions - does not report progress at requested interval of {testInterval}ms, was {interval}ms.");
        }
        public void ReportsProgress()
        {
            string pw             = TestValues.GetPw(5);
            ulong  pwCount        = 0;
            var    logic          = new LogicImplementation();
            var    cancelSource   = new CancellationTokenSource();
            var    cancelToken    = cancelSource.Token;
            var    progress       = new Progress <ulong>((count) => { pwCount = count; });
            var    collisionFound = new Progress <string>((result) => { });
            var    task           = Task.Run(() => { logic.SearchCollisions(Sha1Hash.CalculateFromString(pw), progress, collisionFound, cancelToken); });
            var    startTime      = DateTime.Now;

            while ((pwCount == 0) && ((DateTime.Now - startTime).TotalMilliseconds < 500))
            {
                Thread.Sleep(5);
            }
            cancelSource.Cancel();
            Assert.IsFalse((pwCount == 0), $"SearchCollisions - does not report progress through its 'progress' object.");
        }
        public void DetectsCollision()
        {
            string pw             = TestValues.GetPw(2);
            string foundPw        = string.Empty;
            var    logic          = new LogicImplementation();
            var    cancelSource   = new CancellationTokenSource();
            var    cancelToken    = cancelSource.Token;
            var    progress       = new Progress <ulong>((count) => { });
            var    collisionFound = new Progress <string>((result) => { foundPw = result; cancelSource.Cancel(); });
            var    task           = Task.Run(() => { logic.SearchCollisions(Sha1Hash.CalculateFromString(pw), progress, collisionFound, cancelToken); });
            var    startTime      = DateTime.Now;

            while ((foundPw == string.Empty) && ((DateTime.Now - startTime).TotalMilliseconds < 1000))
            {
                Thread.Sleep(5);
            }
            Assert.IsFalse((foundPw == string.Empty), $"SearchCollisions - does not return a collision through its 'collisionFound' progress object.");
            Assert.IsTrue((pw == foundPw), $"SearchCollisions - returns wrong value for a collision: \'{foundPw}\', expected: \'{pw}\'.");
            cancelSource.Cancel();
        }
        public void HonorsCancelRequest()
        {
            string pw             = TestValues.GetPw(5);
            ulong  pwCount        = 0;
            var    logic          = new LogicImplementation();
            var    cancelSource   = new CancellationTokenSource();
            var    cancelToken    = cancelSource.Token;
            var    progress       = new Progress <ulong>((count) => { pwCount = count; });
            var    collisionFound = new Progress <string>((result) => { });
            var    task           = Task.Run(() => { logic.SearchCollisions(Sha1Hash.CalculateFromString(pw), progress, collisionFound, cancelToken); });
            var    startTime      = DateTime.Now;

            while ((pwCount == 0) && ((DateTime.Now - startTime).TotalMilliseconds < 500))
            {
                Thread.Sleep(5);
            }
            cancelSource.Cancel();
            var taskAborted = task.Wait(300);

            Assert.IsTrue(taskAborted, $"SearchCollisions - does not stop Task after 'Cancel' request.");
        }