def test_range_infomation(tests_path): """ Check consistency of range-related info in current_law_policy.json file. """ # read current_law_policy.json file into a dictionary path = os.path.join(tests_path, '..', 'current_law_policy.json') with open(path, 'r') as clpfile: clpdict = json.load(clpfile) parameters = set(clpdict.keys()) # construct set of parameter names with "range" field in clpdict min_max_list = ['min', 'max'] warn_stop_list = ['warn', 'stop'] json_range_params = set() for pname in parameters: param = clpdict[pname] assert isinstance(param, dict) range = param.get('range', None) if range: json_range_params.add(pname) oor_action = param['out_of_range_action'] assert oor_action in warn_stop_list range_items = range.items() assert len(range_items) == 2 for vop, vval in range_items: assert vop in min_max_list if isinstance(vval, six.string_types): if vval == 'default': if vop != 'min' or oor_action != 'warn': msg = 'USES DEFAULT FOR min OR FOR error' assert pname == msg continue elif vval in clpdict: if vop == 'min': extra_msg = param['out_of_range_minmsg'] if vop == 'max': extra_msg = param['out_of_range_maxmsg'] assert vval in extra_msg else: assert vval == 'ILLEGAL RANGE STRING VALUE' else: # if vval is not a str if isinstance(vval, int): continue elif isinstance(vval, float): continue elif isinstance(vval, bool): continue else: assert vval == 'ILLEGAL RANGE NUMERIC VALUE' # compare contents of c_l_p.json parameters and json_range_params unmatched = parameters ^ json_range_params if len(unmatched) != 0: assert unmatched == 'UNMATCHED RANGE PARAMETERS' # check all current-law-policy parameters for range validity clp = Policy() clp._validate_parameter_values(parameters) assert len(clp.reform_warnings) == 0 assert len(clp.reform_errors) == 0