ciat 0.4.9 → 0.4.10

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 (50) hide show
  1. data/lib/ciat.rb +1 -2
  2. data/lib/ciat/{test_file.rb → ciat_file.rb} +21 -9
  3. data/lib/ciat/erb_helpers.rb +6 -1
  4. data/lib/ciat/feedback/feedback_counter.rb +11 -19
  5. data/lib/ciat/feedback/return_status.rb +6 -2
  6. data/lib/ciat/feedback/standard_output.rb +7 -2
  7. data/lib/ciat/processors/compilation_interpreter.rb +20 -7
  8. data/lib/ciat/processors/compiler.rb +38 -15
  9. data/lib/ciat/processors/interpreter.rb +28 -7
  10. data/lib/ciat/processors/java.rb +2 -8
  11. data/lib/ciat/processors/parrot.rb +0 -3
  12. data/lib/ciat/subresult.rb +14 -4
  13. data/lib/ciat/subtest.rb +83 -0
  14. data/lib/ciat/suite.rb +9 -9
  15. data/lib/ciat/suite_builder.rb +5 -5
  16. data/lib/ciat/test.rb +36 -28
  17. data/lib/ciat/test_result.rb +2 -2
  18. data/lib/ciat/traffic_light.rb +5 -14
  19. data/lib/data/ciat.css +14 -2
  20. data/lib/data/elements.yml +8 -2
  21. data/lib/templates/detail_row.html.erb +10 -4
  22. data/lib/templates/report.html.erb +5 -5
  23. data/lib/templates/summary_row.html.erb +5 -3
  24. data/spec/ciat/{test_file_spec.rb → ciat_file_spec.rb} +51 -19
  25. data/spec/ciat/erb_helpers_spec.rb +8 -13
  26. data/spec/ciat/feedback/feedback_counter_spec.rb +37 -57
  27. data/spec/ciat/feedback/return_status_spec.rb +67 -61
  28. data/spec/ciat/feedback/standard_output_spec.rb +21 -15
  29. data/spec/ciat/processors/compilation_interpreter_spec.rb +12 -0
  30. data/spec/ciat/processors/compiler_spec.rb +12 -0
  31. data/spec/ciat/processors/interpreter_spec.rb +12 -0
  32. data/spec/ciat/processors/java_spec.rb +0 -10
  33. data/spec/ciat/processors/parrot_spec.rb +0 -10
  34. data/spec/ciat/processors/shared_examples_for_element_names.rb +27 -0
  35. data/spec/ciat/rake_task_spec.rb +65 -0
  36. data/spec/ciat/subresult_spec.rb +13 -12
  37. data/spec/ciat/subtest_spec.rb +199 -0
  38. data/spec/ciat/suite_builder_spec.rb +17 -17
  39. data/spec/ciat/suite_spec.rb +13 -13
  40. data/spec/ciat/test_result_spec.rb +36 -0
  41. data/spec/ciat/test_spec.rb +73 -83
  42. data/spec/ciat/traffic_light_spec.rb +21 -31
  43. data/spec/spec_helper.rb +16 -53
  44. data/spec/templates/detail_row/elements_html_erb_spec.rb +3 -4
  45. data/spec/templates/detail_row_html_erb_spec.rb +84 -23
  46. data/spec/templates/elements/diff_html_erb_spec.rb +5 -3
  47. data/spec/templates/summary_row_html_erb_spec.rb +21 -14
  48. metadata +13 -7
  49. data/lib/ciat/processors/basic_processing.rb +0 -55
  50. data/spec/ciat/processors/basic_processing_spec.rb +0 -146
@@ -3,16 +3,6 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
3
3
  require 'ciat/processors/parrot'
4
4
 
5
5
  describe CIAT::Processors::Parrot do
6
- describe "mixins" do
7
- it "should use basic processing module" do
8
- CIAT::Processors::Parrot.should include(CIAT::Processors::BasicProcessing)
9
- end
10
-
11
- it "should use basic processing module" do
12
- CIAT::Processors::Parrot.should include(CIAT::Differs::HtmlDiffer)
13
- end
14
- end
15
-
16
6
  describe "default executor" do
