Exemple #1
0
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