sanitize = (str) ->
str.replace(/\/\/.*/g, '')
.replace(/^\s*$[\n\r]+/mg, '')
.replace(/(float|double)\t.*/g, '$1')
.replace(/[ \t\r]+/g, ' ')
.replace(/[ ]\n/g, '\n')
.replace(/\[ \]/g, '[]')
run_disasm_test = (doppio_dir, test_class) ->
test_path = path.resolve(doppio_dir, test_class)
javap_disasm = sanitize(fs.readFileSync "#{test_path}.disasm", 'utf8')
bytes_array = util.bytestr_to_array fs.readFileSync "#{test_path}.class", 'binary'
doppio_disasm = sanitize disassemble new ReferenceClassData bytes_array
return cleandiff doppio_disasm, javap_disasm
run_stdout_test = (doppio_dir, test_class, callback) ->
java_output = fs.readFileSync "#{path.resolve doppio_dir, test_class}.runout", 'utf8'
doppio_output = ''
stdout = (str) -> doppio_output += str
rs = new RuntimeState stdout, (->), new BootstrapClassLoader(jvm.read_classfile)
jvm.run_class rs, test_class, [], ->
callback cleandiff(doppio_output, java_output)
cleandiff = (our_str, their_str) ->
our_lines = our_str.split /\n/
their_lines = their_str.split /\n/
[oidx,tidx] = [0,0]
diff = []
while oidx < our_lines.length and tidx < their_lines.length
continue if our_lines[oidx++] == their_lines[tidx++]
diff.push "D:#{our_lines[oidx-1]}\nJ:#{their_lines[tidx-1]}"
for extra in our_lines[oidx..]
diff.push "D:#{extra}"
for extra in their_lines[tidx..]
diff.push "J:#{extra}"
return diff.join '\n' if diff.length > 0