Show More
Commit Description:
add option -A <opt> to box. This options allow more argument to be explicitly passed to the program...
Commit Description:
add option -A <opt> to box. This options allow more argument to be explicitly passed to the program
We have to use this because if the argument we wish to pass to the program is option (in -? format),
box will intepret it as its option and failed accordingly.
be noted that, by the definition of getopt, these options will be put after original argument
(check the code for more info)
References:
File last commit:
Show/Diff file:
Action:
std-script/test_dsl.rb
| 180 lines
| 4.1 KiB
| text/x-ruby
| RubyLexer
|
|
r0 | class DSLNode | ||
def DSLNode.scalar_attr(*names) | ||||
names.each do |name| | ||||
define_method name do |*a| | ||||
if a.length == 0 | ||||
instance_variable_get( "@#{name}" ) | ||||
else | ||||
instance_variable_set( "@#{name}", a[0] ) | ||||
end | ||||
end | ||||
end | ||||
end | ||||
def DSLNode.array_attr(*names) | ||||
names.each do |name| | ||||
define_method name do |*a| | ||||
if a.length == 0 | ||||
instance_variable_get( "@#{name}" ) | ||||
else | ||||
instance_variable_set( "@#{name}", a ) | ||||
end | ||||
end | ||||
end | ||||
end | ||||
end | ||||
class Problem < DSLNode | ||||
def initialize | ||||
@runs = [] | ||||
@tests = [] | ||||
end | ||||
def Problem.getter(name, plural_name, each_name) | ||||
eval "def get_#{name}(index) \n \ | ||||
if defined?(@tests) and @tests[index] != nil \n \ | ||||
if @tests[index].#{name} != nil \n \ | ||||
return @tests[index].#{name} \n \ | ||||
end \n \ | ||||
end \n \ | ||||
\n \ | ||||
(1..@runs.length-1).each do |i| \n \ | ||||
run = @runs[i] \n \ | ||||
k = run.tests.index(index) \n \ | ||||
if k == nil \n \ | ||||
next \n \ | ||||
end \n \ | ||||
\n \ | ||||
if run.#{plural_name} != nil && run.#{plural_name}[k] != nil \n \ | ||||
return run.#{plural_name}[k] \n \ | ||||
end \n \ | ||||
\n \ | ||||
if run.#{each_name} != nil \n \ | ||||
return run.#{each_name} \n \ | ||||
end \n \ | ||||
end \n \ | ||||
\n \ | ||||
if @#{each_name} != nil \n \ | ||||
return @#{each_name} \n \ | ||||
else \n \ | ||||
raise 'The problem is malformed (possibly in more than one way)!' \n \ | ||||
end \n \ | ||||
end" | ||||
end | ||||
scalar_attr :num_tests, :full_score, :score_each, :time_limit_each, :mem_limit_each | ||||
array_attr :runs, :tests | ||||
getter "score", "scores", "score_each" | ||||
getter "mem_limit", "mem_limits", "mem_limit_each" | ||||
getter "time_limit", "time_limits", "time_limit_each" | ||||
def run(index, &block) | ||||
new_run = Run.new | ||||
new_run.instance_eval &block | ||||
@runs[index] = new_run | ||||
end | ||||
def test(index, &block) | ||||
new_test = Test.new | ||||
new_test.instance_eval &block | ||||
@tests[index] = new_test | ||||
end | ||||
def read_test(index) | ||||
filename = ENV['PROBLEM_HOME'] + "/test_cases/#{index}/test.cfg" | ||||
if File.exists?(filename) | ||||
@tests[index] ||= Test.new | ||||
content = File.read(filename) | ||||
@tests[index].instance_eval content | ||||
end | ||||
end | ||||
def Problem.set_instance(prob) | ||||
@instance = prob | ||||
end | ||||
def Problem.get_instance | ||||
return @instance | ||||
end | ||||
def well_formed? | ||||
# Check if run 1 to run @runs.length are present. | ||||
(1..(@runs.length-1)).each do |i| | ||||
if @runs[i] == nil | ||||
puts "run #{i} is not present" | ||||
return false | ||||
end | ||||
end | ||||
# Check if all tests are in one and only one run. | ||||
test_present = [] | ||||
(1..(@num_tests)).each do |i| | ||||
test_present[i] = false | ||||
end | ||||
(1..(@runs.length-1)).each do |j| | ||||
run = @runs[j] | ||||
|
r67 | if run.tests!=nil | ||
run.tests.each do |t| | ||||
if test_present[t] == false | ||||
test_present[t] = true | ||||
else | ||||
puts "test #{t} is present in more than one run" | ||||
return false | ||||
end | ||||
|
r0 | end | ||
end | ||||
end | ||||
(1..(@num_tests)).each do |i| | ||||
if test_present[i] == false | ||||
puts "test #{i} is not present" | ||||
return false | ||||
end | ||||
end | ||||
# Check if we can find the score, mem limit, and time limit for all tests. | ||||
(1..(@num_tests)).each do |i| | ||||
begin | ||||
get_score i | ||||
rescue | ||||
puts "cannot get score for test #{i}" | ||||
return false | ||||
end | ||||
begin | ||||
get_mem_limit i | ||||
rescue | ||||
puts "cannot get mem limit for test #{i}" | ||||
return false | ||||
end | ||||
begin | ||||
get_time_limit i | ||||
rescue | ||||
puts "cannot get time limit for test #{i}" | ||||
return false | ||||
end | ||||
end | ||||
return true | ||||
end | ||||
end | ||||
class Run < DSLNode | ||||
scalar_attr :score_each, :time_limit_each, :mem_limit_each | ||||
array_attr :tests, :scores, :time_limits, :mem_limits | ||||
end | ||||
class Test < DSLNode | ||||
scalar_attr :score, :time_limit, :mem_limit | ||||
end | ||||
def problem(&blk) | ||||
prob = Problem.new | ||||
prob.instance_eval &blk | ||||
Problem.set_instance prob | ||||
p = Problem.get_instance | ||||
(1..(p.num_tests)).each do |i| | ||||
p.read_test i | ||||
end | ||||
p.well_formed? | ||||
end | ||||