# Simple implementation of a json test runner to run the test against json-py. from __future__ import print_function import sys import os.path import json import types if len(sys.argv) != 2: print("Usage: %s input-json-file", sys.argv[0]) sys.exit(3) input_path = sys.argv[1] base_path = os.path.splitext(input_path)[0] actual_path = base_path + '.actual' rewrite_path = base_path + '.rewrite' rewrite_actual_path = base_path + '.actual-rewrite' def valueTreeToString(fout, value, path = '.'): ty = type(value) if ty is types.DictType: fout.write('%s={}\n' % path) suffix = path[-1] != '.' and '.' or '' names = value.keys() names.sort() for name in names: valueTreeToString(fout, value[name], path + suffix + name) elif ty is types.ListType: fout.write('%s=[]\n' % path) for index, childValue in zip(xrange(0,len(value)), value): valueTreeToString(fout, childValue, path + '[%d]' % index) elif ty is types.StringType: fout.write('%s="%s"\n' % (path,value)) elif ty is types.IntType: fout.write('%s=%d\n' % (path,value)) elif ty is types.FloatType: fout.write('%s=%.16g\n' % (path,value)) elif value is True: fout.write('%s=true\n' % path) elif value is False: fout.write('%s=false\n' % path) elif value is None: fout.write('%s=null\n' % path) else: assert False and "Unexpected value type" def parseAndSaveValueTree(input, actual_path): root = json.loads(input) fout = file(actual_path, 'wt') valueTreeToString(fout, root) fout.close() return root def rewriteValueTree(value, rewrite_path): rewrite = json.dumps(value) #rewrite = rewrite[1:-1] # Somehow the string is quoted ! jsonpy bug ? file(rewrite_path, 'wt').write(rewrite + '\n') return rewrite input = file(input_path, 'rt').read() root = parseAndSaveValueTree(input, actual_path) rewrite = rewriteValueTree(json.write(root), rewrite_path) rewrite_root = parseAndSaveValueTree(rewrite, rewrite_actual_path) sys.exit(0)