xref: /aosp_15_r20/external/jsoncpp/test/pyjsontestrunner.py (revision 4484440890e2bc6e07362b4feaf15601abfe0071)
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