# Simple implementation of a json test runner to run the test against json-py.

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 )
