most 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/Copying.txt +679 -0
  2. data/History.txt +15 -0
  3. data/Manifest.txt +95 -0
  4. data/PostInstall.txt +6 -0
  5. data/Rakefile +44 -0
  6. data/Readme.rdoc +146 -0
  7. data/bin/most +31 -0
  8. data/lib/most.rb +52 -0
  9. data/lib/most/context.rb +244 -0
  10. data/lib/most/core.rb +171 -0
  11. data/lib/most/di/container.rb +148 -0
  12. data/lib/most/di/proxy.rb +55 -0
  13. data/lib/most/di/service.rb +63 -0
  14. data/lib/most/di/service_factory.rb +40 -0
  15. data/lib/most/environment.rb +67 -0
  16. data/lib/most/executor.rb +80 -0
  17. data/lib/most/helpers/array.rb +31 -0
  18. data/lib/most/helpers/hash.rb +25 -0
  19. data/lib/most/helpers/kernel.rb +35 -0
  20. data/lib/most/helpers/memory_out.rb +93 -0
  21. data/lib/most/helpers/numeric.rb +59 -0
  22. data/lib/most/helpers/object.rb +65 -0
  23. data/lib/most/helpers/symbol.rb +31 -0
  24. data/lib/most/interfaces/meta_programmable.rb +59 -0
  25. data/lib/most/starter.rb +126 -0
  26. data/lib/most/structures/box.rb +199 -0
  27. data/lib/most/structures/submission.rb +117 -0
  28. data/lib/most/structures/test_case.rb +173 -0
  29. data/lib/most/structures/test_runner.rb +103 -0
  30. data/lib/most/structures/types/options.rb +67 -0
  31. data/lib/most/structures/types/path.rb +39 -0
  32. data/lib/most/structures/types/report.rb +84 -0
  33. data/lib/most/submissions/cpp_memory_out_sample.rb +34 -0
  34. data/lib/most/submissions/cpp_sample.rb +36 -0
  35. data/lib/most/submissions/cpp_timeout_sample.rb +34 -0
  36. data/lib/most/submissions/cs_sample.rb +36 -0
  37. data/lib/most/submissions/erlang_sample.rb +36 -0
  38. data/lib/most/submissions/haskell_sample.rb +36 -0
  39. data/lib/most/submissions/java_sample.rb +36 -0
  40. data/lib/most/submissions/lisp_sample.rb +32 -0
  41. data/lib/most/submissions/lua_sample.rb +36 -0
  42. data/lib/most/submissions/ocaml_sample.rb +36 -0
  43. data/lib/most/submissions/pascal_sample.rb +36 -0
  44. data/lib/most/submissions/perl_sample.rb +32 -0
  45. data/lib/most/submissions/php_sample.rb +32 -0
  46. data/lib/most/submissions/python_sample.rb +32 -0
  47. data/lib/most/submissions/ruby_sample.rb +32 -0
  48. data/lib/most/submissions/vb_sample.rb +36 -0
  49. data/lib/most/tasks/general/win/cs.rb +60 -0
  50. data/lib/most/tasks/general/win/erlang.rb +86 -0
  51. data/lib/most/tasks/general/win/gcc.rb +39 -0
  52. data/lib/most/tasks/general/win/haskell.rb +75 -0
  53. data/lib/most/tasks/general/win/java.rb +72 -0
  54. data/lib/most/tasks/general/win/lisp.rb +59 -0
  55. data/lib/most/tasks/general/win/lua.rb +75 -0
  56. data/lib/most/tasks/general/win/ocaml.rb +77 -0
  57. data/lib/most/tasks/general/win/pascal.rb +73 -0
  58. data/lib/most/tasks/general/win/perl.rb +61 -0
  59. data/lib/most/tasks/general/win/php.rb +59 -0
  60. data/lib/most/tasks/general/win/python.rb +59 -0
  61. data/lib/most/tasks/general/win/ruby.rb +61 -0
  62. data/lib/most/tasks/general/win/vb.rb +60 -0
  63. data/lib/most/tasks/general/win/vc.rb +79 -0
  64. data/lib/most/tasks/general/win/vs.rb +52 -0
  65. data/samples/problem/solutions/cpp/main.cpp +9 -0
  66. data/samples/problem/solutions/cpp/tests.yml +19 -0
  67. data/samples/problem/solutions/cs/main.cs +17 -0
  68. data/samples/problem/solutions/cs/tests.yml +19 -0
  69. data/samples/problem/solutions/erlang/main.erl +2 -0
  70. data/samples/problem/solutions/erlang/tests.yml +19 -0
  71. data/samples/problem/solutions/haskell/main.hs +5 -0
  72. data/samples/problem/solutions/haskell/tests.yml +19 -0
  73. data/samples/problem/solutions/java/Main.java +14 -0
  74. data/samples/problem/solutions/java/tests.yml +19 -0
  75. data/samples/problem/solutions/lisp/main.lisp +1 -0
  76. data/samples/problem/solutions/lisp/tests.yml +19 -0
  77. data/samples/problem/solutions/lua/main.lua +4 -0
  78. data/samples/problem/solutions/lua/tests.yml +19 -0
  79. data/samples/problem/solutions/ocaml/main.ml +3 -0
  80. data/samples/problem/solutions/ocaml/tests.yml +19 -0
  81. data/samples/problem/solutions/pascal/main.pas +5 -0
  82. data/samples/problem/solutions/pascal/tests.yml +19 -0
  83. data/samples/problem/solutions/perl/main.pl +2 -0
  84. data/samples/problem/solutions/perl/tests.yml +19 -0
  85. data/samples/problem/solutions/php/main.php +1 -0
  86. data/samples/problem/solutions/php/tests.yml +19 -0
  87. data/samples/problem/solutions/python/main.py +1 -0
  88. data/samples/problem/solutions/python/tests.yml +19 -0
  89. data/samples/problem/solutions/ruby/main.rb +1 -0
  90. data/samples/problem/solutions/ruby/tests.yml +19 -0
  91. data/samples/problem/solutions/vb/main.vb +14 -0
  92. data/samples/problem/solutions/vb/tests.yml +19 -0
  93. data/samples/time_memory/solutions/cpp/main.cpp +21 -0
  94. data/samples/time_memory/solutions/cpp/tests.yml +19 -0
  95. data/tasks/samples.rb +31 -0
  96. metadata +242 -0
