using System.Collections.Generic;
public static int Main(string[] args)
return new AutoRun(Assembly.GetExecutingAssembly())
.Execute(new[] {"--nocolor"});
public interface ITimeStampProvider
public class TimeStampProvider : ITimeStampProvider
private DateTime _lastReturnedValue;
private readonly object lockObject = new object();
public TimeStampProvider()
_lastReturnedValue = RoundToMilliseconds(DateTime.Now);
public DateTime TimeStamp()
var roundedToMilliseconds = RoundToMilliseconds(DateTime.Now);
return _lastReturnedValue < roundedToMilliseconds
? _lastReturnedValue = roundedToMilliseconds
: _lastReturnedValue = _lastReturnedValue.AddMilliseconds(1);
private DateTime RoundToMilliseconds(DateTime now)
return new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, now.Kind);
public class TimeStampProviderTest
private ITimeStampProvider _timeStampProvider;
_timeStampProvider = new TimeStampProvider();
public void TimeStampProviderShouldReturnUniqueValuesTest()
var timeStamps = Enumerable
.Select(_ => _timeStampProvider.TimeStamp()).ToArray();
timeStamps.Should().OnlyHaveUniqueItems();
public void ConcurrentTimeStampProviderShouldReturnUniqueValuesTest()
var timeStamps = Enumerable
.Select(_ => _timeStampProvider.TimeStamp()).ToArray();
timeStamps.Should().OnlyHaveUniqueItems();
public void TimeStampProviderShouldReturnRoundedValuesTest()
var timeStamps = Enumerable
.Select(_ => _timeStampProvider.TimeStamp()).ToArray();
foreach (var timeStamp in timeStamps)
(timeStamp.Ticks % TimeSpan.TicksPerMillisecond).Should().Be(0);
public void TimeStampIntervalTest()
var ts1 = _timeStampProvider.TimeStamp();
var ts2 = _timeStampProvider.TimeStamp();
(ts2 - ts1).TotalMilliseconds.Should().BeGreaterThan(90);