1*44844408SAndroid Build Coastguard Worker# Copyright 2007 Baptiste Lepilleur and The JsonCpp Authors 2*44844408SAndroid Build Coastguard Worker# Distributed under MIT license, or public domain if desired and 3*44844408SAndroid Build Coastguard Worker# recognized in your jurisdiction. 4*44844408SAndroid Build Coastguard Worker# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5*44844408SAndroid Build Coastguard Worker 6*44844408SAndroid Build Coastguard Worker"""Simple implementation of a json test runner to run the test against 7*44844408SAndroid Build Coastguard Workerjson-py.""" 8*44844408SAndroid Build Coastguard Worker 9*44844408SAndroid Build Coastguard Workerfrom __future__ import print_function 10*44844408SAndroid Build Coastguard Workerimport sys 11*44844408SAndroid Build Coastguard Workerimport os.path 12*44844408SAndroid Build Coastguard Workerimport json 13*44844408SAndroid Build Coastguard Workerimport types 14*44844408SAndroid Build Coastguard Worker 15*44844408SAndroid Build Coastguard Workerif len(sys.argv) != 2: 16*44844408SAndroid Build Coastguard Worker print("Usage: %s input-json-file", sys.argv[0]) 17*44844408SAndroid Build Coastguard Worker sys.exit(3) 18*44844408SAndroid Build Coastguard Worker 19*44844408SAndroid Build Coastguard Workerinput_path = sys.argv[1] 20*44844408SAndroid Build Coastguard Workerbase_path = os.path.splitext(input_path)[0] 21*44844408SAndroid Build Coastguard Workeractual_path = base_path + '.actual' 22*44844408SAndroid Build Coastguard Workerrewrite_path = base_path + '.rewrite' 23*44844408SAndroid Build Coastguard Workerrewrite_actual_path = base_path + '.actual-rewrite' 24*44844408SAndroid Build Coastguard Worker 25*44844408SAndroid Build Coastguard Workerdef valueTreeToString(fout, value, path = '.'): 26*44844408SAndroid Build Coastguard Worker ty = type(value) 27*44844408SAndroid Build Coastguard Worker if ty is types.DictType: 28*44844408SAndroid Build Coastguard Worker fout.write('%s={}\n' % path) 29*44844408SAndroid Build Coastguard Worker suffix = path[-1] != '.' and '.' or '' 30*44844408SAndroid Build Coastguard Worker names = value.keys() 31*44844408SAndroid Build Coastguard Worker names.sort() 32*44844408SAndroid Build Coastguard Worker for name in names: 33*44844408SAndroid Build Coastguard Worker valueTreeToString(fout, value[name], path + suffix + name) 34*44844408SAndroid Build Coastguard Worker elif ty is types.ListType: 35*44844408SAndroid Build Coastguard Worker fout.write('%s=[]\n' % path) 36*44844408SAndroid Build Coastguard Worker for index, childValue in zip(xrange(0,len(value)), value): 37*44844408SAndroid Build Coastguard Worker valueTreeToString(fout, childValue, path + '[%d]' % index) 38*44844408SAndroid Build Coastguard Worker elif ty is types.StringType: 39*44844408SAndroid Build Coastguard Worker fout.write('%s="%s"\n' % (path,value)) 40*44844408SAndroid Build Coastguard Worker elif ty is types.IntType: 41*44844408SAndroid Build Coastguard Worker fout.write('%s=%d\n' % (path,value)) 42*44844408SAndroid Build Coastguard Worker elif ty is types.FloatType: 43*44844408SAndroid Build Coastguard Worker fout.write('%s=%.16g\n' % (path,value)) 44*44844408SAndroid Build Coastguard Worker elif value is True: 45*44844408SAndroid Build Coastguard Worker fout.write('%s=true\n' % path) 46*44844408SAndroid Build Coastguard Worker elif value is False: 47*44844408SAndroid Build Coastguard Worker fout.write('%s=false\n' % path) 48*44844408SAndroid Build Coastguard Worker elif value is None: 49*44844408SAndroid Build Coastguard Worker fout.write('%s=null\n' % path) 50*44844408SAndroid Build Coastguard Worker else: 51*44844408SAndroid Build Coastguard Worker assert False and "Unexpected value type" 52*44844408SAndroid Build Coastguard Worker 53*44844408SAndroid Build Coastguard Workerdef parseAndSaveValueTree(input, actual_path): 54*44844408SAndroid Build Coastguard Worker root = json.loads(input) 55*44844408SAndroid Build Coastguard Worker fout = file(actual_path, 'wt') 56*44844408SAndroid Build Coastguard Worker valueTreeToString(fout, root) 57*44844408SAndroid Build Coastguard Worker fout.close() 58*44844408SAndroid Build Coastguard Worker return root 59*44844408SAndroid Build Coastguard Worker 60*44844408SAndroid Build Coastguard Workerdef rewriteValueTree(value, rewrite_path): 61*44844408SAndroid Build Coastguard Worker rewrite = json.dumps(value) 62*44844408SAndroid Build Coastguard Worker #rewrite = rewrite[1:-1] # Somehow the string is quoted ! jsonpy bug ? 63*44844408SAndroid Build Coastguard Worker file(rewrite_path, 'wt').write(rewrite + '\n') 64*44844408SAndroid Build Coastguard Worker return rewrite 65*44844408SAndroid Build Coastguard Worker 66*44844408SAndroid Build Coastguard Workerinput = file(input_path, 'rt').read() 67*44844408SAndroid Build Coastguard Workerroot = parseAndSaveValueTree(input, actual_path) 68*44844408SAndroid Build Coastguard Workerrewrite = rewriteValueTree(json.write(root), rewrite_path) 69*44844408SAndroid Build Coastguard Workerrewrite_root = parseAndSaveValueTree(rewrite, rewrite_actual_path) 70*44844408SAndroid Build Coastguard Worker 71*44844408SAndroid Build Coastguard Workersys.exit(0) 72