from hydra import compose, initialize from omegaconf import OmegaConf from brittle_star_project.configs.main_config import BrittleStarConfig from brittle_star_project.configs.register_configs import register_configs # Registration must happen before composition to enable validation against schemas register_configs() def test_config_composition_centralized(): """Test that the centralized configuration composes and validates correctly.""" with initialize(version_base="1.3", config_path="../configs"): # We compose the config; it follows main_config.yaml cfg = compose(config_name="main_config", overrides=["architecture=centralized"]) # Merge with the dataclass class to get a structured DictConfig, # then convert to a real dataclass instance to verify validation. structured_cfg = OmegaConf.to_object(OmegaConf.merge(BrittleStarConfig, cfg)) # Basic assertions assert structured_cfg.architecture.name == "centralized" assert structured_cfg.architecture.propagator is None assert isinstance(structured_cfg.ppo.learning_rate, float) assert structured_cfg.ppo.learning_rate > 0 def test_config_composition_decentralized(): """Test that the decentralized configuration composes and validates correctly.""" with initialize(version_base="1.3", config_path="../configs"): cfg = compose(config_name="main_config", overrides=["architecture=decentralized"]) # Merge and convert to dataclass instance structured_cfg = OmegaConf.to_object(OmegaConf.merge(BrittleStarConfig, cfg)) # Basic assertions assert structured_cfg.architecture.name == "decentralized" assert isinstance(structured_cfg.ppo.learning_rate, float) assert structured_cfg.ppo.learning_rate > 0 # Decentralized specifics assert hasattr(structured_cfg.architecture, "message_passing_steps") assert structured_cfg.architecture.message_passing_steps > 0