# 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 )
