"""Tests for common CLI utilities.""" import os import tempfile import pytest import yaml from ria_toolkit_oss.ria_toolkit_oss_cli.ria_toolkit_oss.common import ( format_frequency, format_sample_rate, load_yaml_config, parse_frequency, parse_metadata_args, ) def test_load_yaml_config(): """Test loading YAML configuration files.""" config_data = { "device": "pluto", "sample_rate": 2e6, "center_frequency": "915e6", "gain": 30, "metadata": {"location": "test_lab", "experiment": "test_001"}, } with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f: yaml.dump(config_data, f) config_file = f.name try: loaded_config = load_yaml_config(config_file) assert loaded_config == config_data assert loaded_config["device"] == "pluto" assert loaded_config["sample_rate"] == 2e6 assert loaded_config["metadata"]["location"] == "test_lab" finally: os.unlink(config_file) def test_load_yaml_config_empty(): """Test loading empty YAML file.""" with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f: f.write("") config_file = f.name try: loaded_config = load_yaml_config(config_file) assert loaded_config == {} finally: os.unlink(config_file) def test_parse_metadata_args(): """Test parsing metadata KEY=VALUE arguments.""" metadata_args = ["location=test_lab", "experiment=001", "power=30", "frequency=2.4e9", "description=Test Signal"] result = parse_metadata_args(metadata_args) assert result["location"] == "test_lab" assert result["experiment"] == "001" # String because doesn't parse as number assert result["power"] == 30 # Integer assert result["frequency"] == 2.4e9 # Float assert result["description"] == "Test Signal" def test_parse_metadata_args_invalid(): """Test invalid metadata format raises error.""" from click.exceptions import ClickException with pytest.raises(ClickException): parse_metadata_args(["invalid_format"]) with pytest.raises(ClickException): parse_metadata_args(["key1=value1", "invalid", "key2=value2"]) def test_parse_frequency(): """Test frequency parsing with different formats.""" # Scientific notation assert parse_frequency("915e6") == 915e6 assert parse_frequency("2.4e9") == 2.4e9 assert parse_frequency("433e6") == 433e6 # With suffixes assert parse_frequency("915M") == 915e6 assert parse_frequency("2.4G") == 2.4e9 assert parse_frequency("433M") == 433e6 assert parse_frequency("100k") == 100e3 assert parse_frequency("100K") == 100e3 # Plain numbers assert parse_frequency("915000000") == 915e6 assert parse_frequency("2400000000") == 2.4e9 # Edge cases assert parse_frequency("0.915G") == 915e6 assert parse_frequency("915.0M") == 915e6 def test_format_frequency(): """Test frequency formatting.""" assert format_frequency(915e6) == "915.00 MHz" assert format_frequency(2.4e9) == "2.40 GHz" assert format_frequency(433e6) == "433.00 MHz" assert format_frequency(100e3) == "100.00 kHz" assert format_frequency(1e3) == "1.00 kHz" assert format_frequency(500) == "500.00 Hz" def test_format_sample_rate(): """Test sample rate formatting.""" assert format_sample_rate(20e6) == "20.00 MS/s" assert format_sample_rate(2e6) == "2.00 MS/s" assert format_sample_rate(100e3) == "100.00 kS/s" assert format_sample_rate(1e3) == "1.00 kS/s" assert format_sample_rate(500) == "500.00 S/s"