2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2026-06-13 14:38:43 +00:00

Replaced UtcNow with fixed datetime

This commit is contained in:
2026-06-13 15:03:27 +03:00
parent e77bda487d
commit 37972da800
3 changed files with 54 additions and 19 deletions
+15 -4
View File
@@ -366,8 +366,16 @@ public class Payment : IRecord
if (Method != other.Method) return false;
if (Amount != other.Amount) return false;
if (Reference != other.Reference) return false;
//if (Timestamp != other.Timestamp) return false;
//if (TimestampAsLong != other.TimestampAsLong) return false;
if (Timestamp == DateTime.MinValue || other.Timestamp == DateTime.MinValue)
{
if (TimestampAsLong != other.TimestampAsLong)
return false;
}
else
if (!ModelRunner.DatesEqual(Timestamp, other.Timestamp))
return false;
if (Fee != other.Fee) return false;
//if (CurrencyOverride != other.CurrencyOverride) return false;
@@ -475,6 +483,7 @@ public class DocumentHeader : IRecord
[FlatBufferItem(8), Ignore, IgnoreMember]
public Variant[] MetaValues { get; set; }
public override bool Equals(object? obj)
{
var other = obj as DocumentHeader;
@@ -485,8 +494,10 @@ public class DocumentHeader : IRecord
if (Version != other.Version) return false;
//if (CreatedAtAsLong != other.CreatedAtAsLong) return false;
//if (UpdatedAtAsLong != other.UpdatedAtAsLong) return false;
if (CreatedAt != other.CreatedAt) return false;
if (UpdatedAt != other.UpdatedAt) return false;
if (!ModelRunner.DatesEqual(CreatedAt, other.CreatedAt))
return false;
if (UpdatedAt != other.UpdatedAt)
return false;
if (Currency != other.Currency) return false;
if (Notes != other.Notes) return false;
@@ -32,7 +32,7 @@ public static class ModelGenerator
var seller = MakeParty(rng, opt.IncludeV2Fields, isSeller: true, opt.IncludeUnicode);
var buyer = MakeParty(rng, opt.IncludeV2Fields, isSeller: false, opt.IncludeUnicode);
var createdAt = DateTime.UtcNow.AddMinutes(-rng.Next(0, 60 * 24));
var createdAt = ModelRunner.FixedDateTime.AddMinutes(-rng.Next(0, 60 * 24));
var doc = new BusinessDocument
{
Header = new DocumentHeader
@@ -101,7 +101,7 @@ public static class ModelGenerator
var rng = new Random(seed);
var v2 = DeepClone(v1);
v2.Header.UpdatedAt = DateTime.UtcNow;
v2.Header.UpdatedAt = ModelRunner.FixedDateTime;
var toChange = Math.Max(1, (int)Math.Round(v2.Items.Length * changeRatio));
// change random lines
@@ -112,7 +112,7 @@ public static class ModelGenerator
li.Qty = RoundQty(li.Qty + (double)(rng.NextDouble() * 2.0 - 1.0)); // ±1
li.UnitPrice = RoundMoney(li.UnitPrice * (double)(0.95 + rng.NextDouble() * 0.1)); // ±5%
if (li.Ext == null) li.Ext = new Dictionary<string, Variant>();
li.Ext["lastEdit"] = VDate(DateTime.UtcNow);
li.Ext["lastEdit"] = VDate(ModelRunner.FixedDateTime);
li.ExtKeys = li.Ext.Keys.ToArray();
li.ExtValues = li.Ext.Values.ToArray();
}
@@ -226,7 +226,7 @@ public static class ModelGenerator
Method = (PaymentMethod)rng.Next(0, 5),
Amount = RoundMoney(amount),
Reference = "REF-" + rng.Next(100_000, 999_999),
Timestamp = DateTime.UtcNow.AddMinutes(-rng.Next(0, 60 * 24)),
Timestamp = ModelRunner.FixedDateTime.AddMinutes(-rng.Next(0, 60 * 24)),
Fee = includeV2 && rng.Next(0, 2) == 0 ? RoundMoney((double)rng.NextDouble() * 2.0) : null,
//CurrencyOverride = includeV2 && rng.Next(0, 2) == 0 ? Currency.IQD : Currency.USD
};
@@ -304,6 +304,14 @@ public sealed class ModelRunner
private static volatile byte[]? _sinkBytes;
private static volatile BusinessDocument? _sinkDoc;
// DateTime is fixed to guarantee consistent serialization across runs (otherwise, DateTime.UtcNow will vary)
public static DateTime FixedDateTime = DateTime.Parse("2026-06-08T13:56:00+03:00");
//public static DateTime FixedDateTime = new DateTime(2026, 6, 8, 13, 56, 0, DateTimeKind.);
public void Run()
{
const int Rounds = 100;
@@ -417,7 +425,7 @@ public sealed class ModelRunner
Console.WriteLine();
File.AppendAllLines("complex_model_results.csv", st.ToString().Split(Environment.NewLine));
File.WriteAllLines($"complex_model_results_{wName.ToLower()}.csv", st.ToString().Split(Environment.NewLine));
}
}
@@ -490,4 +498,20 @@ public sealed class ModelRunner
return result;
}
public static bool DatesEqual(DateTime dt1, DateTime dt2)
{
// Quick fix to handle DateTimeKind differences (local vs UTC) in roundtrip equality checks
if (dt1 == dt2)
return true;
if (dt1.ToUniversalTime() == dt2.ToUniversalTime())
return true;
if (dt1.ToUniversalTime() == dt2)
return true;
if (dt2.ToUniversalTime() == dt1)
return true;
return false;
}
}