@@ -0,0 +1,173 @@
1
+ # Most - Modular Open Software Tester.
2
+ # Copyright (C) 2009 Dmitrii Toksaitov
3
+ #
4
+ # This file is part of Most.
5
+ #
6
+ # Most is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Most is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Most. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'yaml'
20
+ require 'stringio'
21
+
22
+ require 'most/structures/types/path'
23
+ require 'most/structures/types/options'
24
+ require 'most/structures/types/report'
25
+
26
+ require 'most/structures/test_runner'
27
+
28
+ module Most
29
+
30
+ module TestCaseHelpers
31
+ def create_test_case(*args, &block)
32
+ TestCase.new(*args, &block)
33
+ end
34
+ end
35
+
36
+ class TestCase
37
+ include MetaProgrammable
38
+
39
+ include PathHelpers
40
+ include OptionsHelpers
41
+ include RunnerHelpers
42
+
43
+ def initialize(name = 'Anonymous Test Case',
44
+ input = '',
45
+ output = '',
46
+ output_destination = nil,
47
+ output_preprocessor = lambda { |data| data.to_s().strip() },
48
+ runner = TestRunner.new(),
49
+ &block)
50
+
51
+ @name = name
52
+ @input = input
53
+
54
+ @output = output
55
+ @output_destination = output_destination
56
+ @output_preprocessor = output_preprocessor
57
+
58
+ @runner = runner
59
+
60
+ instance_eval(&block) if block_given?
61
+ end
62
+
63
+ def run(options, entities)
64
+ result = Report.new("Test Case: #{@name}")
65
+
66
+ if options[:tests/:report/:specs]
67
+ result.specs = {:name => @name,
68
+ :correct_output => @output,
69
+ :output_destination => @output_destination,
70
+ :output_preprocessor => @output_preprocessor,
71
+ :runner => @runner}
72
+ end
73
+
74
+ result << process(options, entities)
75
+ result
76
+ end
77
+
78
+ private
79
+ def process(options, entities)
80
+ result = @runner.run(options, entities, @input)
81
+
82
+ if result.last[:success]
83
+ process_result!(result.last, options)
84
+ end
85
+
86
+ result
87
+ end
88
+
89
+ def process_result!(result, options)
90
+ test_output = nil
91
+
92
+ if @output_destination.is_a?(Path)
93
+ test_output = File.read(@output_destination.expand_path()) rescue nil
94
+ else
95
+ test_output = result[:process_stdout]
96
+ end
97
+
98
+ unless @output_preprocessor.nil?
99
+ test_output = @output_preprocessor.call(test_output)
100
+ end
101
+
102
+ result[:processed_output] = test_output
103
+
104
+ is_correct = output_equal?(test_output, @output)
105
+ result[:correct] = is_correct
106
+
107
+ if not is_correct and options[:tests/:report/:differences]
108
+ diffs = differences(test_output, @output)
109
+ result[:differences] = diffs unless diffs.nil?
110
+ end
111
+
112
+ nil
113
+ end
114
+
115
+ def differences(first_sequence, second_sequence)
116
+ result = nil
117
+
118
+ valid? first_sequence, second_sequence do
119
+ begin
120
+ result = SERVICES[:diff].diff(first_sequence, second_sequence)
121
+ rescue Exception => e
122
+ SERVICES[:environment].log_error(e, "Failed to process with the 'diff' service")
123
+ end
124
+ end
125
+
126
+ result
127
+ end
128
+
129
+ def output_equal?(output, correct_output)
130
+ result = nil
131
+
132
+ valid? output, correct_output do
133
+ first_stream = get_stream(output)
134
+ second_stream = get_stream(correct_output)
135
+
136
+ result = !first_stream.nil? and !second_stream.nil?
137
+
138
+ while result and valid? first_stream, second_stream
139
+ first_char = first_stream.getc()
140
+ second_char = second_stream.getc()
141
+
142
+ result = first_char == second_char
143
+
144
+ break if first_char.nil? or second_char.nil?
145
+ end
146
+
147
+ first_stream.try(:close)
148
+ second_stream.try(:close)
149
+ end
150
+
151
+ result
152
+ end
153
+
154
+ def get_stream(data)
155
+ result = nil
156
+
157
+ case data
158
+ when ::String
159
+ result = StringIO.new(data, 'r')
160
+ when Path
161
+ result = File.open(data.expand_path(), 'r')
162
+ else
163
+ result.try(:close)
164
+
165
+ exception = TypeError.new("Invalid type: #{data.class}")
166
+ SERVICES[:environment].log_error(exception, 'Invalid data or reference type')
167
+ end
168
+
169
+ result
170
+ end
171
+ end
172
+
173
+ end
@@ -0,0 +1,103 @@
1
+ # Most - Modular Open Software Tester.
2
+ # Copyright (C) 2009 Dmitrii Toksaitov
3
+ #
4
+ # This file is part of Most.
5
+ #
6
+ # Most is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Most is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Most. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'yaml'
20
+
21
+ require 'most/structures/types/path'
22
+ require 'most/structures/types/options'
23
+ require 'most/structures/types/report'
24
+
25
+ require 'most/structures/box'
26
+
27
+ module Most
28
+
29
+ module RunnerHelpers
30
+ def create_test_runner(*args, &block)
31
+ TestRunner.new(*args, &block)
32
+ end
33
+ end
34
+
35
+ class TestRunner
36
+ include MetaProgrammable
37
+
38
+ include PathHelpers
39
+ include OptionsHelpers
40
+
41
+ def initialize(name = 'Anonymous Test Runner', steps = [], &block)
42
+ @name = name
43
+ @steps = steps
44
+
45
+ instance_eval(&block) if block_given?
46
+ end
47
+
48
+ def run(options, entities, input)
49
+ result = Report.new("Test Runner: #{@name}")
50
+
51
+ if options[:tests/:report/:specs]
52
+ result.specs = {:name => @name,
53
+ :steps => @steps}
54
+ end
55
+
56
+ result << execute(options, entities, input)
57
+ result
58
+ end
59
+
60
+ def add_step(step, &block)
61
+ @steps ||= []
62
+ if step.is_a?(Class) and block_given?
63
+ @steps << step.new(&block)
64
+ else
65
+ @steps << step
66
+ end
67
+ end
68
+
69
+ private
70
+ def execute(options, entities, input)
71
+ result = {:success => true,
72
+ :steps => [],
73
+ :process_stdout => nil}
74
+
75
+ globals = {};
76
+ @steps.each do |step|
77
+ step_box = Box.new do
78
+ options options
79
+ entities entities
80
+ globals globals
81
+ input input
82
+ end
83
+
84
+ step_result = step_box.run(step)
85
+ globals = step_box.globals
86
+
87
+ result[:steps] << step_box
88
+ result[:process_stdout] = step_result.last[:process_stdout]
89
+
90
+ unless step_result.last[:success]
91
+ if options[:tests/:steps/:break/:unsuccessful]
92
+ result[:success] = false
93
+ end
94
+ end
95
+
96
+ break unless result[:success]
97
+ end
98
+
99
+ result
100
+ end
101
+ end
102
+
103
+ end
@@ -0,0 +1,67 @@
1
+ # Most - Modular Open Software Tester.
2
+ # Copyright (C) 2009 Dmitrii Toksaitov
3
+ #
4
+ # This file is part of Most.
5
+ #
6
+ # Most is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Most is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Most. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'yaml'
20
+
21
+ module Most
22
+
23
+ module OptionsHelpers
24
+ def create_options(*args, &block)
25
+ Options.new(*args, &block)
26
+ end
27
+ end
28
+
29
+ class Options < Hash
30
+ def initialize(hash = nil)
31
+ super(); replace(hash) unless hash.nil?
32
+ end
33
+
34
+ def [](key, *args)
35
+ if key.is_a?(Array)
36
+ args.unshift(*key[1..-1])
37
+ key = key.first
38
+ end
39
+
40
+ result = super(key)
41
+
42
+ args.each do |item|
43
+ break if result.nil?
44
+ result = result.try(:[], item)
45
+ end
46
+
47
+ result
48
+ end
49
+
50
+ def has_any?(*args)
51
+ result = nil
52
+
53
+ args.each do |item|
54
+ if item.is_a?(Array)
55
+ result = self[*item]
56
+ else
57
+ result = self[item]
58
+ end
59
+
60
+ break unless result.nil?
61
+ end
62
+
63
+ result
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,39 @@
1
+ # Most - Modular Open Software Tester.
2
+ # Copyright (C) 2009 Dmitrii Toksaitov
3
+ #
4
+ # This file is part of Most.
5
+ #
6
+ # Most is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Most is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Most. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'yaml'
20
+
21
+ module Most
22
+
23
+ module PathHelpers
24
+ def path(path)
25
+ Path.new(path)
26
+ end
27
+ end
28
+
29
+ class Path < String
30
+ def initialize(path = '')
31
+ super(path)
32
+ end
33
+
34
+ def expand_path()
35
+ File.expand_path(self)
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,84 @@
1
+ # Most - Modular Open Software Tester.
2
+ # Copyright (C) 2009 Dmitrii Toksaitov
3
+ #
4
+ # This file is part of Most.
5
+ #
6
+ # Most is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # Most is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with Most. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ require 'yaml'
20
+
21
+ module Most
22
+
23
+ class Report
24
+ attr_accessor :name, :specs
25
+
26
+ def initialize(name = 'Untitled Report', specs = {})
27
+ @name = name
28
+ @specs = specs
29
+
30
+ @units = []
31
+ end
32
+
33
+ def add_entry(entry)
34
+ @units << entry
35
+ end
36
+ alias << add_entry
37
+
38
+ def get_entry(index)
39
+ @units[index]
40
+ end
41
+ alias [] get_entry
42
+
43
+ def set_entry(index, value)
44
+ @units[index] = value
45
+ end
46
+ alias []= set_entry
47
+
48
+ def delete_entry(entry)
49
+ @units.delete(entry)
50
+ end
51
+ alias delete delete_entry
52
+
53
+ def delete_entry_at(index)
54
+ @units.delete_at(index)
55
+ end
56
+ alias delete_at delete_entry_at
57
+
58
+ def first_entry()
59
+ @units.first
60
+ end
61
+ alias first first_entry
62
+
63
+ def first_entry=(entry)
64
+ @units.first = entry
65
+ end
66
+ alias first= first_entry=
67
+
68
+ def last_entry()
69
+ @units.last
70
+ end
71
+ alias last last_entry
72
+
73
+ def last_entry=(entry)
74
+ @units.last = entry
75
+ end
76
+ alias last= last_entry=
77
+
78
+ def to_s()
79
+ to_yaml()
80
+ end
81
+ alias text to_s
82
+ end
83
+
84
+ end