voting: 3 new small tests
This commit is contained in:
parent
8b054deee3
commit
febaa3b7ed
@ -197,6 +197,7 @@ let test_voting () =
|
|||||||
delegates >>=? fun operations ->
|
delegates >>=? fun operations ->
|
||||||
Block.bake ~operations b >>=? fun b ->
|
Block.bake ~operations b >>=? fun b ->
|
||||||
|
|
||||||
|
(* voting twice for the same proposal is not allowed *)
|
||||||
Op.ballot (B b) del1 Protocol_hash.zero Vote.Nay >>=? fun op ->
|
Op.ballot (B b) del1 Protocol_hash.zero Vote.Nay >>=? fun op ->
|
||||||
Block.bake ~operations:[op] b >>= fun res ->
|
Block.bake ~operations:[op] b >>= fun res ->
|
||||||
Assert.proto_error ~loc:__LOC__ res begin function
|
Assert.proto_error ~loc:__LOC__ res begin function
|
||||||
@ -331,7 +332,98 @@ let test_voting () =
|
|||||||
|
|
||||||
return_unit
|
return_unit
|
||||||
|
|
||||||
|
let test_period1 () =
|
||||||
|
Context.init 10 >>=? fun (b,delegates) ->
|
||||||
|
|
||||||
|
Context.get_constants (B b) >>=? fun { parametric = {blocks_per_voting_period} } ->
|
||||||
|
Block.bake_n (Int32.to_int blocks_per_voting_period) b >>=? fun b ->
|
||||||
|
|
||||||
|
let del1 = List.nth delegates 0 in
|
||||||
|
let del2 = List.nth delegates 1 in
|
||||||
|
|
||||||
|
Op.proposals (B b) del1 [protos.(0)] >>=? fun ops1 ->
|
||||||
|
Op.proposals (B b) del2 [protos.(1)] >>=? fun ops2 ->
|
||||||
|
Block.bake ~operations:[ops1;ops2] b >>=? fun b ->
|
||||||
|
Block.bake_n ((Int32.to_int blocks_per_voting_period)-1) b >>=? fun b ->
|
||||||
|
|
||||||
|
(* we remain in the proposal when there is no winner *)
|
||||||
|
Context.Vote.get_current_period_kind (B b) >>=? begin function
|
||||||
|
| Proposal -> return_unit
|
||||||
|
| _ -> failwith "%s - Unexpected period kind" __LOC__
|
||||||
|
end >>=? fun () ->
|
||||||
|
|
||||||
|
return_unit
|
||||||
|
|
||||||
|
|
||||||
|
let test_period2_supermajority supermajority () =
|
||||||
|
Context.init 100 >>=? fun (b,delegates) ->
|
||||||
|
|
||||||
|
Context.get_constants (B b) >>=? fun { parametric = {blocks_per_voting_period} } ->
|
||||||
|
Block.bake_n (Int32.to_int blocks_per_voting_period) b >>=? fun b ->
|
||||||
|
|
||||||
|
let del1 = List.nth delegates 0 in
|
||||||
|
let proposal = protos.(0) in
|
||||||
|
|
||||||
|
Op.proposals (B b) del1 [proposal] >>=? fun ops1 ->
|
||||||
|
Block.bake ~operations:[ops1] b >>=? fun b ->
|
||||||
|
Block.bake_n ((Int32.to_int blocks_per_voting_period)-1) b >>=? fun b ->
|
||||||
|
|
||||||
|
(* we remain in the proposal when there is no winner *)
|
||||||
|
Context.Vote.get_current_period_kind (B b) >>=? begin function
|
||||||
|
| Testing_vote -> return_unit
|
||||||
|
| _ -> failwith "%s - Unexpected period kind" __LOC__
|
||||||
|
end >>=? fun () ->
|
||||||
|
|
||||||
|
(* assert our proposal won *)
|
||||||
|
Context.Vote.get_current_proposal (B b) >>=? begin function
|
||||||
|
| Some v -> if Protocol_hash.(equal proposal v) then return_unit
|
||||||
|
else failwith "%s - Wrong proposal" __LOC__
|
||||||
|
| None -> failwith "%s - Missing proposal" __LOC__
|
||||||
|
end >>=? fun () ->
|
||||||
|
|
||||||
|
(* majority/minority vote depending on the [ok] parameter *)
|
||||||
|
filter_s
|
||||||
|
(fun del ->
|
||||||
|
Context.Contract.pkh del >>=? fun pkh ->
|
||||||
|
Context.Delegate.info (B b) pkh >>=? fun {deactivated} -> return (not deactivated))
|
||||||
|
delegates >>=? fun active_delegates ->
|
||||||
|
|
||||||
|
let num_delegates = List.length active_delegates in
|
||||||
|
let num_nays = num_delegates / 5 in
|
||||||
|
let num_yays = num_nays * 4 in
|
||||||
|
let num_yays = if supermajority then num_yays else num_yays - 1 in
|
||||||
|
|
||||||
|
let open Alpha_context in
|
||||||
|
|
||||||
|
let nays_delegates, rest = List.split_n num_nays active_delegates in
|
||||||
|
let yays_delegates, _ = List.split_n num_yays rest in
|
||||||
|
map_s (fun del ->
|
||||||
|
Op.ballot (B b) del proposal Vote.Yay)
|
||||||
|
yays_delegates >>=? fun operations_yays ->
|
||||||
|
map_s (fun del ->
|
||||||
|
Op.ballot (B b) del proposal Vote.Nay)
|
||||||
|
nays_delegates >>=? fun operations_nays ->
|
||||||
|
let operations = operations_yays @ operations_nays in
|
||||||
|
|
||||||
|
Block.bake ~operations b >>=? fun b ->
|
||||||
|
Block.bake_n ((Int32.to_int blocks_per_voting_period)-1) b >>=? fun b ->
|
||||||
|
|
||||||
|
Context.Vote.get_current_period_kind (B b) >>=? begin function
|
||||||
|
| Testing ->
|
||||||
|
if supermajority then return_unit
|
||||||
|
else failwith "%s - Expected period kind Proposal, obtained Testing" __LOC__
|
||||||
|
| Proposal ->
|
||||||
|
if not supermajority then return_unit
|
||||||
|
else failwith "%s - Expected period kind Proposal, obtained Testing_vote" __LOC__
|
||||||
|
| _ -> failwith "%s - Unexpected period kind" __LOC__
|
||||||
|
end >>=? fun () ->
|
||||||
|
|
||||||
|
return_unit
|
||||||
|
|
||||||
|
|
||||||
let tests = [
|
let tests = [
|
||||||
Test.tztest "voting" `Quick (test_voting) ;
|
Test.tztest "voting" `Quick (test_voting) ;
|
||||||
|
Test.tztest "voting: test period 1" `Quick (test_period1) ;
|
||||||
|
Test.tztest "voting: test period 2, with supermajority" `Quick (test_period2_supermajority true) ;
|
||||||
|
Test.tztest "voting: test period 2, without supermajority" `Quick (test_period2_supermajority false) ;
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user