17
7
  before(:each) do
18
8
  @executor = CIAT::Processors::Parrot.new
@@ -0,0 +1,27 @@
1
+ shared_examples_for "Any element namer" do
2
+ describe "element-name hash" do
3
+ [CIAT::TrafficLight::RED, CIAT::TrafficLight::YELLOW, CIAT::TrafficLight::GREEN, CIAT::TrafficLight::UNSET].each do |light|
4
+ [:happy, :sad].each do |path|
5
+ it "should compute relevant elements for #{light.color} light and #{path} path" do
6
+ @namer.relevant_elements(light, path).should_not be_nil
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ it "should have an output name" do
13
+ @namer.output_name.should be_an_instance_of(Symbol)
14
+ end
15
+
16
+ it "should have an input name" do
17
+ @namer.input_name.should be_an_instance_of(Symbol)
18
+ end
19
+
20
+ it "should have an error name" do
21
+ @namer.error_name.should be_an_instance_of(Symbol)
22
+ end
23
+
24
+ it "should have a happy_path?" do
25
+ @namer.happy_path_element.should be_an_instance_of(Symbol)
26
+ end
27
+ end
@@ -0,0 +1,65 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe CIAT::RakeTask do
4
+ it "should initialize" do
5
+ CIAT::RakeTask.new.should_not be_nil
6
+ end
7
+
8
+ it "should let me set processors" do
9
+ processors = mock("processors")
10
+ CIAT::RakeTask.new do |task|
11
+ task.processors = processors
12
+ end.processors.should == processors
13
+ end
14
+
15
+ it "should let me append processors" do
16
+ processors = array_of_mocks(3, "processor")
17
+ CIAT::RakeTask.new do |task|
18
+ task.processors << processors[0]
19
+ task.processors << processors[1]
20
+ task.processors << processors[2]
21
+ end.processors.should == processors
22
+ end
23
+
24
+ it "should let me set the files for input" do
25
+ files = mock("file")
26
+ CIAT::RakeTask.new do |task|
27
+ task.files = files
28
+ end.files.should == files
29
+ end
30
+
31
+ it "should let me set the feedback" do
32
+ feedback = mock("feedback")
33
+ CIAT::RakeTask.new do |task|
34
+ task.feedback = feedback
35
+ end.feedback.should == feedback
36
+ end
37
+
38
+ it "should let set the folder for input files" do
39
+ folder = mock("folder")
40
+ CIAT::RakeTask.new do |task|
41
+ task.folder = folder
42
+ end.folder.should == folder
43
+ end
44
+
45
+ it "should let me set the report filename" do
46
+ report_filename = mock("report filename")
47
+ CIAT::RakeTask.new do |task|
48
+ task.report_filename = report_filename
49
+ end.report_filename.should == report_filename
50
+ end
51
+
52
+ it "should let me set the report title" do
53
+ report_title = mock("report title")
54
+ CIAT::RakeTask.new do |task|
55
+ task.report_title = report_title
56
+ end.report_title.should == report_title
57
+ end
58
+
59
+ it "should let me set the output folder" do
60
+ output_folder = mock("output folder")
61
+ CIAT::RakeTask.new do |task|
62
+ task.output_folder = output_folder
63
+ end.output_folder.should == output_folder
64
+ end
65
+ end
@@ -3,10 +3,11 @@ require File.dirname(__FILE__) + '/../spec_helper'
3
3
  describe CIAT::Subresult do
4
4
  before(:each) do
5
5
  @elements = mock("elements")
6
+ @path_kind = mock("path kind")
6
7
  @light = mock("light")
7
- @processor = mock("processor")
8
+ @subtest = mock("subtest")
8
9
 
9
- @subtest_result = CIAT::Subresult.new(@elements, @light, @processor)
10
+ @subresult = CIAT::Subresult.new(@elements, @path_kind, @light, @subtest)
10
11
  end
11
12
 
12
13
  it "should look up relevant elements" do
@@ -14,7 +15,7 @@ describe CIAT::Subresult do
14
15
  names = [mock("name 0"), mock("name 1"), mock("name 2")]
15
16
  relevants = [mock("element 0"), mock("element 1"), mock("element 2")]
