"""Tests for configuration loading."""

from __future__ import annotations


import yaml

from obliteratus.config import StudyConfig


SAMPLE_CONFIG = {
    "model": {
        "name": "gpt2",
        "task": "causal_lm",
        "dtype": "float32",
        "device": "cpu",
    },
    "dataset": {
        "name": "wikitext",
        "subset": "wikitext-2-raw-v1",
        "split": "test",
        "text_column": "text",
        "max_samples": 50,
    },
    "strategies": [
        {"name": "layer_removal", "params": {}},
        {"name": "ffn_ablation", "params": {}},
    ],
    "metrics": ["perplexity"],
    "batch_size": 4,
    "max_length": 256,
    "output_dir": "results/test",
}


class TestStudyConfig:
    def test_from_dict(self):
        config = StudyConfig.from_dict(SAMPLE_CONFIG)
        assert config.model.name == "gpt2"
        assert config.model.task == "causal_lm"
        assert config.dataset.name == "wikitext"
        assert len(config.strategies) == 2
        assert config.strategies[0].name == "layer_removal"

    def test_from_yaml(self, tmp_path):
        yaml_path = tmp_path / "test_config.yaml"
        yaml_path.write_text(yaml.dump(SAMPLE_CONFIG))

        config = StudyConfig.from_yaml(yaml_path)
        assert config.model.name == "gpt2"
        assert config.batch_size == 4

    def test_roundtrip(self):
        config = StudyConfig.from_dict(SAMPLE_CONFIG)
        d = config.to_dict()
        config2 = StudyConfig.from_dict(d)
        assert config2.model.name == config.model.name
        assert config2.dataset.name == config.dataset.name
        assert len(config2.strategies) == len(config.strategies)
