-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
97 lines (87 loc) · 3.55 KB
/
Copy pathProgram.cs
File metadata and controls
97 lines (87 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using SlaCore;
using SlaCore.Models;
using SlaCore.Runner;
var passed = 0;
var failed = 0;
var errors = new List<string>();
var Start = new DateTimeOffset(2024, 1, 15, 9, 0, 0, TimeSpan.Zero); // Monday
void Run(string name, Action test)
{
try
{
test();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($" ✓ {name}");
Console.ResetColor();
passed++;
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($" ✗ {name}");
Console.WriteLine($" → {ex.Message}");
Console.ResetColor();
errors.Add($"{name}: {ex.Message}");
failed++;
}
}
Console.WriteLine("\n─── Deadline Calculation Tests ───────────────────────────────────────────────");
Run("WallClock: deadline = start + duration", () =>
{
var policy = SlaPolicy.High();
var deadline = SlaCalculator.CalculateSlaDeadline(Start, policy);
TestAssert.Equal(Start.AddHours(4), deadline);
});
Run("Custom Critical policy overrides defaults", () =>
{
var policy = SlaPolicy.Critical(
configure: p =>
{
p.AllowedDuration = TimeSpan.FromHours(2);
p.UseBusinessHoursOnly = true;
p.BusinessHoursStart = TimeSpan.FromHours(8);
p.BusinessHoursEnd = TimeSpan.FromHours(18);
p.WarningThreshold = 0.75;
});
TestAssert.Equal("P1", policy.Id);
TestAssert.Equal("Critical", policy.Name);
TestAssert.Equal(TimeSpan.FromHours(2), policy.AllowedDuration);
TestAssert.True(policy.UseBusinessHoursOnly);
TestAssert.Equal(TimeSpan.FromHours(8), policy.BusinessHoursStart);
TestAssert.Equal(TimeSpan.FromHours(18), policy.BusinessHoursEnd);
TestAssert.EqualApprox(0.75, policy.WarningThreshold);
});
Run("WallClock: deadline spans weekend (wall-clock ignores weekend)", () =>
{
var friday = new DateTimeOffset(2024, 1, 12, 22, 0, 0, TimeSpan.Zero);
var policy = SlaPolicy.High();
var deadline = SlaCalculator.CalculateSlaDeadline(friday, policy);
TestAssert.Equal(new DateTimeOffset(2024, 1, 13, 2, 0, 0, TimeSpan.Zero), deadline);
});
Run("BusinessHours: skips holidays and weekend", () =>
{
// The task starts on Thursday at 09:00 with a 15-hour SLA.
// Friday and Monday are holidays, while Saturday and Sunday are non-business days.
// With business hours from 08:00 to 18:00, 9 hours are available on Thursday
// and the remaining 6 hours are completed on Tuesday, resulting in a deadline
// of Tuesday at 14:00.
var start = new DateTimeOffset(2024, 1, 11, 9, 0, 0, TimeSpan.Zero); // Thursday 09:00
var evaluateAt = new DateTimeOffset(2024, 1, 16, 14, 0, 0, TimeSpan.Zero); // Tuesday 14:00
var policy = SlaPolicy.Medium(
businessHoursOnly: true,
configure: p =>
{
p.AllowedDuration = TimeSpan.FromHours(15);
p.BusinessHoursStart = TimeSpan.FromHours(8);
p.BusinessHoursEnd = TimeSpan.FromHours(18);
p.Holidays = new List<DateTime>
{
new DateTime(2024, 1, 12), // Friday
new DateTime(2024, 1, 15) // Monday
};
});
var result = SlaCalculator.Evaluate(start, evaluateAt, policy);
TestAssert.Equal(new DateTimeOffset(2024, 1, 16, 14, 0, 0, TimeSpan.Zero), result.Deadline);
TestAssert.EqualTimeSpan(TimeSpan.FromHours(15), result.ElapsedTime);
TestAssert.Equal(SlaStatus.Breached, result.Status);
});