diff --git a/manifest/main.ml b/manifest/main.ml index 44f0450cebd332472a9cc9ee1fe1b9533c312565..d9818ca2ebb1e7a7043404bf6d5f308fc3b20fbd 100644 --- a/manifest/main.ml +++ b/manifest/main.ml @@ -5547,6 +5547,7 @@ end = struct ("test_adaptive_issuance", N.(number >= 018)); ("test_adaptive_issuance_ema", N.(number >= 018)); ("test_percentage", N.(number >= 019)); + ("test_full_staking_balance_repr", N.(number >= 019)); ] |> conditional_list in diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml index 767a4d3619e30247d1a1dd7c01d643e0cf180df1..d2cf0eb1c75b2684c056fda70d30b0bbd96e4d63 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml @@ -322,3 +322,25 @@ let add_staked_frozen ~amount min_delegated_in_cycle; cycle_of_min_delegated; } + +module Internal_for_tests = struct + let min_delegated_in_cycle + { + own_frozen = _; + staked_frozen = _; + delegated = _; + min_delegated_in_cycle; + cycle_of_min_delegated = _; + } = + min_delegated_in_cycle + + let cycle_of_min_delegated + { + own_frozen = _; + staked_frozen = _; + delegated = _; + min_delegated_in_cycle = _; + cycle_of_min_delegated; + } = + cycle_of_min_delegated +end diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli index c55ec8ba76e0d95ae697a8bd0270965e6bf042c6..8ff2033e76b74d0842775d33df302d61e1879b49 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli @@ -57,3 +57,9 @@ val add_delegated : val add_own_frozen : amount:Tez_repr.t -> t -> t tzresult val add_staked_frozen : amount:Tez_repr.t -> t -> t tzresult + +module Internal_for_tests : sig + val min_delegated_in_cycle : t -> Tez_repr.t + + val cycle_of_min_delegated : t -> Cycle_repr.t +end diff --git a/src/proto_alpha/lib_protocol/test/unit/dune b/src/proto_alpha/lib_protocol/test/unit/dune index 26a36e23fdb2a132f1c1d02ab6f0d4ca209ff5c0..d10fc0f9abe56c9cb168e0adcab7a5a01564615c 100644 --- a/src/proto_alpha/lib_protocol/test/unit/dune +++ b/src/proto_alpha/lib_protocol/test/unit/dune @@ -74,7 +74,8 @@ test_dal_slot_proof test_adaptive_issuance test_adaptive_issuance_ema - test_percentage)) + test_percentage + test_full_staking_balance_repr)) (executable (name main) diff --git a/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml new file mode 100644 index 0000000000000000000000000000000000000000..3bcfa0b873780b7e04ff6b848eeb9f311da56877 --- /dev/null +++ b/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml @@ -0,0 +1,123 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* Copyright (c) 2024 Nomadic Labs *) +(* *) +(*****************************************************************************) + +(** Testing + ------- + Component: protocol + Invocation: dune exec src/proto_alpha/lib_protocol/test/unit/main.exe \ + -- --file test_full_staking_balance_repr.ml + Subject: test the Full_staking_balance_repr module +*) + +open Protocol +open Data_encoding + +(* We duplicate the definition of the Full_staking_balance_repr module + from Oxford to test a None case in the current encoding *) +module Full_staking_balance_repr_oxford = struct + type t = { + own_frozen : Tez_repr.t; + staked_frozen : Tez_repr.t; + delegated : Tez_repr.t; + } + + let make ~own_frozen ~staked_frozen ~delegated = + {own_frozen; staked_frozen; delegated} + + let encoding = + let open Data_encoding in + conv + (fun {own_frozen; staked_frozen; delegated} -> + (own_frozen, staked_frozen, delegated)) + (fun (own_frozen, staked_frozen, delegated) -> + {own_frozen; staked_frozen; delegated}) + (obj3 + (req "own_frozen" Tez_repr.encoding) + (req "staked_frozen" Tez_repr.encoding) + (req "delegated" Tez_repr.encoding)) +end + +let equal_full_staking_balance (a : Full_staking_balance_repr.t) + (b : Full_staking_balance_repr.t) = + let open Lwt_result_syntax in + let open Full_staking_balance_repr in + let open Full_staking_balance_repr.Internal_for_tests in + let equal_tez_repr ~loc a b = + Assert.equal_int64 ~loc (Tez_repr.to_mutez a) (Tez_repr.to_mutez b) + in + let equal_cycle_repr ~loc a b = + Assert.equal_int32 ~loc (Cycle_repr.to_int32 a) (Cycle_repr.to_int32 b) + in + + let* () = equal_tez_repr ~loc:__LOC__ (own_frozen a) (own_frozen b) in + let* () = equal_tez_repr ~loc:__LOC__ (staked_frozen a) (staked_frozen b) in + let* () = + equal_tez_repr ~loc:__LOC__ (current_delegated a) (current_delegated b) + in + let* () = + equal_tez_repr + ~loc:__LOC__ + (min_delegated_in_cycle a) + (min_delegated_in_cycle b) + in + let* () = + equal_cycle_repr + ~loc:__LOC__ + (cycle_of_min_delegated a) + (cycle_of_min_delegated b) + in + return_unit + +let equal_full_staking_balance_bytes sb_bytes + (sb_expected : Full_staking_balance_repr.t) = + let open Lwt_result_syntax in + let encoding = Full_staking_balance_repr.encoding in + let* sb = + match Binary.of_bytes encoding sb_bytes with + | Ok x -> return x + | Error e -> + failwith + "Data_encoding.Binary.read shouldn't have failed with \ + Full_staking_balance_repr.encoding: %a" + Binary.pp_read_error + e + in + equal_full_staking_balance sb sb_expected + +let test_encodings () = + let open Lwt_result_syntax in + let own_frozen = Tez_repr.(mul_exn one 1) in + let staked_frozen = Tez_repr.(mul_exn one 2) in + let delegated = Tez_repr.(mul_exn one 5) in + + (* Test a [Some] case for [added_in_p] *) + let staking_balance = + Full_staking_balance_repr.init + ~own_frozen + ~staked_frozen + ~delegated + ~current_cycle:Cycle_repr.root + in + let encoding = Full_staking_balance_repr.encoding in + let sb_bytes = Binary.to_bytes_exn encoding staking_balance in + let* () = equal_full_staking_balance_bytes sb_bytes staking_balance in + + (* Test a [None] case for [added_in_p] *) + let staking_balance_o = + Full_staking_balance_repr_oxford.make ~own_frozen ~staked_frozen ~delegated + in + let encoding_o = Full_staking_balance_repr_oxford.encoding in + let sb_o_bytes = Binary.to_bytes_exn encoding_o staking_balance_o in + let* () = equal_full_staking_balance_bytes sb_o_bytes staking_balance in + return_unit + +let tests = + Tztest.[tztest "full staking balance - encoding" `Quick test_encodings] + +let () = + Alcotest_lwt.run ~__FILE__ Protocol.name [("full_staking_balance", tests)] + |> Lwt_main.run