Ttius's picture
Upload 192 files
998bb30 verified
import argparse
from pathlib import Path
import pytest
from anti_kd_backdoor.config import Config, DictAction
class TestConfig:
"""Modify from mmengine"""
data_path: Path = Path(__file__).parent.parent / 'data'
config_path: Path = data_path / 'config'
def test_fromfile(self) -> None:
config_path = self.config_path / 'cifar10_resnet18.py'
config = Config.fromfile(config_path)
assert config.dataset == 'CIFAR10'
assert config.network.type == 'resnet18'
assert config.test_dataloader.batch_size == 64
assert len(config.train_dataloader.dataset.transform) == 4
assert len(config.test_dataloader.dataset.transform) == 2
with pytest.raises(ValueError):
_ = Config.fromfile(self.config_path / 'error.txt')
def test_magic_method(self) -> None:
cfg_dict = dict(item1=[1, 2],
item2=dict(a=0),
item3=True,
item4='test')
cfg_file = self.config_path / 'simple_config.py'
cfg = Config.fromfile(cfg_file)
# len(cfg)
assert len(cfg) == 4
# cfg.keys()
assert set(cfg.keys()) == set(cfg_dict.keys())
assert set(cfg._cfg_dict.keys()) == set(cfg_dict.keys())
# cfg.values()
for value in cfg.values():
assert value in cfg_dict.values()
# cfg.items()
for name, value in cfg.items():
assert name in cfg_dict
assert value in cfg_dict.values()
# cfg.field
assert cfg.item1 == cfg_dict['item1']
assert cfg.item2 == cfg_dict['item2']
assert cfg.item2.a == 0
assert cfg.item3 == cfg_dict['item3']
assert cfg.item4 == cfg_dict['item4']
# accessing keys that do not exist will cause error
with pytest.raises(AttributeError):
cfg.not_exist
# field in cfg, cfg[field], cfg.get()
for name in ['item1', 'item2', 'item3', 'item4']:
assert name in cfg
assert cfg[name] == cfg_dict[name]
assert cfg.get(name) == cfg_dict[name]
assert cfg.get('not_exist') is None
assert cfg.get('not_exist', 0) == 0
# accessing keys that do not exist will cause error
with pytest.raises(KeyError):
cfg['not_exist']
assert 'item1' in cfg
assert 'not_exist' not in cfg
# cfg.update()
cfg.update(dict(item1=0))
assert cfg.item1 == 0
cfg.update(dict(item2=dict(a=1)))
assert cfg.item2.a == 1
# test __setattr__
cfg = Config()
cfg.item1 = [1, 2]
cfg.item2 = {'a': 0}
cfg['item5'] = {'a': {'b': None}}
assert cfg._cfg_dict['item1'] == [1, 2]
assert cfg.item1 == [1, 2]
assert cfg._cfg_dict['item2'] == {'a': 0}
assert cfg.item2.a == 0
assert cfg._cfg_dict['item5'] == {'a': {'b': None}}
assert cfg.item5.a.b is None
def test_dict_action(self):
parser = argparse.ArgumentParser(description='Train a detector')
parser.add_argument('--options',
nargs='+',
action=DictAction,
help='custom options')
# Nested brackets
args = parser.parse_args(
['--options', 'item2.a=a,b', 'item2.b=[(a,b), [1,2], false]'])
out_dict = {
'item2.a': ['a', 'b'],
'item2.b': [('a', 'b'), [1, 2], False]
}
assert args.options == out_dict
# Single Nested brackets
args = parser.parse_args(['--options', 'item2.a=[[1]]'])
out_dict = {'item2.a': [[1]]}
assert args.options == out_dict
# Imbalance bracket will cause error
with pytest.raises(AssertionError):
parser.parse_args(['--options', 'item2.a=[(a,b), [1,2], false'])
# Normal values
args = parser.parse_args([
'--options', 'item2.a=1', 'item2.b=0.1', 'item2.c=x', 'item3=false'
])
out_dict = {
'item2.a': 1,
'item2.b': 0.1,
'item2.c': 'x',
'item3': False
}
assert args.options == out_dict