16
17
 
17
- @subtest_result.should_receive(:relevant_element_names).and_return(names)
18
+ @subresult.should_receive(:relevant_element_names).and_return(names)
18
19
  @elements.should_receive(:element?).with(names[0]).and_return(true)
19
20
  @elements.should_receive(:element).with(names[0]).and_return(relevants[0])
20
21
  @elements.should_receive(:element?).with(names[1]).and_return(true)
@@ -22,19 +23,19 @@ describe CIAT::Subresult do
22
23
  @elements.should_receive(:element?).with(names[2]).and_return(true)
23
24
  @elements.should_receive(:element).with(names[2]).and_return(relevants[2])
24
25
 
25
- @subtest_result.relevant_elements.should == relevants
26
+ @subresult.relevant_elements.should == relevants
26
27
  end
27
28
 
28
29
  it "should have relevant element names" do
29
- kind, hash, setting =
30
- mock("kind"), mock("hash"), mock("setting")
30
+ kind = mock("kind")
31
+ path_kind = mock("path kind")
31
32
  names = mock("names")
33
+
34
+ @subtest.should_receive(:path_kind).and_return(path_kind)
35
+ @subtest.stub_chain(:processor, :kind).and_return(kind)
36
+ kind.should_receive(:relevant_elements).
37
+ with(@light, path_kind).and_return(names)
32
38
 
33
- @processor.should_receive(:kind).and_return(kind)
34
- kind.should_receive(:element_name_hash).and_return(hash)
35
- @light.should_receive(:setting).and_return(setting)
36
- hash.should_receive(:[]).with(setting).and_return(names)
37
-
38
- @subtest_result.relevant_element_names.should == names
39
+ @subresult.relevant_element_names.should == names
39
40
  end
40
41
  end
