2020-01-10 13:34:42 +08:00
|
|
|
# Copyright (c) Open-MMLab. All rights reserved.
|
2020-03-15 20:29:17 +08:00
|
|
|
import json
|
2018-08-27 20:25:52 +08:00
|
|
|
import os.path as osp
|
2020-03-16 15:15:35 +08:00
|
|
|
import sys
|
2018-08-27 20:25:52 +08:00
|
|
|
|
|
|
|
import pytest
|
2019-07-30 23:15:56 +08:00
|
|
|
|
2020-03-16 15:15:35 +08:00
|
|
|
from mmcv import Config
|
2018-08-27 20:25:52 +08:00
|
|
|
|
|
|
|
|
2018-10-07 17:45:41 +08:00
|
|
|
def test_construct():
|
2018-08-27 20:25:52 +08:00
|
|
|
cfg = Config()
|
|
|
|
assert cfg.filename is None
|
|
|
|
assert cfg.text == ''
|
|
|
|
assert len(cfg) == 0
|
|
|
|
assert cfg._cfg_dict == {}
|
|
|
|
|
2018-10-07 17:45:41 +08:00
|
|
|
with pytest.raises(TypeError):
|
|
|
|
Config([0, 1])
|
|
|
|
|
2020-03-15 20:29:17 +08:00
|
|
|
cfg_dict = dict(item1=[1, 2], item2=dict(a=0), item3=True, item4='test')
|
|
|
|
format_text = json.dumps(cfg_dict, indent=2)
|
|
|
|
for filename in ['a.py', 'b.json', 'c.yaml']:
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config', filename)
|
|
|
|
cfg = Config(cfg_dict, filename=cfg_file)
|
|
|
|
assert isinstance(cfg, Config)
|
|
|
|
assert cfg.filename == cfg_file
|
|
|
|
assert cfg.text == open(cfg_file, 'r').read()
|
2020-03-16 15:15:35 +08:00
|
|
|
if sys.version_info >= (3, 6):
|
|
|
|
assert cfg.dump() == format_text
|
|
|
|
else:
|
|
|
|
loaded = json.loads(cfg.dump())
|
|
|
|
assert set(loaded.keys()) == set(cfg_dict)
|
2020-03-15 20:29:17 +08:00
|
|
|
|
2018-08-27 20:25:52 +08:00
|
|
|
|
|
|
|
def test_fromfile():
|
2020-03-12 23:20:50 +08:00
|
|
|
for filename in ['a.py', 'a.b.py', 'b.json', 'c.yaml']:
|
2018-08-27 20:25:52 +08:00
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config', filename)
|
|
|
|
cfg = Config.fromfile(cfg_file)
|
|
|
|
assert isinstance(cfg, Config)
|
|
|
|
assert cfg.filename == cfg_file
|
2020-03-15 20:29:17 +08:00
|
|
|
assert cfg.text == osp.abspath(osp.expanduser(cfg_file)) + '\n' + \
|
|
|
|
open(cfg_file, 'r').read()
|
2018-08-27 20:25:52 +08:00
|
|
|
|
2018-09-20 14:15:12 +08:00
|
|
|
with pytest.raises(FileNotFoundError):
|
|
|
|
Config.fromfile('no_such_file.py')
|
2018-10-07 17:45:41 +08:00
|
|
|
with pytest.raises(IOError):
|
|
|
|
Config.fromfile(osp.join(osp.dirname(__file__), 'data/color.jpg'))
|
2018-08-27 20:25:52 +08:00
|
|
|
|
|
|
|
|
2020-03-15 20:29:17 +08:00
|
|
|
def test_merge_from_base():
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config/d.py')
|
|
|
|
cfg = Config.fromfile(cfg_file)
|
|
|
|
assert isinstance(cfg, Config)
|
|
|
|
assert cfg.filename == cfg_file
|
|
|
|
base_cfg_file = osp.join(osp.dirname(__file__), 'data/config/base.py')
|
|
|
|
merge_text = osp.abspath(osp.expanduser(base_cfg_file)) + '\n' + \
|
|
|
|
open(base_cfg_file, 'r').read()
|
|
|
|
merge_text += '\n' + osp.abspath(osp.expanduser(cfg_file)) + '\n' + \
|
|
|
|
open(cfg_file, 'r').read()
|
|
|
|
assert cfg.text == merge_text
|
|
|
|
assert cfg.item1 == [2, 3]
|
|
|
|
assert cfg.item2.a == 1
|
|
|
|
assert cfg.item3 is False
|
|
|
|
assert cfg.item4 == 'test_base'
|
|
|
|
|
|
|
|
with pytest.raises(TypeError):
|
|
|
|
Config.fromfile(osp.join(osp.dirname(__file__), 'data/config/e.py'))
|
|
|
|
|
|
|
|
|
|
|
|
def test_merge_from_multiple_bases():
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config/l.py')
|
|
|
|
cfg = Config.fromfile(cfg_file)
|
|
|
|
assert isinstance(cfg, Config)
|
|
|
|
assert cfg.filename == cfg_file
|
|
|
|
# cfg.field
|
|
|
|
assert cfg.item1 == [1, 2]
|
|
|
|
assert cfg.item2.a == 0
|
|
|
|
assert cfg.item3 is False
|
|
|
|
assert cfg.item4 == 'test'
|
|
|
|
|
|
|
|
with pytest.raises(KeyError):
|
|
|
|
Config.fromfile(osp.join(osp.dirname(__file__), 'data/config/m.py'))
|
|
|
|
|
|
|
|
|
|
|
|
def test_merge_recursive_bases():
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config/f.py')
|
|
|
|
cfg = Config.fromfile(cfg_file)
|
|
|
|
assert isinstance(cfg, Config)
|
|
|
|
assert cfg.filename == cfg_file
|
|
|
|
# cfg.field
|
|
|
|
assert cfg.item1 == [2, 3]
|
|
|
|
assert cfg.item2.a == 1
|
|
|
|
assert cfg.item3 is False
|
|
|
|
assert cfg.item4 == 'test_recursive_bases'
|
|
|
|
|
|
|
|
|
|
|
|
def test_merge_from_dict():
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config/a.py')
|
|
|
|
cfg = Config.fromfile(cfg_file)
|
|
|
|
input_options = {'item2.a': 1, 'item3': False}
|
|
|
|
cfg.merge_from_dict(input_options)
|
|
|
|
assert cfg.item2 == dict(a=1)
|
|
|
|
assert cfg.item3 is False
|
|
|
|
|
|
|
|
|
|
|
|
def test_merge_delete():
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config/delete.py')
|
|
|
|
cfg = Config.fromfile(cfg_file)
|
|
|
|
# cfg.field
|
|
|
|
assert cfg.item1 == [1, 2]
|
|
|
|
assert cfg.item2 == dict(b=0)
|
|
|
|
assert cfg.item3 is True
|
|
|
|
assert cfg.item4 == 'test'
|
|
|
|
assert '_delete_' not in cfg.item2
|
|
|
|
|
|
|
|
|
2018-08-27 20:25:52 +08:00
|
|
|
def test_dict():
|
|
|
|
cfg_dict = dict(item1=[1, 2], item2=dict(a=0), item3=True, item4='test')
|
|
|
|
|
|
|
|
for filename in ['a.py', 'b.json', 'c.yaml']:
|
|
|
|
cfg_file = osp.join(osp.dirname(__file__), 'data/config', filename)
|
|
|
|
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']
|
2018-09-20 14:15:12 +08:00
|
|
|
with pytest.raises(AttributeError):
|
|
|
|
cfg.not_exist
|
2018-08-27 20:25:52 +08:00
|
|
|
# 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]
|
2018-09-20 14:15:12 +08:00
|
|
|
assert cfg.get('not_exist') is None
|
2018-08-27 20:25:52 +08:00
|
|
|
assert cfg.get('not_exist', 0) == 0
|
2018-09-20 14:15:12 +08:00
|
|
|
with pytest.raises(KeyError):
|
|
|
|
cfg['not_exist']
|
|
|
|
assert 'item1' in cfg
|
2018-08-27 20:25:52 +08:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
def 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
|