@@ -4,7 +4,9 @@ use jacquard_cast_support::{
44 shape_multicast_evidence, CastEvidenceBounds , CastEvidenceMeta , CastEvidencePolicy ,
55 CastGroupId , MulticastObservation , ReceiverCoverageObservation ,
66} ;
7- use jacquard_core:: { ByteCount , DurationMs , NodeId , OrderStamp , RatioPermille , Tick } ;
7+ use jacquard_core:: {
8+ ByteCount , DurationMs , MulticastGroupId , NodeId , OrderStamp , RatioPermille , Tick ,
9+ } ;
810
911fn node ( byte : u8 ) -> NodeId {
1012 NodeId ( [ byte; 32 ] )
@@ -39,20 +41,20 @@ fn receiver(byte: u8, confidence: u16) -> ReceiverCoverageObservation {
3941 }
4042}
4143
42- fn group ( name : & [ u8 ] ) -> CastGroupId {
43- CastGroupId ( name . to_vec ( ) )
44+ fn group ( byte : u8 ) -> CastGroupId {
45+ CastGroupId :: new ( MulticastGroupId ( [ byte ; 16 ] ) )
4446}
4547
4648fn observation (
47- name : & [ u8 ] ,
49+ group_byte : u8 ,
4850 receivers : Vec < ReceiverCoverageObservation > ,
4951 pressure : u16 ,
5052 fanout : u32 ,
5153 order : u64 ,
5254) -> MulticastObservation {
5355 MulticastObservation {
5456 sender : node ( 1 ) ,
55- group_id : group ( name ) ,
57+ group_id : group ( group_byte ) ,
5658 receivers,
5759 group_pressure_permille : RatioPermille ( pressure) ,
5860 fanout_limit : fanout,
@@ -65,7 +67,7 @@ fn observation(
6567fn multicast_full_and_partial_coverage_are_explicit ( ) {
6668 let ( evidence, _report) = shape_multicast_evidence (
6769 [ observation (
68- b"team" ,
70+ 1 ,
6971 vec ! [ receiver( 2 , 800 ) , receiver( 3 , 700 ) ] ,
7072 100 ,
7173 2 ,
@@ -86,26 +88,23 @@ fn multicast_full_and_partial_coverage_are_explicit() {
8688fn multicast_group_pressure_reduces_ranking ( ) {
8789 let ( evidence, _report) = shape_multicast_evidence (
8890 [
89- observation ( b"quiet" , vec ! [ receiver( 2 , 800 ) ] , 100 , 1 , 1 ) ,
90- observation ( b"loaded" , vec ! [ receiver( 3 , 800 ) ] , 900 , 1 , 2 ) ,
91+ observation ( 1 , vec ! [ receiver( 2 , 800 ) ] , 100 , 1 , 1 ) ,
92+ observation ( 2 , vec ! [ receiver( 3 , 800 ) ] , 900 , 1 , 2 ) ,
9193 ] ,
9294 policy ( ) ,
9395 ) ;
9496
95- assert_eq ! ( evidence[ 0 ] . group_id, group( b"quiet" ) ) ;
96- assert_eq ! ( evidence[ 1 ] . group_id, group( b"loaded" ) ) ;
97+ assert_eq ! ( evidence[ 0 ] . group_id, group( 1 ) ) ;
98+ assert_eq ! ( evidence[ 1 ] . group_id, group( 2 ) ) ;
9799}
98100
99101#[ test]
100102fn multicast_stale_group_evidence_and_bounded_fanout_are_omitted ( ) {
101- let mut stale = observation ( b"stale" , vec ! [ receiver( 2 , 800 ) ] , 100 , 1 , 1 ) ;
103+ let mut stale = observation ( 1 , vec ! [ receiver( 2 , 800 ) ] , 100 , 1 , 1 ) ;
102104 stale. meta = meta ( 1_001 , 1 ) ;
103105
104106 let ( evidence, report) = shape_multicast_evidence (
105- [
106- stale,
107- observation ( b"wide" , vec ! [ receiver( 3 , 800 ) ] , 100 , 4 , 2 ) ,
108- ] ,
107+ [ stale, observation ( 2 , vec ! [ receiver( 3 , 800 ) ] , 100 , 4 , 2 ) ] ,
109108 policy ( ) ,
110109 ) ;
111110
@@ -117,14 +116,14 @@ fn multicast_stale_group_evidence_and_bounded_fanout_are_omitted() {
117116#[ test]
118117fn multicast_receiver_order_is_stable_across_input_ordering ( ) {
119118 let first = observation (
120- b"group" ,
119+ 1 ,
121120 vec ! [ receiver( 4 , 700 ) , receiver( 2 , 900 ) , receiver( 3 , 800 ) ] ,
122121 100 ,
123122 3 ,
124123 1 ,
125124 ) ;
126125 let second = observation (
127- b"group" ,
126+ 1 ,
128127 vec ! [ receiver( 3 , 800 ) , receiver( 2 , 900 ) , receiver( 4 , 700 ) ] ,
129128 100 ,
130129 3 ,
@@ -149,7 +148,7 @@ fn multicast_receiver_order_is_stable_across_input_ordering() {
149148fn multicast_low_confidence_receivers_do_not_force_all_or_nothing_delivery ( ) {
150149 let ( evidence, _report) = shape_multicast_evidence (
151150 [ observation (
152- b"mixed" ,
151+ 1 ,
153152 vec ! [ receiver( 2 , 800 ) , receiver( 3 , 400 ) , receiver( 4 , 700 ) ] ,
154153 100 ,
155154 3 ,
@@ -168,3 +167,23 @@ fn multicast_low_confidence_receivers_do_not_force_all_or_nothing_delivery() {
168167 vec![ node( 2 ) , node( 4 ) ]
169168 ) ;
170169}
170+
171+ #[ test]
172+ fn route_group_identity_is_direct_and_stable ( ) {
173+ let id = MulticastGroupId ( [ 9 ; 16 ] ) ;
174+
175+ assert_eq ! ( CastGroupId :: new( id) . to_route_group_id( ) , id) ;
176+ }
177+
178+ #[ test]
179+ fn route_group_identity_distinguishes_explicit_ids_with_shared_prefix ( ) {
180+ let mut left = [ 7 ; 16 ] ;
181+ let mut right = [ 7 ; 16 ] ;
182+ left[ 15 ] = 1 ;
183+ right[ 15 ] = 2 ;
184+
185+ assert_ne ! (
186+ CastGroupId :: new( MulticastGroupId ( left) ) . to_route_group_id( ) ,
187+ CastGroupId :: new( MulticastGroupId ( right) ) . to_route_group_id( )
188+ ) ;
189+ }
0 commit comments