diff --git a/pallets/distance/src/tests.rs b/pallets/distance/src/tests.rs index 9443682b7b0ec292bc49511c47b1fb58a5bc0a12..2524d8e86125f3167935321b5cdba55b877dc135 100644 --- a/pallets/distance/src/tests.rs +++ b/pallets/distance/src/tests.rs @@ -16,6 +16,7 @@ use crate::mock::*; use crate::DistanceStatus::{Pending, Valid}; +use crate::MedianResult::One; use crate::{pallet, Error, MedianAcc, MedianResult}; use frame_support::traits::Len; use frame_support::{assert_err, assert_noop, assert_ok}; @@ -211,7 +212,130 @@ fn distance_failure() { System::assert_has_event(RuntimeEvent::Distance(pallet::Event::EvaluationFailure { 0: *IDTY_0, })); - // TODO: test: variant Two + }); +} + +#[test] +fn distance_with_odd_median() { + new_test_ext().execute_with(|| { + run_to_block(SESSION_0_START); + assert_ok!(Distance::evaluate_distance(RuntimeOrigin::signed(0))); + assert_eq!( + pallet::IdentitiesDistanceStatus::<Test>::get(IDTY_0), + Some(Pending) + ); + + // Evaluation #1 + run_to_block(SESSION_2_START); + assert_ok!(Distance::update_evaluation( + RuntimeOrigin::none(), + ComputationResult { + distances: vec![Perbill::from_percent(70)] + } + )); + // Evaluation #2 + run_to_block(SESSION_2_START + 1); + assert_ok!(Distance::update_evaluation( + RuntimeOrigin::none(), + ComputationResult { + distances: vec![Perbill::from_percent(80)] + } + )); + // Evaluation #3 + run_to_block(SESSION_2_START + 2); + assert_ok!(Distance::update_evaluation( + RuntimeOrigin::none(), + ComputationResult { + distances: vec![Perbill::from_percent(80)] + } + )); + + // Check the median result + let pool = pallet::EvaluationPool2::<Test>::get(); + let (_, median) = pool.0.get(0).unwrap(); + assert_eq!(median.get_median(), Some(One(Perbill::from_percent(80)))); + + // Finally session 4 + run_to_block(SESSION_3_START); + // distance failure + assert_eq!( + pallet::IdentitiesDistanceStatus::<Test>::get(IDTY_0), + Some(Valid) + ); + System::assert_has_event(RuntimeEvent::Distance(pallet::Event::EvaluationSuccess { + 0: *IDTY_0, + })); + }); +} + +#[test] +fn distance_with_even_median() { + new_test_ext().execute_with(|| { + run_to_block(SESSION_0_START); + assert_ok!(Distance::evaluate_distance(RuntimeOrigin::signed(0))); + assert_eq!( + pallet::IdentitiesDistanceStatus::<Test>::get(IDTY_0), + Some(Pending) + ); + + // Evaluation #1 + run_to_block(SESSION_2_START); + assert_ok!(Distance::update_evaluation( + RuntimeOrigin::none(), + ComputationResult { + distances: vec![Perbill::from_percent(70)] + } + )); + // Evaluation #2 + run_to_block(SESSION_2_START + 1); + assert_ok!(Distance::update_evaluation( + RuntimeOrigin::none(), + ComputationResult { + distances: vec![Perbill::from_percent(90)] + } + )); + + // Check the median result + let pool = pallet::EvaluationPool2::<Test>::get(); + let (_, median) = pool.0.get(0).unwrap(); + assert_eq!( + median.get_median(), + Some(MedianResult::Two( + Perbill::from_percent(70), + Perbill::from_percent(90) + )) + ); + + // Finally session 4 + run_to_block(SESSION_3_START); + // distance failure + assert_eq!( + pallet::IdentitiesDistanceStatus::<Test>::get(IDTY_0), + Some(Valid) + ); + System::assert_has_event(RuntimeEvent::Distance(pallet::Event::EvaluationSuccess { + 0: *IDTY_0, + })); + }); +} + +#[test] +fn distance_not_processed() { + new_test_ext().execute_with(|| { + run_to_block(SESSION_0_START); + assert_ok!(Distance::evaluate_distance(RuntimeOrigin::signed(0))); + assert_eq!( + pallet::IdentitiesDistanceStatus::<Test>::get(IDTY_0), + Some(Pending) + ); + + // Directly to session S+3 + run_to_block(SESSION_3_START); + // distance failure + assert_eq!(pallet::IdentitiesDistanceStatus::<Test>::get(IDTY_0), None); // Pending has gone + System::assert_has_event(RuntimeEvent::Distance( + pallet::Event::EvaluationNotProcessed { 0: *IDTY_0 }, + )); }); } @@ -221,7 +345,7 @@ fn distance_failure() { // } // TODO: evaluate_distance => Err::NoIdentity -// TODO: evaluate_distance => Err::AlreadyInEvaluation +// TODO: evaluate_distance => Err::AlreadyInEvaluation ==> devrait être correctement levée depuis l'ajout de Pending // TODO: evaluate_distance => Err::QueueFull (1) // TODO: evaluate_distance => Err::QueueFull (2) // TODO: Err::ManyEvaluationsInBlock