@@ -426,12 +426,59 @@ void test_simulation_reconciliation(float p_frame_confirmation_timespan) {
426426 // Run another 30 frames.
427427 test.do_test (30 );
428428
429- // Make sure there was 1 desyc
430- ASSERT_COND (test.peer1_desync_detected .size () == 1 );
431- ASSERT_COND (test.peer2_desync_detected .size () == 1 );
429+ // Make sure the reconciliation was successful.
430+ // NOTE: 45 is a margin established basing on the `p_frame_confirmation_timespan`.
431+ const NS::FrameIndex ensure_no_desync_after{ 45 };
432+ test.assert_no_desync (ensure_no_desync_after, ensure_no_desync_after);
432433
433434 // and despite that the simulations are correct.
434- test.assert_positions (test.peer1_desync_detected .front (), test.peer2_desync_detected .front ());
435+ test.assert_positions (ensure_no_desync_after, ensure_no_desync_after);
436+ }
437+
438+ void test_simulation_with_hiccups (TestDollSimulationStorePositions &test) {
439+ // Partially process.
440+ test.network_properties .rtt_seconds = 0.0 ;
441+
442+ {
443+ NS::FrameIndex controller_1_doll_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
444+ NS::FrameIndex controller_2_doll_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
445+
446+ for (int i = 0 ; i < 10 ; i++) {
447+ if (i % 2 == 0 ) {
448+ test.do_test (10 , false , true , false , true );
449+ } else {
450+ test.do_test (10 , false , true , true , false );
451+ }
452+
453+ const NS::FrameIndex controller_1_doll_new_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
454+ const NS::FrameIndex controller_2_doll_new_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
455+
456+ // Ensure the doll keep going forward.
457+ ASSERT_COND (controller_1_doll_frame_index == NS::FrameIndex::NONE || controller_1_doll_frame_index <= controller_1_doll_new_frame_index);
458+ ASSERT_COND (controller_2_doll_frame_index == NS::FrameIndex::NONE || controller_2_doll_frame_index <= controller_2_doll_new_frame_index);
459+
460+ controller_1_doll_frame_index = controller_1_doll_new_frame_index;
461+ controller_2_doll_frame_index = controller_2_doll_new_frame_index;
462+ }
463+ }
464+
465+ test.do_test (30 );
466+
467+ const NS::FrameIndex controller_1_last_player_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
468+ const NS::FrameIndex controller_2_last_player_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
469+
470+ const NS::FrameIndex controller_1_last_doll_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
471+ const NS::FrameIndex controller_2_last_doll_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
472+
473+ const int latency_factor = 15 ;
474+
475+ ASSERT_COND (controller_1_last_player_frame_index - latency_factor <= controller_1_last_doll_frame_index);
476+ ASSERT_COND (controller_2_last_player_frame_index - latency_factor <= controller_2_last_doll_frame_index);
477+
478+ // Make sure the last frames are identical.
479+ test.assert_positions (
480+ test.peer1_desync_detected .back (),
481+ test.peer2_desync_detected .back ());
435482}
436483
437484void test_simulation_with_latency () {
@@ -527,106 +574,16 @@ void test_simulation_with_latency() {
527574 controller_2_last_player_frame_index - latency_factor);
528575 }
529576
530- // TODO test this again.
531- // TODO consider to remove this or leave it.
532577 // Partially process.
533- {
534- test.network_properties .rtt_seconds = 0.0 ;
535-
536- {
537- NS::FrameIndex controller_1_doll_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
538- NS::FrameIndex controller_2_doll_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
539-
540- for (int i = 0 ; i < 10 ; i++) {
541- if (i % 2 == 0 ) {
542- test.do_test (10 , false , true , false , true );
543- } else {
544- test.do_test (10 , false , true , true , false );
545- }
546-
547- const NS::FrameIndex controller_1_doll_new_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
548- const NS::FrameIndex controller_2_doll_new_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
549-
550- // Ensure the doll keep going forward.
551- ASSERT_COND (controller_1_doll_frame_index <= controller_1_doll_new_frame_index);
552- ASSERT_COND (controller_2_doll_frame_index <= controller_2_doll_new_frame_index);
553-
554- controller_1_doll_frame_index = controller_1_doll_new_frame_index;
555- controller_2_doll_frame_index = controller_2_doll_new_frame_index;
556- }
557- }
558-
559- test.do_test (10 );
560-
561- const NS::FrameIndex controller_1_last_player_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
562- const NS::FrameIndex controller_2_last_player_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
563-
564- const NS::FrameIndex controller_1_last_doll_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
565- const NS::FrameIndex controller_2_last_doll_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
566-
567- const int latency_factor = 15 ;
568-
569- ASSERT_COND (controller_1_last_player_frame_index - latency_factor <= controller_1_last_doll_frame_index);
570- ASSERT_COND (controller_2_last_player_frame_index - latency_factor <= controller_2_last_doll_frame_index);
571-
572- test.assert_positions (
573- controller_1_last_player_frame_index - latency_factor,
574- controller_2_last_player_frame_index - latency_factor);
575- }
576-
577- int a = 0 ;
578+ test_simulation_with_hiccups (test);
578579}
579580
580581void test_simulation_with_hiccups () {
581582 TestDollSimulationStorePositions test;
582583 test.frame_confirmation_timespan = 1.0 / 10.0 ;
583584 test.init_test ();
584585
585- // Partially process.
586- test.network_properties .rtt_seconds = 0.0 ;
587-
588- {
589- NS::FrameIndex controller_1_doll_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
590- NS::FrameIndex controller_2_doll_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
591-
592- for (int i = 0 ; i < 10 ; i++) {
593- if (i % 2 == 0 ) {
594- test.do_test (10 , false , true , false , true );
595- } else {
596- test.do_test (10 , false , true , true , false );
597- }
598-
599- const NS::FrameIndex controller_1_doll_new_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
600- const NS::FrameIndex controller_2_doll_new_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
601-
602- // Ensure the doll keep going forward.
603- ASSERT_COND (controller_1_doll_frame_index == NS::FrameIndex::NONE || controller_1_doll_frame_index <= controller_1_doll_new_frame_index);
604- ASSERT_COND (controller_2_doll_frame_index == NS::FrameIndex::NONE || controller_2_doll_frame_index <= controller_2_doll_new_frame_index);
605-
606- controller_1_doll_frame_index = controller_1_doll_new_frame_index;
607- controller_2_doll_frame_index = controller_2_doll_new_frame_index;
608- }
609- }
610-
611- test.do_test (30 );
612-
613- const NS::FrameIndex controller_1_last_player_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
614- const NS::FrameIndex controller_2_last_player_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
615-
616- const NS::FrameIndex controller_1_last_doll_frame_index = test.peer_2_scene .scene_sync ->get_controller_for_peer (test.peer_1_scene .get_peer ())->get_current_frame_index ();
617- const NS::FrameIndex controller_2_last_doll_frame_index = test.peer_1_scene .scene_sync ->get_controller_for_peer (test.peer_2_scene .get_peer ())->get_current_frame_index ();
618-
619- const int latency_factor = 15 ;
620-
621- ASSERT_COND (controller_1_last_player_frame_index - latency_factor <= controller_1_last_doll_frame_index);
622- ASSERT_COND (controller_2_last_player_frame_index - latency_factor <= controller_2_last_doll_frame_index);
623-
624- // Make sure the last frames are identical.
625- test.assert_positions (
626- test.peer1_desync_detected .back (),
627- test.peer2_desync_detected .back ());
628-
629- int a = 0 ;
586+ test_simulation_with_hiccups (test);
630587}
631588
632589void test_latency () {
@@ -675,9 +632,9 @@ void test_doll_simulation() {
675632 // test_simulation_without_reconciliation(0.0);
676633 // test_simulation_without_reconciliation(1. / 30.);
677634 // test_simulation_reconciliation(0.0);
678- test_simulation_reconciliation (1.0 / 10.0 );
635+ // test_simulation_reconciliation(1.0 / 10.0);
679636 // test_simulation_with_latency();
680- // test_simulation_with_hiccups();
637+ test_simulation_with_hiccups ();
681638 // TODO test with great latency and lag compensation.
682639 // test_latency();
683640
0 commit comments