@@ -527,4 +527,67 @@ TEST_CASE("Transition with list index can be compared to a number", "[silver]")
527527 artboard->draw (renderer.get ());
528528
529529 CHECK (silver.matches (" transition_index_condition" ));
530+ }
531+
532+ TEST_CASE (" Listeners are sorted in the right order" , " [silver]" )
533+ {
534+ SerializingFactory silver;
535+ auto file = ReadRiveFile (" assets/sorted_listeners.riv" , &silver);
536+
537+ auto artboard = file->artboardDefault ();
538+ silver.frameSize (artboard->width (), artboard->height ());
539+
540+ auto stateMachine = artboard->stateMachineAt (0 );
541+
542+ auto vmi = file->createViewModelInstance (artboard.get ());
543+
544+ stateMachine->bindViewModelInstance (vmi);
545+ stateMachine->advanceAndApply (0 .0f );
546+ auto renderer = silver.makeRenderer ();
547+ artboard->draw (renderer.get ());
548+
549+ // Down (Move + Down happen on the same frame, but down happens after move)
550+ silver.addFrame ();
551+ stateMachine->pointerDown (Vec2D (250 .0f , 250 .0f ), 0 );
552+ stateMachine->advanceAndApply (0 .016f );
553+ artboard->draw (renderer.get ());
554+
555+ // Click (Up + Click on same frame, but click happens after up)
556+ silver.addFrame ();
557+ stateMachine->pointerUp (Vec2D (250 .0f , 250 .0f ), 0 );
558+ stateMachine->advanceAndApply (0 .016f );
559+ artboard->draw (renderer.get ());
560+
561+ // Exit
562+ silver.addFrame ();
563+ stateMachine->pointerMove (Vec2D (0 .0f , 0 .0f ), 0 , 0 );
564+ stateMachine->advanceAndApply (0 .016f );
565+ artboard->draw (renderer.get ());
566+
567+ // Drag gesture
568+ silver.addFrame ();
569+ stateMachine->pointerDown (Vec2D (250 .0f , 250 .0f ), 0 );
570+ stateMachine->pointerMove (Vec2D (251 .0f , 251 .0f ), 0 );
571+ stateMachine->advanceAndApply (0 .016f );
572+ artboard->draw (renderer.get ());
573+
574+ // Up
575+ silver.addFrame ();
576+ stateMachine->pointerUp (Vec2D (251 .0f , 251 .0f ), 0 );
577+ stateMachine->advanceAndApply (0 .016f );
578+ artboard->draw (renderer.get ());
579+
580+ // Exit
581+ silver.addFrame ();
582+ stateMachine->pointerMove (Vec2D (0 .0f , 0 .0f ), 0 );
583+ stateMachine->advanceAndApply (0 .016f );
584+ artboard->draw (renderer.get ());
585+
586+ // (Move): Enter + Move, but move happens after enter
587+ silver.addFrame ();
588+ stateMachine->pointerMove (Vec2D (251 .0f , 251 .0f ), 0 );
589+ stateMachine->advanceAndApply (0 .016f );
590+ artboard->draw (renderer.get ());
591+
592+ CHECK (silver.matches (" sorted_listeners" ));
530593}
0 commit comments