@@ -154,3 +154,69 @@ def test_trim():
154154 RouteMapRule (addr_range = AddrRange (start = 31 , end = 40 ), dest = SimpleId (id = 2 )),
155155 ]
156156 assert routing_table .rules == expected_rules
157+
158+
159+ def test_rdl_addrmap_grp_addr_range_scalar_and_list ():
160+ """Test that a scalar or list rdl_addrmap_grp both normalize to a List[str]."""
161+ ar_scalar = AddrRange (start = 0 , end = 0x1000 , rdl_addrmap_grp = "32b" )
162+ ar_list = AddrRange (start = 0 , end = 0x1000 , rdl_addrmap_grp = ["32b" , "64b" ])
163+ assert ar_scalar .rdl_addrmap_grp == ["32b" ]
164+ assert ar_list .rdl_addrmap_grp == ["32b" , "64b" ]
165+
166+
167+ def test_route_map_distinct_groups ():
168+ """Test that distinct_groups() collects the sorted set of groups across all rules."""
169+ rule1 = RouteMapRule (addr_range = AddrRange (start = 0 , end = 10 , rdl_addrmap_grp = ["32b" , "64b" ]),
170+ dest = SimpleId (id = 1 ))
171+ rule2 = RouteMapRule (addr_range = AddrRange (start = 10 , end = 20 , rdl_addrmap_grp = ["32b" ]),
172+ dest = SimpleId (id = 2 ))
173+ rule3 = RouteMapRule (addr_range = AddrRange (start = 20 , end = 30 ), dest = SimpleId (id = 3 ))
174+ route_map = RouteMap (name = "sam" , rules = [rule1 , rule2 , rule3 ])
175+ assert route_map .distinct_groups () == ["32b" , "64b" ]
176+
177+
178+ def test_route_map_filter_by_group ():
179+ """Test filtering a RouteMap by group, keeping untagged rules in every group."""
180+ rule1 = RouteMapRule (addr_range = AddrRange (start = 0 , end = 10 , rdl_addrmap_grp = ["32b" , "64b" ]),
181+ dest = SimpleId (id = 1 ), desc = "endpoint1" )
182+ rule2 = RouteMapRule (addr_range = AddrRange (start = 10 , end = 20 , rdl_addrmap_grp = ["32b" ]),
183+ dest = SimpleId (id = 2 ), desc = "endpoint2" )
184+ rule3 = RouteMapRule (addr_range = AddrRange (start = 20 , end = 30 , rdl_addrmap_grp = ["64b" ]),
185+ dest = SimpleId (id = 3 ), desc = "endpoint3" )
186+ route_map = RouteMap (name = "sam" , rules = [rule1 , rule2 , rule3 ])
187+
188+ grp_32b = route_map .filter_by_group ("32b" )
189+ assert {r .desc for r in grp_32b .rules } == {"endpoint1" , "endpoint2" }
190+
191+ grp_64b = route_map .filter_by_group ("64b" )
192+ assert {r .desc for r in grp_64b .rules } == {"endpoint1" , "endpoint3" }
193+
194+
195+ def test_route_map_filter_by_group_includes_untagged ():
196+ """Test that untagged rules are included in every group's filtered RouteMap."""
197+ tagged = RouteMapRule (addr_range = AddrRange (start = 0 , end = 10 , rdl_addrmap_grp = ["32b" ]),
198+ dest = SimpleId (id = 1 ), desc = "tagged" )
199+ untagged = RouteMapRule (addr_range = AddrRange (start = 10 , end = 20 ), dest = SimpleId (id = 2 ),
200+ desc = "untagged" )
201+ route_map = RouteMap (name = "sam" , rules = [tagged , untagged ])
202+
203+ grp_32b = route_map .filter_by_group ("32b" )
204+ assert {r .desc for r in grp_32b .rules } == {"tagged" , "untagged" }
205+
206+ grp_64b = route_map .filter_by_group ("64b" )
207+ assert {r .desc for r in grp_64b .rules } == {"untagged" }
208+
209+
210+ def test_rdl_addrmap_grp_differs_per_addr_range_of_same_endpoint ():
211+ """Test that two addr_ranges of the same endpoint can belong to different groups."""
212+ narrow_range = RouteMapRule (addr_range = AddrRange (start = 0 , end = 10 , rdl_addrmap_grp = "32b" ),
213+ dest = SimpleId (id = 1 ), desc = "ep_narrow" )
214+ wide_range = RouteMapRule (addr_range = AddrRange (start = 10 , end = 20 , rdl_addrmap_grp = "64b" ),
215+ dest = SimpleId (id = 1 ), desc = "ep_wide" )
216+ route_map = RouteMap (name = "sam" , rules = [narrow_range , wide_range ])
217+
218+ grp_32b = route_map .filter_by_group ("32b" )
219+ assert {r .desc for r in grp_32b .rules } == {"ep_narrow" }
220+
221+ grp_64b = route_map .filter_by_group ("64b" )
222+ assert {r .desc for r in grp_64b .rules } == {"ep_wide" }
0 commit comments