Files
MeterVault/tests/Core.Tests/TestData.cs
T
schmidt.florian d972f67bad M1: pure normalization engine + default seed
Infrastructure-free normalization engine in Core dispatching on MeterMode:
- Cumulative/Generation counters: register deltas, first-reading baseline (Haus 411,
  Auto 3755), meter swaps (water …861→2 reconciles to 12 via boundary registers OR an
  explicit amount override), counter resets, anomaly-guarded decreases.
- RuntimeCounter: Δhours × rate (fixed/empirical).
- ConsumableBalance: tank level-Δ + deliveries → consumption, cm→litre calibration;
  delivery-only rows before the first dipstick emit nothing.
- DirectDelta, and Virtual meters via a small safe arithmetic evaluator (Netz Einsparung
  = Haus − Netz, Eigenverbrauch = Erzeugung − Einsparung) — data-driven, not hardcoded.
- DatabaseSeeder: default energy types, cost categories, base settings (idempotent).

24 Core unit tests + 4 integration tests green.

Claude-Session: https://claude.ai/code/session_01WujdMtMJPbxDpDnMeK22rr
2026-07-13 11:12:03 +02:00

56 lines
1.6 KiB
C#

using MeterVault.Core.Domain;
namespace MeterVault.Core.Tests;
/// <summary>Terse builders for readings/events/configs in normalizer tests.</summary>
internal static class TestData
{
public static DateTimeOffset Month(int year, int month) =>
new(new DateTime(year, month, 1, 0, 0, 0, DateTimeKind.Utc));
public static Reading Reading(int meterId, DateTimeOffset time, double value) => new()
{
MeterId = meterId,
Time = time,
Value = value,
Quality = ReadingQuality.Imported,
};
public static MeterEvent Swap(int meterId, DateTimeOffset time, double? prevValue = null,
double? newValue = null, double? amount = null) => new()
{
MeterId = meterId,
Time = time,
EventType = MeterEventType.MeterSwap,
PrevValue = prevValue,
NewValue = newValue,
Amount = amount,
};
public static MeterEvent Reset(int meterId, DateTimeOffset time, double? newValue = 0) => new()
{
MeterId = meterId,
Time = time,
EventType = MeterEventType.CounterReset,
NewValue = newValue,
};
public static MeterEvent Delivery(int meterId, DateTimeOffset time, double litres) => new()
{
MeterId = meterId,
Time = time,
EventType = MeterEventType.Delivery,
Amount = litres,
Unit = "L",
};
public static MeterEvent TankLevelCm(int meterId, DateTimeOffset time, double cm) => new()
{
MeterId = meterId,
Time = time,
EventType = MeterEventType.TankLevel,
Amount = cm,
Unit = "cm",
};
}