Index: Source/bindings/scripts/test_json_import_export.py |
diff --git a/Source/bindings/scripts/test_json_import_export.py b/Source/bindings/scripts/test_json_import_export.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..bce0d2c30271cb9afba7ff29a23fa8213437b752 |
--- /dev/null |
+++ b/Source/bindings/scripts/test_json_import_export.py |
@@ -0,0 +1,81 @@ |
+#!/usr/bin/python |
+# Copyright (C) 2013 Google Inc. All rights reserved. |
+# |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following disclaimer |
+# in the documentation and/or other materials provided with the |
+# distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived from |
+# this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+# Test that JSON/IR import/export works, |
+# by checking that roundtripping from JSON to IR and back to JSON |
+# doesn't change the data. |
+ |
+import json |
+import optparse |
+import pprint |
+import sys |
+ |
+from ir import IdlDocument |
+import json_import_export |
+ |
+ |
+def parse_options(): |
+ parser = optparse.OptionParser() |
+ parser.add_option('--debug', action='store_true', default=False) |
+ parser.disable_interspersed_args() |
+ options, args = parser.parse_args() |
+ if len(args) != 1: |
+ parser.error('Must specify exactly 1 JSON input file as argument, but %d given.' % len(args)) |
+ options.json_filename = args[0] |
+ return options |
+ |
+ |
+def main(): |
+ options = parse_options() |
+ # 0 = Ok, 1 = Failure, so invert equality |
+ return not test_roundtrip_json(options.json_filename, debug=options.debug) |
+ |
+ |
+def test_roundtrip_json(json_filename, debug=False): |
+ with open(json_filename) as json_file: |
+ json_text = json_file.read() |
+ raw_dict = json.loads(json_text) |
+ # Convert to IR |
+ clean_dict = json_import_export.strip_types(raw_dict) |
+ document = IdlDocument() |
+ document.from_json(clean_dict) |
+ # Convert back to JSON |
+ json_back = json_import_export.ir_to_json(document) |
+ if debug: |
+ # Easier to compare and dictionaries, not raw strings |
+ dict_back = json.loads(json_back) |
+ print 'Original -------------------------------------------------------------' |
+ pprint.pprint(raw_dict) |
+ print 'Roundtrip ------------------------------------------------------------' |
+ pprint.pprint(dict_back) |
+ return json_text == json_back |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |