public static int Main(string[] args)
return new AutoRun(Assembly.GetExecutingAssembly())
.Execute(new[] {"--nocolor"});
public interface ITimeStampProvider
public class TimeStampProvider : ITimeStampProvider
private long _checkValue;
public TimeStampProvider()
public DateTime TimeStamp()
initialValue = _checkValue;
var nowDateTime = DateTime.Now;
var ticks = nowDateTime.Ticks - (nowDateTime.Ticks % TimeSpan.TicksPerMillisecond);
computedValue = Math.Max(ticks, initialValue) + TimeSpan.TicksPerMillisecond;
}while (initialValue != Interlocked.CompareExchange(ref _checkValue, computedValue, initialValue));
return new DateTime(computedValue);
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);