Description:
fixed judge craching when some test case is not present git-svn-id: http://theory.cpe.ku.ac.th/grader/judge/trunk/scripts@367 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r67:b65f81409564 - - 1 file changed: 2 inserted, 0 deleted

@@ -20,159 +20,161
20 20 instance_variable_set( "@#{name}", a )
21 21 end
22 22 end
23 23 end
24 24 end
25 25 end
26 26
27 27 class Problem < DSLNode
28 28 def initialize
29 29 @runs = []
30 30 @tests = []
31 31 end
32 32
33 33 def Problem.getter(name, plural_name, each_name)
34 34 eval "def get_#{name}(index) \n \
35 35 if defined?(@tests) and @tests[index] != nil \n \
36 36 if @tests[index].#{name} != nil \n \
37 37 return @tests[index].#{name} \n \
38 38 end \n \
39 39 end \n \
40 40 \n \
41 41 (1..@runs.length-1).each do |i| \n \
42 42 run = @runs[i] \n \
43 43 k = run.tests.index(index) \n \
44 44 if k == nil \n \
45 45 next \n \
46 46 end \n \
47 47 \n \
48 48 if run.#{plural_name} != nil && run.#{plural_name}[k] != nil \n \
49 49 return run.#{plural_name}[k] \n \
50 50 end \n \
51 51 \n \
52 52 if run.#{each_name} != nil \n \
53 53 return run.#{each_name} \n \
54 54 end \n \
55 55 end \n \
56 56 \n \
57 57 if @#{each_name} != nil \n \
58 58 return @#{each_name} \n \
59 59 else \n \
60 60 raise 'The problem is malformed (possibly in more than one way)!' \n \
61 61 end \n \
62 62 end"
63 63 end
64 64
65 65 scalar_attr :num_tests, :full_score, :score_each, :time_limit_each, :mem_limit_each
66 66 array_attr :runs, :tests
67 67 getter "score", "scores", "score_each"
68 68 getter "mem_limit", "mem_limits", "mem_limit_each"
69 69 getter "time_limit", "time_limits", "time_limit_each"
70 70
71 71 def run(index, &block)
72 72 new_run = Run.new
73 73 new_run.instance_eval &block
74 74 @runs[index] = new_run
75 75 end
76 76
77 77 def test(index, &block)
78 78 new_test = Test.new
79 79 new_test.instance_eval &block
80 80 @tests[index] = new_test
81 81 end
82 82
83 83 def read_test(index)
84 84 filename = ENV['PROBLEM_HOME'] + "/test_cases/#{index}/test.cfg"
85 85 if File.exists?(filename)
86 86 @tests[index] ||= Test.new
87 87 content = File.read(filename)
88 88 @tests[index].instance_eval content
89 89 end
90 90 end
91 91
92 92 def Problem.set_instance(prob)
93 93 @instance = prob
94 94 end
95 95
96 96 def Problem.get_instance
97 97 return @instance
98 98 end
99 99
100 100 def well_formed?
101 101 # Check if run 1 to run @runs.length are present.
102 102 (1..(@runs.length-1)).each do |i|
103 103 if @runs[i] == nil
104 104 puts "run #{i} is not present"
105 105 return false
106 106 end
107 107 end
108 108
109 109 # Check if all tests are in one and only one run.
110 110 test_present = []
111 111 (1..(@num_tests)).each do |i|
112 112 test_present[i] = false
113 113 end
114 114 (1..(@runs.length-1)).each do |j|
115 115 run = @runs[j]
116 + if run.tests!=nil
116 117 run.tests.each do |t|
117 118 if test_present[t] == false
118 119 test_present[t] = true
119 120 else
120 121 puts "test #{t} is present in more than one run"
121 122 return false
122 123 end
123 124 end
124 125 end
126 + end
125 127 (1..(@num_tests)).each do |i|
126 128 if test_present[i] == false
127 129 puts "test #{i} is not present"
128 130 return false
129 131 end
130 132 end
131 133
132 134 # Check if we can find the score, mem limit, and time limit for all tests.
133 135 (1..(@num_tests)).each do |i|
134 136 begin
135 137 get_score i
136 138 rescue
137 139 puts "cannot get score for test #{i}"
138 140 return false
139 141 end
140 142
141 143 begin
142 144 get_mem_limit i
143 145 rescue
144 146 puts "cannot get mem limit for test #{i}"
145 147 return false
146 148 end
147 149
148 150 begin
149 151 get_time_limit i
150 152 rescue
151 153 puts "cannot get time limit for test #{i}"
152 154 return false
153 155 end
154 156 end
155 157
156 158 return true
157 159 end
158 160 end
159 161
160 162 class Run < DSLNode
161 163 scalar_attr :score_each, :time_limit_each, :mem_limit_each
162 164 array_attr :tests, :scores, :time_limits, :mem_limits
163 165 end
164 166
165 167 class Test < DSLNode
166 168 scalar_attr :score, :time_limit, :mem_limit
167 169 end
168 170
169 171 def problem(&blk)
170 172 prob = Problem.new
171 173 prob.instance_eval &blk
172 174 Problem.set_instance prob
173 175 p = Problem.get_instance
174 176 (1..(p.num_tests)).each do |i|
175 177 p.read_test i
176 178 end
177 179 p.well_formed?
178 180 end
You need to be logged in to leave comments. Login now