#!/usr/bin/env python3

import _prep

import sys
import os
import io
import pprint
import copy

from osmo_gsm_tester.core import config, log, schema

def val(which, test_schema):
    try:
        schema.validate(which, test_schema)
        print('Validation: OK')
    except ValueError:
        log.log_exn()
        print('Validation: Error')

def get_case_list(dir):
    li = []
    for f in os.listdir(dir):
        if f.startswith('schema_case'):
            li.append(f)
    return sorted(li)

print('==== Testing dynamically generated schemas ====')
for f in get_case_list(_prep.script_dir):
    print('%s:' % f)
    example_config = os.path.join(_prep.script_dir, f)
    cfg = config.read(example_config)
    try:
        schema_def = schema.config_to_schema_def(cfg['schema'], 'foobar.prefix.')
    except AssertionError:
        schema_def = None
        log.log_exn()
        print('config2schema: Error')

    if schema_def is not None:
        pprint.pprint(schema_def)
        i = 0
        for t in cfg['tests']:
            print('validating tests[%d]' % i)
            val(t, schema_def)
            i += 1
    print('----------------------')





# vim: expandtab tabstop=4 shiftwidth=4