@@ -0,0 +1,199 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe CIAT::Subtest do
4
+ before(:each) do
5
+ @ciat_file = mock("ciat file")
6
+ @processor = mock("processor")
7
+ @subtest = CIAT::Subtest.new(@ciat_file, @processor)
8
+ end
9
+
10
+ describe "processing" do
11
+ it "should execute and diff normally" do
12
+ @subtest.should_receive(:execute).with().and_return(true)
13
+ @subtest.should_receive(:diff).with().and_return(true)
14
+
15
+ @subtest.process.should == CIAT::TrafficLight::GREEN
16
+ end
17
+
18
+ it "should execute with an error" do
19
+ @subtest.should_receive(:execute).with().and_return(false)
20
+
21
+ @subtest.process.should == CIAT::TrafficLight::YELLOW
22
+ end
23
+
24
+ it "should execute normally and diff with a failure" do
25
+ @subtest.should_receive(:execute).with().and_return(true)
26
+ @subtest.should_receive(:diff).with().and_return(false)
27
+
28
+ @subtest.process.should == CIAT::TrafficLight::RED
29
+ end
30
+ end
31
+
32
+ it "should determine a happy path" do
33
+ result = mock("result")
34
+
35
+ @processor.stub_chain(:kind, :happy_path_element).and_return(:foobar)
36
+ @ciat_file.should_receive(:element?).with(:foobar).and_return(result)
37
+
38
+ @subtest.happy_path?.should == result
39
+ end
40
+
41
+ describe "path kind" do
42
+ it "should indicate happy path as path kind" do
43
+ @subtest.should_receive(:happy_path?).with().and_return(true)
44
+
45
+ @subtest.path_kind.should == :happy
46
+ end
47
+
48
+ it "should indicate sad path as path kind" do
49
+ @subtest.should_receive(:happy_path?).with().and_return(false)
50
+
51
+ @subtest.path_kind.should == :sad
52
+ end
53
+ end
54
+
55
+ describe "executing a processor for a test" do
56
+ it "should run successful command line for happy path" do
57
+ kind = mock("kind")
58
+ result = mock("result")
59
+
60
+ @subtest.should_receive(:command_line).and_return("[command line]")
61
+ @subtest.should_receive(:happy_path?).with().and_return(true)
62
+ @subtest.should_receive(:sh).with("[command line]").
63
+ and_yield(true, result)
64
+
65
+ @subtest.execute.should be_true
66
+ end
67
+
68
+ it "should run erroring command line for happy path" do
69
+ test, kind = mock("test"), mock("kind")
70
+ result = mock("result")
71
+
72
+ @subtest.should_receive(:command_line).and_return("[command line]")
73
+ @subtest.should_receive(:happy_path?).with().and_return(true)
74
+ @subtest.should_receive(:sh).with("[command line]").
75
+ and_yield(false, result)
76
+
77
+ @subtest.execute.should be_false
78
+ end
79
+
80
+ it "should prepare a command line" do
81
+ test = mock("test")
82
+
83
+ @processor.should_receive(:executable).and_return("[executable]")
84
+ @subtest.should_receive(:input_file).with().
85
+ and_return("[input]")
86
+ @subtest.should_receive(:command_line_args).with().
87
+ and_return("[args]")
88
+ @subtest.should_receive(:output_file).with().
89
+ and_return("[output]")
90
+ @subtest.should_receive(:error_file).with().
91
+ and_return("[error]")
92
+
93
+ @subtest.command_line.should ==
94
+ "[executable] '[input]' [args] > '[output]' 2> '[error]'"
95
+ end
96
+ end
97
+
98
+ describe "handling command-line arguments" do
99
+ it "should strip command-line arguments" do
100
+ command_line = mock("command_line")
101
+
102
+ @ciat_file.should_receive(:element?).with(:command_line).
103
+ and_return(true)
104
+ @ciat_file.should_receive(:element).with(:command_line).
105
+ and_return(command_line)
106
+ command_line.should_receive(:content).
107
+ and_return(" argument1 \t argument2 \n\n")
108
+
109
+ @subtest.command_line_args.should == "argument1 \t argument2"
110
+ end
111
+
112
+ it "should return empty string if none provided" do
113
+ @ciat_file.should_receive(:element?).
114
+ with(:command_line).and_return(false)
115
+
116
+ @subtest.command_line_args.should == ''
117
+ end
118
+ end
119
+
120
+ describe "computing a diff" do
121
+ it "should compute a diff in HTML for normal output" do
122
+ kind, result = mock("processor kind"), mock("result")
123
+ output_name = mock("output name")
124
+
125
+ @subtest.should_receive(:happy_path?).with().and_return(true)
126
+ @processor.should_receive(:kind).any_number_of_times.and_return(kind)
127
+ kind.should_receive(:output_name).any_number_of_times.
128
+ and_return(output_name)
129
+ original_file = expect_element_as_file(output_name)
130
+ generated_file = expect_element_as_file(output_name, :generated)
131
+ diff_file = expect_element_as_file(output_name, :diff)
132
+ @subtest.should_receive(:html_diff).
133
+ with(original_file, generated_file, diff_file).and_return(result)
134
+
135
+ @subtest.diff.should == result
136
+ end
137
+
138
+ it "should compute a diff in HTML for error output" do
139
+ kind, result = mock("processor kind"), mock("result")
140
+ error_name = mock("error name")
141
+
142
+ @subtest.should_receive(:happy_path?).with().and_return(false)
143
+ @processor.should_receive(:kind).any_number_of_times.and_return(kind)
144
+ kind.should_receive(:error_name).any_number_of_times.
145
+ and_return(error_name)
146
+ original_file = expect_element_as_file(error_name)
147
+ generated_file = expect_element_as_file(error_name, :generated)
148
+ diff_file = expect_element_as_file(error_name, :diff)
149
+ @subtest.should_receive(:html_diff).
150
+ with(original_file, generated_file, diff_file).and_return(result)
151
+
152
+ @subtest.diff.should == result
153
+ end
154
+
155
+ def expect_element_as_file(*names)
156
+ element, filename = mock("#{names} element"), mock("#{names} filename")
157
+ @ciat_file.should_receive(:element).with(*names).and_return(element)
158
+ element.should_receive(:as_file).and_return(filename)
159
+ filename
160
+ end
161
+ end
162
+
163
+ it "should get filename of input" do
164
+ kind, element, name = mock("kind"), mock("element"), mock("name")
165
+ filename = mock("filename")
166
+
167
+ @processor.should_receive(:kind).and_return(kind)
168
+ kind.should_receive(:input_name).and_return(name)
169
+ @ciat_file.should_receive(:element).with(name).and_return(element)
170
+ element.should_receive(:as_file).and_return(filename)
171
+
172
+ @subtest.input_file.should == filename
173
+ end
174
+
175
+ it "should get filename of output" do
176
+ kind, element, name = mock("kind"), mock("element"), mock("name")
177
+ filename = mock("filename")
178
+
179
+ @processor.should_receive(:kind).and_return(kind)
180
+ kind.should_receive(:output_name).and_return(name)
181
+ @ciat_file.should_receive(:element).with(name, :generated).and_return(element)
182
+ element.should_receive(:as_file).and_return(filename)
183
+
184
+ @subtest.output_file.should == filename
185
+ end
186
+
187
+ it "should get filename of error" do
188
+ kind, element, name = mock("kind"), mock("element"), mock("name")
189
+ filename = mock("filename")
190
+
191
+ @processor.should_receive(:kind).and_return(kind)
192
+ kind.should_receive(:error_name).and_return(name)
193
+ @ciat_file.should_receive(:element).
194
+ with(name, :generated).and_return(element)
195
+ element.should_receive(:as_file).and_return(filename)
196
+
197
+ @subtest.error_file.should == filename
198
+ end
199
+ end
@@ -17,23 +17,23 @@ describe CIAT::SuiteBuilder do
17
17
  it "should make test files" do
