From 36ee23a0c406c16e975276238a861299899ec79a Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Mon, 21 Sep 2026 23:47:50 +0800 Subject: Add rebalancing execution slice (3d-11) --- tests/FundLab.Domain.Tests/DomainTests.fs | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'tests/FundLab.Domain.Tests') diff --git a/tests/FundLab.Domain.Tests/DomainTests.fs b/tests/FundLab.Domain.Tests/DomainTests.fs index ff5245e..63bcab2 100644 --- a/tests/FundLab.Domain.Tests/DomainTests.fs +++ b/tests/FundLab.Domain.Tests/DomainTests.fs @@ -747,6 +747,54 @@ module RebalancePolicyTests = Assert.All(diffs, fun diff -> Assert.Equal(RebalancePolicy.Hold, diff.Action)) + [] + let ``weight rows expose current percent and proposed buy`` () = + let targets = [ target "000001" 60.00m; target "000002" 40.00m ] + let positions = [ position "000001" 5000.00m 1000m 1000m (Some 5m) ] + + let rows: RebalancePolicy.RebalanceWeightRow list = + RebalancePolicy.weightRows targets positions 7000.00m + |> unwrap + + let row = rows |> List.find (fun item -> item.InstrumentCode = "000001") + + Assert.Equal(60.00m, row.TargetPercent) + Assert.Equal(5000.00m, row.CurrentValue) + Assert.Equal(41.66m, row.CurrentPercent) + Assert.Equal(RebalancePolicy.Buy, row.Action) + Assert.Equal(2200.00m, row.DeltaAmount) + Assert.Equal(None, row.DeltaUnits) + + [] + let ``weight rows propose a sell clamped to available units`` () = + let targets = [ target "000001" 50.00m; target "000002" 50.00m ] + let positions = [ position "000001" 1000.00m 400m 400m (Some 2.5m) ] + + let rows: RebalancePolicy.RebalanceWeightRow list = + RebalancePolicy.weightRows targets positions 0m + |> unwrap + + let row = rows |> List.find (fun item -> item.InstrumentCode = "000001") + + Assert.Equal(100.00m, row.CurrentPercent) + Assert.Equal(RebalancePolicy.Sell, row.Action) + Assert.Equal(-500.00m, row.DeltaAmount) + Assert.Equal(200.00000000m, row.DeltaUnits.Value) + + [] + let ``weight rows hold when the drift is within the one cent tolerance`` () = + let targets = [ target "000001" 100.00m ] + let positions = [ position "000001" 199.99m 100m 100m (Some 1.9999m) ] + + let rows: RebalancePolicy.RebalanceWeightRow list = + RebalancePolicy.weightRows targets positions 0.01m + |> unwrap + + let row = rows |> List.find (fun item -> item.InstrumentCode = "000001") + + Assert.Equal(RebalancePolicy.Hold, row.Action) + Assert.Equal(0.01m, row.DeltaAmount) + [] let ``idempotency keys are deterministic per plan run and code`` () = let planId = Guid "7c9e6679-7425-40de-944b-e07fc1f90ae7" -- cgit v1.2.3