most 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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