@@ -483,3 +483,60 @@ async def test_matryoshka_drop_old_proposals() -> None:
483483 must_send = True ,
484484 batteries = overlapping_batteries ,
485485 )
486+
487+
488+ async def test_matryoshka_none_proposals () -> None :
489+ """Tests for the power managing actor.
490+
491+ When a `None` proposal is received, is source id should be dropped from the bucket.
492+ Then if the bucket becomes empty, it should be dropped as well.
493+ """
494+ batteries = frozenset ({2 , 5 })
495+ overlapping_batteries = frozenset ({5 , 8 })
496+
497+ system_bounds = _base_types .SystemBounds (
498+ timestamp = datetime .now (tz = timezone .utc ),
499+ inclusion_bounds = timeseries .Bounds (
500+ lower = Power .from_watts (- 200.0 ), upper = Power .from_watts (200.0 )
501+ ),
502+ exclusion_bounds = timeseries .Bounds (lower = Power .zero (), upper = Power .zero ()),
503+ )
504+
505+ def ensure_overlapping_bucket_request_fails () -> None :
506+ with pytest .raises (
507+ NotImplementedError ,
508+ match = re .escape (
509+ "PowerManagingActor: component IDs frozenset({8, 5}) are already "
510+ + "part of another bucket. Overlapping buckets are not yet supported."
511+ ),
512+ ):
513+ tester .tgt_power (
514+ priority = 1 ,
515+ power = None ,
516+ bounds = (20.0 , 50.0 ),
517+ expected = None ,
518+ must_send = True ,
519+ batteries = overlapping_batteries ,
520+ )
521+
522+ tester = StatefulTester (batteries , system_bounds )
523+
524+ tester .tgt_power (priority = 3 , power = 22.0 , bounds = (22.0 , 30.0 ), expected = 22.0 )
525+ tester .tgt_power (priority = 2 , power = 25.0 , bounds = (25.0 , 50.0 ), expected = 25.0 )
526+ tester .tgt_power (priority = 1 , power = 20.0 , bounds = (20.0 , 50.0 ), expected = None )
527+
528+ ensure_overlapping_bucket_request_fails ()
529+ tester .tgt_power (priority = 1 , power = None , bounds = (None , None ), expected = None )
530+ ensure_overlapping_bucket_request_fails ()
531+ tester .tgt_power (priority = 3 , power = None , bounds = (None , None ), expected = None )
532+ ensure_overlapping_bucket_request_fails ()
533+ tester .tgt_power (priority = 2 , power = None , bounds = (None , None ), expected = None )
534+
535+ # Overlapping battery bucket is dropped.
536+ tester .tgt_power (
537+ priority = 1 ,
538+ power = 20.0 ,
539+ bounds = (20.0 , 50.0 ),
540+ expected = 20.0 ,
541+ batteries = overlapping_batteries ,
542+ )
0 commit comments