public void MaxGuid() { Assert.That(TimeGuidBitsLayout.MaxTimeGuid, Is.EqualTo(new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xbf, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f })); Assert.That(TimeGuidBitsLayout.GetTimestamp(TimeGuidBitsLayout.MaxTimeGuid), Is.EqualTo(new Timestamp(new DateTime(1652084544606846975L, DateTimeKind.Utc).Ticks))); Assert.That(TimeGuidBitsLayout.GetClockSequence(TimeGuidBitsLayout.MaxTimeGuid), Is.EqualTo(16383)); Assert.That(TimeGuidBitsLayout.GetNode(TimeGuidBitsLayout.MaxTimeGuid), Is.EqualTo(new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff })); }
public void GetTimestamp() { var timestamp = new Timestamp(tsGenerator.NowTicks()); var timeGuid = TimeGuidBitsLayout.Format(timestamp, RandomClockSequence(), RandomNode()); Assert.That(TimeGuidBitsLayout.GetTimestamp(timeGuid), Is.EqualTo(timestamp)); }
public void MinGuid() { Assert.That(TimeGuidBitsLayout.MinTimeGuid, Is.EqualTo(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 })); Assert.That(TimeGuidBitsLayout.GetTimestamp(TimeGuidBitsLayout.MinTimeGuid), Is.EqualTo(new Timestamp(new DateTime(1582, 10, 15, 0, 0, 0, DateTimeKind.Utc).Ticks))); Assert.That(TimeGuidBitsLayout.GetClockSequence(TimeGuidBitsLayout.MinTimeGuid), Is.EqualTo(0)); Assert.That(TimeGuidBitsLayout.GetNode(TimeGuidBitsLayout.MinTimeGuid), Is.EqualTo(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })); }
public void GetTimestamp_GregorianCalendarEnd() { var timestamp = TimeGuidBitsLayout.GregorianCalendarEnd; var timeGuid = TimeGuidBitsLayout.Format(timestamp, 0, new byte[6]); Assert.That(TimeGuidBitsLayout.GetTimestamp(timeGuid), Is.EqualTo(timestamp)); Assert.That(new Guid(timeGuid), Is.EqualTo(new Guid("ffffffff-ffff-ff1f-8080-808080808080"))); }
public void Format_InvalidArgs() { Assert.Throws <InvalidOperationException>(() => TimeGuidBitsLayout.Format(new Timestamp(TimeGuidBitsLayout.GregorianCalendarStart.Ticks - 1), 0, new byte[6])); Assert.Throws <InvalidOperationException>(() => TimeGuidBitsLayout.Format(new Timestamp(TimeGuidBitsLayout.GregorianCalendarEnd.Ticks + 1), 0, new byte[6])); Assert.Throws <InvalidOperationException>(() => TimeGuidBitsLayout.Format(Timestamp.Now, TimeGuidBitsLayout.MaxClockSequence + 1, new byte[6])); Assert.Throws <InvalidOperationException>(() => TimeGuidBitsLayout.Format(Timestamp.Now, TimeGuidBitsLayout.MaxClockSequence, new byte[4])); Assert.Throws <InvalidOperationException>(() => TimeGuidBitsLayout.Format(Timestamp.Now, TimeGuidBitsLayout.MaxClockSequence, new byte[5])); }
public void GenerateByTimestamp() { var guidGen = new TimeGuidGenerator(PreciseTimestampGenerator.Instance); var ts = Timestamp.Now; var guid = guidGen.NewGuid(ts); Assert.That(TimeGuidBitsLayout.GetTimestamp(guid), Is.EqualTo(ts)); }
public void GenerateByTimestampAndClockSequence() { var guidGen = new TimeGuidGenerator(PreciseTimestampGenerator.Instance); var ts = Timestamp.Now; var clockSequence = TimeGuidGenerator.GenerateRandomClockSequence(); var guid = guidGen.NewGuid(ts, clockSequence); Assert.That(TimeGuidBitsLayout.GetTimestamp(guid), Is.EqualTo(ts)); Assert.That(TimeGuidBitsLayout.GetClockSequence(guid), Is.EqualTo(clockSequence)); }
private static TimeBasedColumn[] RandomColumnsByNode(int count) { var now = Timestamp.Now; return(Enumerable.Range(0, int.MaxValue).Select(x => new TimeBasedColumn { Timestamp = now.Ticks, Name = new TimeGuid(TimeGuidBitsLayout.Format(now, 0, ThreadLocalRandom.Instance.NextBytes(6))), Value = new byte[0], }).DistinctBy(x => x.Name).Take(count).ToArray()); }
public void GetTimestamp_AllDistinctTimestamps() { var node = RandomNode(); var clockSequence = RandomClockSequence(); foreach (var timestamp in AllDistinctTimestamps(TimeSpan.FromHours(10))) { var timeGuid = TimeGuidBitsLayout.Format(timestamp, clockSequence, node); Assert.That(TimeGuidBitsLayout.GetTimestamp(timeGuid), Is.EqualTo(timestamp)); } }
private static TimeBasedColumn[] RandomColumnsByClockSequence(int count) { var now = Timestamp.Now; return(MoreEnumerable.DistinctBy(Enumerable.Range(0, int.MaxValue).Select(x => new TimeBasedColumn { Timestamp = now.Ticks, Name = new TimeGuid(TimeGuidBitsLayout.Format(now, ThreadLocalRandom.Instance.NextUshort(TimeGuidBitsLayout.MinClockSequence, TimeGuidBitsLayout.MaxClockSequence + 1), new byte[6])), Value = new byte[0], }), x => x.Name).Take(count).ToArray()); }
private static TimeBasedColumn[] RandomColumnsByTimestamp(int count) { var now = Timestamp.Now; return(MoreEnumerable.DistinctBy(Enumerable.Range(0, int.MaxValue).Select(x => new TimeBasedColumn { Timestamp = now.Ticks, Name = new TimeGuid(TimeGuidBitsLayout.Format(now + ThreadLocalRandom.Instance.NextTimeSpan(TimeSpan.FromDays(1)), 0, new byte[6])), Value = new byte[0], }), x => x.Name).Take(count).ToArray()); }
public void TimeGuidBitsLayout_Perf() { var timestamp = new Timestamp(tsGenerator.NowTicks()); var clockSequence = RandomClockSequence(); var node = RandomNode(); var sw = Stopwatch.StartNew(); const int count = 10 * 1000 * 1000; for (var i = 0; i < count; i++) { TimeGuidBitsLayout.Format(timestamp, clockSequence, node); } sw.Stop(); Console.Out.WriteLine($"TimeGuidBitsLayout.Format took {sw.ElapsedMilliseconds} ms for {count} calls"); }
public void DecrementNode() { Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }), Is.EqualTo(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0xff }), Is.EqualTo(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 }), Is.EqualTo(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x12, 0x34, 0x56, 0x78, 0xff, 0x00 }), Is.EqualTo(new byte[] { 0x12, 0x34, 0x56, 0x78, 0xfe, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x12, 0x34, 0x56, 0x79, 0x00, 0x00 }), Is.EqualTo(new byte[] { 0x12, 0x34, 0x56, 0x78, 0xff, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x12, 0xff, 0x00, 0x00, 0x00, 0x00 }), Is.EqualTo(new byte[] { 0x12, 0xfe, 0xff, 0xff, 0xff, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0x13, 0x00, 0x00, 0x00, 0x00, 0x00 }), Is.EqualTo(new byte[] { 0x12, 0xff, 0xff, 0xff, 0xff, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 }), Is.EqualTo(new byte[] { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }), Is.EqualTo(new byte[] { 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }), Is.EqualTo(new byte[] { 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff })); Assert.That(TimeGuidBitsLayout.DecrementNode(new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }), Is.EqualTo(new byte[] { 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe })); Assert.Throws <InvalidOperationException>(() => TimeGuidBitsLayout.DecrementNode(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })); }
public void GetClockSequence_AllDistinctClockSequences() { var node = new byte[6]; var timestamp = Timestamp.Now; var uniqueClockSequences = new HashSet <ushort>(); for (var clockSequence = TimeGuidBitsLayout.MinClockSequence; clockSequence <= TimeGuidBitsLayout.MaxClockSequence; clockSequence++) { var timeGuid = TimeGuidBitsLayout.Format(timestamp, clockSequence, node); var actualClockSequence = TimeGuidBitsLayout.GetClockSequence(timeGuid); uniqueClockSequences.Add(actualClockSequence); Assert.That(actualClockSequence, Is.EqualTo(clockSequence)); } Assert.That(uniqueClockSequences.Count, Is.EqualTo(TimeGuidBitsLayout.MaxClockSequence + 1)); }
public void GetVersion() { Assert.That(TimeGuidBitsLayout.GetVersion(TimeGuidBitsLayout.Format(new Timestamp(tsGenerator.NowTicks()), RandomClockSequence(), RandomNode())), Is.EqualTo(GuidVersion.TimeBased)); }
public void Before() { var timestamp = Timestamp.Now; Assert.That(TimeGuid.MaxForTimestamp(timestamp).Before(), Is.LessThan(TimeGuid.MaxForTimestamp(timestamp))); Assert.That(TimeGuid.MinForTimestamp(timestamp).Before(), Is.EqualTo(TimeGuid.MaxForTimestamp(timestamp - TimeSpan.FromTicks(1)))); Assert.That(new TimeGuid(timestamp, 1, TimeGuidBitsLayout.MinNode).Before(), Is.EqualTo(new TimeGuid(timestamp, 0, TimeGuidBitsLayout.MaxNode))); Assert.That(new TimeGuid(timestamp, 1, TimeGuidBitsLayout.MaxNode).Before(), Is.EqualTo(new TimeGuid(timestamp, 1, TimeGuidBitsLayout.DecrementNode(TimeGuidBitsLayout.MaxNode)))); Assert.Throws <InvalidOperationException>(() => TimeGuid.MinForTimestamp(new Timestamp(DateTime.MinValue))); }