-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtopcoder_run_system_test.py
More file actions
99 lines (86 loc) · 4.05 KB
/
topcoder_run_system_test.py
File metadata and controls
99 lines (86 loc) · 4.05 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#! /usr/bin/python
import urllib
import urllib2
import json
import sys
import os
def generate_test_code(class_name, input_types, return_type, topcoder_url):
topcoder_url = urllib.quote(topcoder_url)
url = "http://open.dapper.net/transform.php?dappName=topcoder_test_cases&transformer=JSON&v_url=%(topcoder_url)s" % locals()
data = json.load(urllib2.urlopen(url))
test_code = []
# generate inputs and expected outputs
inputs = []
outputs = []
for value in data['groups']['expected_result']:
inputs.append(value['input'][0]['value'])
outputs.append(value['output'][0]['value'])
for i, ip in enumerate(inputs):
input_parts = ip.split(",")
for j, input_type in enumerate(input_types):
test_code.append("%s input_%d_%d = %s;" % (input_type, j, i, input_parts[j]))
test_code.append("\n")
for i, op in enumerate(outputs):
test_code.append("%s output_%d = %s;" % (return_type, i, op))
test_code.append("\n")
# generate function calls
try:
method_name = data['fields']['method_name'][0]['value']
except:
method_name = data['fields']['method'][0]['value']
for i in range(len(inputs)):
input_args = ','.join(["input_%d_%d" % (j, i) for j in range(len(input_types))])
input_log = " + \" \" + ".join(["input_%d_%d" % (j, i) + (".toString()" if input_types[j][0].isupper() else "") for j in range(len(input_types))])
test_code.append("System.out.println(\"Running input \" + %(input_log)s);" % locals())
test_code.append("%(return_type)s a_output_%(i)d = (new %(class_name)s()).%(method_name)s(%(input_args)s);" % locals())
test_code.append("System.out.println(\"Expected Output: \" + output_%(i)d);" % locals())
test_code.append("System.out.println(\"Actual Output: \" + a_output_%(i)d);" % locals())
if '[]' in return_type:
test_code.append("assert Arrays.equals(a_output_%(i)d, output_%(i)d);" % locals())
elif return_type[0].isupper():
test_code.append("assert a_output_%(i)d.equals(output_%(i)d);" % locals())
else:
test_code.append("assert a_output_%(i)d == output_%(i)d;" % locals())
test_code.append("System.out.println(\"Success!\");")
test_code.append("\n")
return "\n".join(test_code)
def search_topcoder(class_name):
url = "http://open.dapper.net/transform.php?dappName=topcoder_search&transformer=JSON&v_class=%(class_name)s" % locals()
data = json.load(urllib2.urlopen(url))
return data['fields']['problem_link'][0]['href']
def parse_problem_page(problem_link):
url = "http://open.dapper.net/transform.php?dappName=topcoder_parse_problem_page&transformer=JSON&applyToUrl=%s" % urllib.quote(problem_link)
data = json.load(urllib2.urlopen(url))['fields']
url2 = "http://open.dapper.net/transform.php?dappName=topcoder_test_cases_link&transformer=JSON&applyToUrl=%s" % urllib.quote(data['test_cases_link'][0]['href'])
data2 = json.load(urllib2.urlopen(url2))['fields']
return (data['input_types'][0]['value'].split(","),
data['return_type'][0]['value'],
data2['test_cases_link'][0]['href'])
def create_test_program(test_code):
test_code_template = """
import java.util.Arrays;
public class test {
public static void main(String[] args) {
%(test_code)s
}
}
"""
f = open("test.java", "w")
f.write(test_code_template % locals())
f.close()
def run_test_program():
os.system("javac test.java")
os.system("java -ea test")
#os.system("rm test.java")
def main():
if len(sys.argv) != 2:
print 'Usage: %s <java_file>' % sys.argv[0]
sys.exit(1)
class_name = sys.argv[1].split(".")[0]
problem_link = search_topcoder(class_name)
input_types, return_type, test_cases_url = parse_problem_page(problem_link)
test_code = generate_test_code(class_name, input_types, return_type, test_cases_url)
create_test_program(test_code)
run_test_program()
if __name__ == '__main__':
main()