public void CanIncToValue(long initial, long value, long expected)
        {
            var tslong = new ThreadSafeLong(initial);

            tslong.IncTo(value);
            Assert.Equal(expected, tslong.Value);
        }
        public async Task IncToMultiThreads(int threads, int observations)
        {
            var tslong   = new ThreadSafeLong(0);
            var testData = new IEnumerable <long> [threads];
            var max      = long.MinValue;

            for (var i = 0; i < threads; i++)
            {
                var data = GenerateTestData(observations);
                max         = Math.Max(data.max, max);
                testData[i] = data.items;
            }

            await Task.WhenAll(testData.Select(async d =>
            {
                foreach (long item in d)
                {
                    await Task.Yield();
                    tslong.IncTo(item);
                }
            }).ToArray());

            Assert.Equal(max, tslong.Value);
        }