18
18
  files = array_of_mocks(3, "files")
19
19
  output_folder = mock("output folder")
20
- test_files = array_of_mocks(3, "test file")
20
+ ciat_files = array_of_mocks(3, "ciat file")
21
21
 
22
22
  @default_builder.should_receive(:build_output_folder).
23
23
  at_least(:once).and_return(output_folder)
24
- CIAT::TestFile.should_receive(:new).
25
- with(files[0], output_folder).and_return(test_files[0])
26
- CIAT::TestFile.should_receive(:new).
27
- with(files[1], output_folder).and_return(test_files[1])
28
- CIAT::TestFile.should_receive(:new).
29
- with(files[2], output_folder).and_return(test_files[2])
24
+ CIAT::CiatFile.should_receive(:new).
25
+ with(files[0], output_folder).and_return(ciat_files[0])
26
+ CIAT::CiatFile.should_receive(:new).
27
+ with(files[1], output_folder).and_return(ciat_files[1])
28
+ CIAT::CiatFile.should_receive(:new).
29
+ with(files[2], output_folder).and_return(ciat_files[2])
30
30
 
31
- @default_builder.make_test_files(files).should == test_files
31
+ @default_builder.make_ciat_files(files).should == ciat_files
32
32
  end
33
33
 
34
34
  it "should complain if no test files to make" do
35
35
  lambda {
36
- @default_builder.make_test_files([])
36
+ @default_builder.make_ciat_files([])
37
37
  }.should raise_error(IOError)
38
38
  end
39
39
  end
@@ -41,30 +41,30 @@ describe CIAT::SuiteBuilder do
41
41
  describe "getting and processing test files" do
42
42
  it "should get filename from filenames option" do
43
43
  files = mock("files")
44
- test_files = mock("test files")
44
+ ciat_files = mock("ciat files")
45
45
 
46
46
  options[:files] = files
47
- @default_builder.should_receive(:make_test_files).
48
- with(files).and_return(test_files)
47
+ @default_builder.should_receive(:make_ciat_files).
48
+ with(files).and_return(ciat_files)
49
49
 
50
- @default_builder.build_test_files.should == test_files
50
+ @default_builder.build_ciat_files.should == ciat_files
51
51
  end
52
52
 
53
53
  it "should get filenames from folder" do
54
54
  input_folder, pattern = mock("input folder"), mock("pattern")
55
55
  files = mock("files")
56
56
  output_folder = mock("output folder")
57
- test_files = mock("test files")
57
+ ciat_files = mock("ciat files")
58
58
 
59
59
  options[:folder] = input_folder
60
60
  options[:pattern] = pattern
61
61
  File.should_receive(:join).with(input_folder, "**", pattern).
62
62
  and_return("the full path")
63
63
  Dir.should_receive(:[]).with("the full path").and_return(files)
64
- @default_builder.should_receive(:make_test_files).
65
- with(files).and_return(test_files)
64
+ @default_builder.should_receive(:make_ciat_files).
65
+ with(files).and_return(ciat_files)
66
66
 
67
- @default_builder.build_test_files.should == test_files
67
+ @default_builder.build_ciat_files.should == ciat_files
68
68
  end
69
69
  end
70
70
  end
@@ -6,9 +6,9 @@ describe CIAT::Suite do
6
6
  it "should construct with suite builder" do
7
7
  options = mock("options")
8
8
  suite_builder = mock("suite builder")
9
- processors, output_folder, test_files, feedback =
9
+ processors, output_folder, ciat_files, feedback =
10
10
  mock("processors"), mock("output folder"),
11
- mock("test files"), mock("feedback")
11
+ mock("ciat files"), mock("feedback")
12
12
  suite = mock("suite")
13
13
 
14
14
  CIAT::SuiteBuilder.should_receive(:new).
@@ -16,10 +16,10 @@ describe CIAT::Suite do
16
16
  suite_builder.should_receive(:build_processors).and_return(processors)
17
17
  suite_builder.should_receive(:build_output_folder).
18
18
  and_return(output_folder)
19
- suite_builder.should_receive(:build_test_files).and_return(test_files)
19
+ suite_builder.should_receive(:build_ciat_files).and_return(ciat_files)
20
20
  suite_builder.should_receive(:build_feedback).and_return(feedback)
21
21
  CIAT::Suite.should_receive(:new).
22
- with(processors, output_folder, test_files, feedback).and_return(suite)
22
+ with(processors, output_folder, ciat_files, feedback).and_return(suite)
23
23
 
24
24
  CIAT::Suite.build(options).should == suite
25
25
  end
@@ -28,15 +28,15 @@ describe CIAT::Suite do
28
28
  before(:each) do
29
29
  @processors = array_of_mocks(3, "processor")
30
30
  @output_folder = mock("output folder")
31
- @test_files = array_of_mocks(3, "test file")
31
+ @ciat_files = array_of_mocks(3, "ciat file")
32
32
  @feedback = mock("feedback")
33
33
  @suite = CIAT::Suite.new(
34
- @processors, @output_folder, @test_files, @feedback
34
+ @processors, @output_folder, @ciat_files, @feedback
35
35
  )
36
36
  end
37
37
 
38
38
  it "should have a size based on the number of test files" do
39
- @suite.stub_chain(:test_files, :size).and_return(42)
39
+ @suite.stub_chain(:ciat_files, :size).and_return(42)
40
40
 
41
41
  @suite.size.should == 42
42
42
  end
@@ -46,18 +46,18 @@ describe CIAT::Suite do
46
46
  results = array_of_mocks(3, "result")
47
47
 
48
48
  @feedback.should_receive(:pre_tests).with(@suite)
49
- expect_create_and_run_test(@test_files[0], results[0])
50
- expect_create_and_run_test(@test_files[1], results[1])
51
- expect_create_and_run_test(@test_files[2], results[2])
49
+ expect_create_and_run_test(@ciat_files[0], results[0])
50
+ expect_create_and_run_test(@ciat_files[1], results[1])
51
+ expect_create_and_run_test(@ciat_files[2], results[2])
52
52
  @feedback.should_receive(:post_tests).with(@suite)
53
53
 
54
54
  @suite.run.should == results
55
55
  @suite.results.should == results
56
56
  end
57
57
 
58
- def expect_create_and_run_test(test_file, result)
59
- test = mock("test for #{test_file}")
60
- @suite.should_receive(:create_test).with(test_file).and_return(test)
58
+ def expect_create_and_run_test(ciat_file, result)
59
+ test = mock("test for #{ciat_file}")
60
+ @suite.should_receive(:create_test).with(ciat_file).and_return(test)
61
61
  test.should_receive(:run).and_return(result)
62
62
  end
63
63
  end