test-parser 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +12 -0
- data/License.txt +20 -0
- data/Manifest.txt +29 -0
- data/README.txt +3 -0
- data/Rakefile +147 -0
- data/bin/test_parser +16 -0
- data/lib/test-parser.rb +14 -0
- data/lib/test-parser/parsers/base.rb +5 -0
- data/lib/test-parser/parsers/junit4.rb +18 -0
- data/lib/test-parser/parsers/pyunit.rb +40 -0
- data/lib/test-parser/parsers/quickCheck.rb +34 -0
- data/lib/test-parser/parsers/rspec.rb +61 -0
- data/lib/test-parser/parsers/rubyunit.rb +42 -0
- data/lib/test-parser/version.rb +16 -0
- data/scripts/txt2html +68 -0
- data/setup.rb +1585 -0
- data/spec/example_data/junit4.rb +17 -0
- data/spec/example_data/pyunit.rb +143 -0
- data/spec/example_data/quickCheck.rb +61 -0
- data/spec/example_data/rspec.rb +105 -0
- data/spec/example_data/rubyunit.rb +77 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/test_parsers_spec.rb +101 -0
- data/website/index.html +158 -0
- data/website/index.txt +98 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/parser_output.txt +31 -0
- data/website/stylesheets/screen.css +157 -0
- data/website/template.rhtml +48 -0
- metadata +80 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
#not sure if this is junit4
|
2
|
+
#stolen from http://www.samspublishing.com/articles/article.asp?p=32052&seqNum=6&rl=1
|
3
|
+
[
|
4
|
+
["% java com.networksByteDesign.eMarket.inventory.salesItemTest
|
5
|
+
.F.
|
6
|
+
Time: 0.033
|
7
|
+
There was 1 failure:
|
8
|
+
1) testConstructor(com.networksByteDesign.eMarket.inventory.salesItemTest)
|
9
|
+
\"Expected exception was not thrown\"
|
10
|
+
|
11
|
+
FAILURES!!!
|
12
|
+
Tests run: 2, Failures: 1, Errors: 0",
|
13
|
+
{:failure_count => 1, :success_count => 1, :test_count => 2,
|
14
|
+
# :failures => [{:test => 'testConstructor',
|
15
|
+
# :message => "Expected exception was not thrown"}]
|
16
|
+
}],
|
17
|
+
]
|
@@ -0,0 +1,143 @@
|
|
1
|
+
[
|
2
|
+
#baseline
|
3
|
+
[
|
4
|
+
"...................
|
5
|
+
----------------------------------------------------------------------
|
6
|
+
Ran 19 tests in 2.181s
|
7
|
+
|
8
|
+
OK
|
9
|
+
",
|
10
|
+
{:success_count => 19, :failure_count => 0}
|
11
|
+
],
|
12
|
+
|
13
|
+
#verbose mode...
|
14
|
+
[
|
15
|
+
"Should perform the same as reading, then parsing the header ... ok
|
16
|
+
testHeaderParsing (__main__.TestHTTPProtocol) ... ok
|
17
|
+
Attempting to parse a header that doesn't end in \\r\\n\\r\\n should raise a ValueError ... ok
|
18
|
+
A valid buffer read in shouldn't cause parse_header to complain ... ok
|
19
|
+
Grabbing the next header should leave all other data after the header ... ok
|
20
|
+
If two headers are in the buffer reading twice in a row should produce one header, then the next. ... ok
|
21
|
+
|
22
|
+
----------------------------------------------------------------------
|
23
|
+
Ran 6 tests in 0.003s
|
24
|
+
|
25
|
+
OK",
|
26
|
+
{:failure_count => 0, :success_count => 6,
|
27
|
+
|
28
|
+
#YAGNI has stripped this functionality right out...
|
29
|
+
# :test_names => ["Should perform the same as reading, then parsing the header",
|
30
|
+
# "testHeaderParsing (__main__.TestHTTPProtocol)",
|
31
|
+
# "Attempting to parse a header that doesn't end in \\r\\n\\r\\n should raise a ValueError",
|
32
|
+
# "A valid buffer read in shouldn't cause parse_header to complain",
|
33
|
+
# "Grabbing the next header should leave all other data after the header",
|
34
|
+
# "If two headers are in the buffer reading twice in a row should produce one header, then the next."]}
|
35
|
+
}],
|
36
|
+
#testing for an ERROR
|
37
|
+
[
|
38
|
+
"...E..
|
39
|
+
======================================================================
|
40
|
+
ERROR: A valid buffer read in shouldn't cause parse_header to complain
|
41
|
+
----------------------------------------------------------------------
|
42
|
+
Traceback (most recent call last):
|
43
|
+
File \"test_http.py\", line 24, in testReadHeader
|
44
|
+
header = self.http.read_header()
|
45
|
+
File \"/Users/peter/Documents/Class Notes/2007s/Networking/labs/software/2/http/http.py\", line 124, in read_header
|
46
|
+
match = find_header.match(self.buffer)
|
47
|
+
TypeError: expected string or buffer
|
48
|
+
|
49
|
+
----------------------------------------------------------------------
|
50
|
+
Ran 6 tests in 0.022s
|
51
|
+
|
52
|
+
FAILED (errors=1)",
|
53
|
+
{
|
54
|
+
:failure_count => 1,
|
55
|
+
:success_count => 5,
|
56
|
+
:failures => [{
|
57
|
+
:file => "test_http.py",
|
58
|
+
:line => 24,
|
59
|
+
:error_type => "TypeError",
|
60
|
+
:message => "expected string or buffer",
|
61
|
+
:method => "testReadHeader",
|
62
|
+
:test => "A valid buffer read in shouldn't cause parse_header to complain",
|
63
|
+
}],
|
64
|
+
}],
|
65
|
+
#testing for FAIL
|
66
|
+
[
|
67
|
+
"....F.
|
68
|
+
======================================================================
|
69
|
+
FAIL: Grabbing the next header should leave all other data after the header
|
70
|
+
----------------------------------------------------------------------
|
71
|
+
Traceback (most recent call last):
|
72
|
+
File \"test_http.py\", line 32, in testReadHeadersHandlesExtraDataProperly
|
73
|
+
self.assertEqual(self.http.buffer,3)#data)
|
74
|
+
AssertionError: 'Lieutenant Commander' != 3
|
75
|
+
|
76
|
+
----------------------------------------------------------------------
|
77
|
+
Ran 6 tests in 0.003s
|
78
|
+
|
79
|
+
FAILED (failures=1)
|
80
|
+
",
|
81
|
+
{
|
82
|
+
:failure_count => 1,
|
83
|
+
:success_count => 5,
|
84
|
+
:failures => [{
|
85
|
+
:file => "test_http.py",
|
86
|
+
:line => 32,
|
87
|
+
:error_type => "AssertionError",
|
88
|
+
:message => "'Lieutenant Commander' != 3",
|
89
|
+
:test => "Grabbing the next header should leave all other data after the header",
|
90
|
+
:method => "testReadHeadersHandlesExtraDataProperly",
|
91
|
+
}],
|
92
|
+
},
|
93
|
+
],
|
94
|
+
|
95
|
+
#test multiple failures
|
96
|
+
[
|
97
|
+
"...EF.
|
98
|
+
======================================================================
|
99
|
+
ERROR: A valid buffer read in shouldn't cause parse_header to complain
|
100
|
+
----------------------------------------------------------------------
|
101
|
+
Traceback (most recent call last):
|
102
|
+
File \"test_http.py\", line 24, in testReadHeader
|
103
|
+
header = self.http.read_header()
|
104
|
+
File \"/Users/peter/Documents/Class Notes/2007s/Networking/labs/software/2/http/http.py\", line 124, in read_header
|
105
|
+
match = find_header.match(self.buffer)
|
106
|
+
TypeError: expected string or buffer
|
107
|
+
|
108
|
+
======================================================================
|
109
|
+
FAIL: Grabbing the next header should leave all other data after the header
|
110
|
+
----------------------------------------------------------------------
|
111
|
+
Traceback (most recent call last):
|
112
|
+
File \"test_http.py\", line 32, in testReadHeadersHandlesExtraDataProperly
|
113
|
+
self.assertEqual(self.http.buffer,3)#data)
|
114
|
+
AssertionError: 'Lieutenant Commander' != 3
|
115
|
+
|
116
|
+
----------------------------------------------------------------------
|
117
|
+
Ran 6 tests in 0.003s
|
118
|
+
|
119
|
+
FAILED (failures=1, errors=1)",
|
120
|
+
{
|
121
|
+
:success_count => 4,
|
122
|
+
:failure_count => 2,
|
123
|
+
:failures => [
|
124
|
+
{
|
125
|
+
:file => "test_http.py",
|
126
|
+
:line => 32,
|
127
|
+
:error_type => "AssertionError",
|
128
|
+
:message => "'Lieutenant Commander' != 3",
|
129
|
+
:test => "Grabbing the next header should leave all other data after the header",
|
130
|
+
:method => "testReadHeadersHandlesExtraDataProperly",
|
131
|
+
},
|
132
|
+
{
|
133
|
+
:file => "test_http.py",
|
134
|
+
:line => 24,
|
135
|
+
:error_type => "TypeError",
|
136
|
+
:message => "expected string or buffer",
|
137
|
+
:method => "testReadHeader",
|
138
|
+
:test => "A valid buffer read in shouldn't cause parse_header to complain",
|
139
|
+
}
|
140
|
+
]
|
141
|
+
}
|
142
|
+
]
|
143
|
+
]
|
@@ -0,0 +1,61 @@
|
|
1
|
+
[
|
2
|
+
[
|
3
|
+
' ___ ___ _
|
4
|
+
/ _ \ /\ /\/ __(_)
|
5
|
+
/ /_\// /_/ / / | | GHC Interactive, version 6.5.20060608, for Haskell 98.
|
6
|
+
/ /_\\\\/ __ / /___| | http://www.haskell.org/ghc/
|
7
|
+
\____/\/ /_/\____/|_| Type :? for help.
|
8
|
+
|
9
|
+
Loading package base-1.0 ... linking ... done.
|
10
|
+
Prelude> [1 of 2] Compiling QuickCheck ( QuickCheck.hs, interpreted )
|
11
|
+
[2 of 2] Compiling Main ( primes.hs, interpreted )
|
12
|
+
Ok, modules loaded: QuickCheck, Main.
|
13
|
+
*Main> Loading package haskell98-1.0 ... linking ... done.
|
14
|
+
OK, passed 100 tests.
|
15
|
+
*Main> Leaving GHCi.
|
16
|
+
',
|
17
|
+
{:failure_count => 0, :success_count => 1, :test_count => 1}
|
18
|
+
],
|
19
|
+
[
|
20
|
+
' ___ ___ _
|
21
|
+
/ _ \ /\ /\/ __(_)
|
22
|
+
/ /_\// /_/ / / | | GHC Interactive, version 6.5.20060608, for Haskell 98.
|
23
|
+
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
|
24
|
+
\____/\/ /_/\____/|_| Type :? for help.
|
25
|
+
|
26
|
+
Loading package base-1.0 ... linking ... done.
|
27
|
+
Prelude> [1 of 2] Compiling QuickCheck ( QuickCheck.hs, interpreted )
|
28
|
+
[2 of 2] Compiling Main ( primes.hs, interpreted )
|
29
|
+
Ok, modules loaded: QuickCheck, Main.
|
30
|
+
*Main> Loading package haskell98-1.0 ... linking ... done.
|
31
|
+
prop_PrimesArePrime: Falsifiable, after 0 tests:
|
32
|
+
5696
|
33
|
+
*Main> Leaving GHCi.
|
34
|
+
',
|
35
|
+
{:failure_count => 1, :success_count => 0, :test_count => 1,
|
36
|
+
:failures => [{:test => "prop_PrimesArePrime", :message => "Falsifiable, after 0 tests:\n5696"}]
|
37
|
+
}
|
38
|
+
],
|
39
|
+
|
40
|
+
[" ___ ___ _
|
41
|
+
/ _ \\ /\\ /\\/ __(_)
|
42
|
+
/ /_\\// /_/ / / | | GHC Interactive, version 6.5.20060608, for Haskell 98.
|
43
|
+
/ /_\\\\/ __ / /___| | http://www.haskell.org/ghc/
|
44
|
+
\\____/\\/ /_/\\____/|_| Type :? for help.
|
45
|
+
|
46
|
+
Loading package base-1.0 ... linking ... done.
|
47
|
+
Prelude> [1 of 2] Compiling QuickCheck ( QuickCheck.hs, interpreted )
|
48
|
+
[2 of 2] Compiling Main ( primes.hs, interpreted )
|
49
|
+
Ok, modules loaded: QuickCheck, Main.
|
50
|
+
*Main> Loading package haskell98-1.0 ... linking ... done.
|
51
|
+
prop_PrimesArePrime: OK, passed 100 tests.
|
52
|
+
*Main> prop_PrimesAreOdd: Falsifiable, after 65 tests:
|
53
|
+
2
|
54
|
+
*Main> Leaving GHCi.
|
55
|
+
",
|
56
|
+
{:failure_count => 1, :success_count => 1, :test_count => 2,
|
57
|
+
:failures => [{:test => "prop_PrimesAreOdd", :message => "Falsifiable, after 65 tests:\n2"}]}
|
58
|
+
],
|
59
|
+
|
60
|
+
|
61
|
+
]
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#This is a big array of example data.
|
2
|
+
|
3
|
+
#It consists of pairs of values.
|
4
|
+
#The first is the output to parse
|
5
|
+
#The second is a hash of values that should be extracted by the parser.
|
6
|
+
[
|
7
|
+
["
|
8
|
+
|
9
|
+
Finished in 0.007427 seconds
|
10
|
+
|
11
|
+
1 example, 0 failures",
|
12
|
+
{:success_count => 1, :failure_count => 0, :test_count => 1 }],
|
13
|
+
|
14
|
+
["This is a bunch of text.
|
15
|
+
- perhaps we can throw off the parser...
|
16
|
+
|
17
|
+
Finished in 0.007427 seconds
|
18
|
+
|
19
|
+
2 examples, 0 failures",
|
20
|
+
{:success_count => 2, :failure_count => 0, :test_count => 2}],
|
21
|
+
|
22
|
+
["[17, 18, 18, 17]
|
23
|
+
\"The 'internet'\"
|
24
|
+
|
25
|
+
Finished in 0.007427 seconds
|
26
|
+
|
27
|
+
2 specifications, 0 failures",
|
28
|
+
{:success_count => 2, :failure_count => 0, :test_count => 2}],
|
29
|
+
|
30
|
+
|
31
|
+
["the PyUnitParser
|
32
|
+
- should be able to count successes and failures in some examples (ERROR - 1)
|
33
|
+
|
34
|
+
the rspec parser
|
35
|
+
- should agree with the listed examples
|
36
|
+
- should be able to pick out a stack trace of an error
|
37
|
+
|
38
|
+
1)
|
39
|
+
NameError in 'the PyUnitParser should be able to count successes and failures in some examples'
|
40
|
+
undefined local variable or method `results' for PyUnitParser:Module
|
41
|
+
./spec/../lib/test-parser/parsers/pyunit.rb:8:in `parse'
|
42
|
+
./spec/test_pyunit_parser_spec.rb:13:
|
43
|
+
./spec/test_pyunit_parser_spec.rb:12:
|
44
|
+
|
45
|
+
Finished in 0.01853 seconds
|
46
|
+
|
47
|
+
3 examples, 1 failure
|
48
|
+
",
|
49
|
+
{:success_count => 2, :failure_count => 1, :test_count => 3,
|
50
|
+
:failures => [{:error_type => "NameError",
|
51
|
+
:file => './spec/../lib/test-parser/parsers/pyunit.rb',
|
52
|
+
:test => 'the PyUnitParser should be able to count successes and failures in some examples',
|
53
|
+
:line => 8,
|
54
|
+
:method => 'parse',
|
55
|
+
:message => "undefined local variable or method `results' for PyUnitParser:Module" }]
|
56
|
+
}
|
57
|
+
],
|
58
|
+
["1)
|
59
|
+
'RSpecParser should agree with the listed examples' FAILED
|
60
|
+
expected 1, got 2 (using ==)
|
61
|
+
./spec/test_rspec_parser_spec.rb:15:
|
62
|
+
|
63
|
+
Finished in 0.08832 seconds
|
64
|
+
|
65
|
+
1 examples, 1 failure
|
66
|
+
",{:failure_count => 1,
|
67
|
+
:failures => [{:test => 'RSpecParser should agree with the listed examples',
|
68
|
+
:message => 'expected 1, got 2 (using ==)',
|
69
|
+
:file => './spec/test_rspec_parser_spec.rb',
|
70
|
+
:line => 15
|
71
|
+
}]}],
|
72
|
+
["RSpecParser
|
73
|
+
- should agree with the listed examples
|
74
|
+
|
75
|
+
PyUnitParser
|
76
|
+
- should agree with the listed examples (ERROR - 1)
|
77
|
+
|
78
|
+
1)
|
79
|
+
SyntaxError in 'PyUnitParser should agree with the listed examples'
|
80
|
+
(eval):30: compile error
|
81
|
+
(eval):25: parse error, unexpected '=', expecting tASSOC
|
82
|
+
:test_names = [\"Should perform the same as reading, then parsing the header\",
|
83
|
+
^
|
84
|
+
(eval):30: parse error, unexpected '}', expecting $
|
85
|
+
./spec/test_parsers.rb:21:
|
86
|
+
./spec/test_parsers.rb:21:
|
87
|
+
|
88
|
+
Finished in 0.01552 seconds
|
89
|
+
|
90
|
+
2 examples, 1 failure
|
91
|
+
",
|
92
|
+
{:failure_count => 1, :success_count => 1,
|
93
|
+
:failures => [
|
94
|
+
{:file => "(eval)",
|
95
|
+
:line => 25,
|
96
|
+
:test => "PyUnitParser should agree with the listed examples",
|
97
|
+
:error_type => "SyntaxError",
|
98
|
+
:message => "(eval):30: compile error",
|
99
|
+
}
|
100
|
+
]
|
101
|
+
}
|
102
|
+
],
|
103
|
+
|
104
|
+
|
105
|
+
]
|
@@ -0,0 +1,77 @@
|
|
1
|
+
[
|
2
|
+
|
3
|
+
["Loaded suite -e
|
4
|
+
Started
|
5
|
+
.
|
6
|
+
Finished in 0.00045 seconds.
|
7
|
+
|
8
|
+
1 tests, 1 assertions, 0 failures, 0 errors
|
9
|
+
",
|
10
|
+
{:failure_count => 0, :success_count => 1, :test_count => 1}
|
11
|
+
],
|
12
|
+
|
13
|
+
["Loaded suite test/test_gtest
|
14
|
+
Started
|
15
|
+
F
|
16
|
+
Finished in 0.049108 seconds.
|
17
|
+
|
18
|
+
1) Failure:
|
19
|
+
test_truth(TestGtest) [test/test_gtest.rb:9]:
|
20
|
+
<false> is not true.
|
21
|
+
|
22
|
+
1 tests, 1 assertions, 1 failures, 0 errors
|
23
|
+
|
24
|
+
",
|
25
|
+
{:failure_count => 1, :success_count => 0, :test_count => 1,
|
26
|
+
:failures => [{:test => "test_truth(TestGtest)",
|
27
|
+
:file => "test/test_gtest.rb",
|
28
|
+
:line => 9,
|
29
|
+
:message => "<false> is not true."}]}
|
30
|
+
|
31
|
+
],
|
32
|
+
|
33
|
+
["Started
|
34
|
+
E
|
35
|
+
Finished in 0.00042 seconds.
|
36
|
+
|
37
|
+
1) Error:
|
38
|
+
test_truth(TestGtest):
|
39
|
+
RuntimeError: What
|
40
|
+
test/test_gtest.rb:9:in `test_truth'
|
41
|
+
|
42
|
+
1 tests, 0 assertions, 0 failures, 1 errors
|
43
|
+
",
|
44
|
+
{:failure_count => 1, :success_count => 0, :test_count => 1,
|
45
|
+
:failures => [{:test => "test_truth(TestGtest)",
|
46
|
+
:error_type => "RuntimeError",
|
47
|
+
:message => "What",
|
48
|
+
:file => "test/test_gtest.rb",
|
49
|
+
:line => 9,
|
50
|
+
:method => "test_truth"}]}
|
51
|
+
],
|
52
|
+
|
53
|
+
["snarl_notifier is not available
|
54
|
+
Loaded suite test/popup_notifier_test
|
55
|
+
Started
|
56
|
+
E
|
57
|
+
Finished in 0.010711 seconds.
|
58
|
+
|
59
|
+
1) Error:
|
60
|
+
test_growl(PopupNotifierTest):
|
61
|
+
NoMethodError: undefined method `LoadError' for #<PopupNotifier:0x112210c>
|
62
|
+
./test/../lib/popup_notifier.rb:10:in `initialize'
|
63
|
+
test/popup_notifier_test.rb:14:in `test_growl'
|
64
|
+
/opt/local/lib/ruby/gems/1.8/gems/mocha-0.5.1/lib/mocha/test_case_adapter.rb:19:in `run'
|
65
|
+
|
66
|
+
1 tests, 0 assertions, 0 failures, 1 errors
|
67
|
+
",
|
68
|
+
{:failure_count => 1, :success_count => 0, :test_count => 1,
|
69
|
+
:failures => [{:test => "test_growl(PopupNotifierTest)",
|
70
|
+
:error_type => "NoMethodError",
|
71
|
+
:message => "undefined method `LoadError' for #<PopupNotifier:0x112210c>",
|
72
|
+
:file => "./test/../lib/popup_notifier.rb",
|
73
|
+
:line => 10,
|
74
|
+
:method => "initialize"}]}
|
75
|
+
],
|
76
|
+
|
77
|
+
]
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
|
+
|
3
|
+
def have_key? ex, keys
|
4
|
+
keys = [keys] if !keys.respond_to?(:each)
|
5
|
+
ex.any? {|(_,c,_)|
|
6
|
+
keys.all? {|key| c[key]}
|
7
|
+
}
|
8
|
+
end
|
9
|
+
|
10
|
+
def hash_match ex, key
|
11
|
+
ex.each do |test_results, correct_info, parsed_info|
|
12
|
+
next if !correct_info[key] # don't test things that aren't in the data file
|
13
|
+
parsed_info[key].should == correct_info[key]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
TestParser.parsers.each_value do |parser|
|
20
|
+
|
21
|
+
begin
|
22
|
+
data_filename = File.dirname(__FILE__) + "/example_data/" + parser.name.downcase.sub("testparser::","") + ".rb"
|
23
|
+
examples = eval(File.read(data_filename))
|
24
|
+
rescue Exception => err
|
25
|
+
STDERR.puts "Syntax error in #{data_filename}:\n\n"
|
26
|
+
raise err
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
describe parser do
|
31
|
+
|
32
|
+
before :all do
|
33
|
+
examples.each do |example|
|
34
|
+
test_results, correct_info = example
|
35
|
+
example << parser.parse(test_results)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
#if there are any examples at all, they should...
|
40
|
+
if !examples.empty?
|
41
|
+
it "should give accurate failure_counts" do
|
42
|
+
hash_match examples, :failure_count
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
#if any of the examples include info on any of these properties, ensure that the
|
47
|
+
#parser aligns with that property
|
48
|
+
[:success_count, :test_count].each do |property|
|
49
|
+
if have_key? examples, property
|
50
|
+
it "should give accurate #{property}s" do
|
51
|
+
hash_match examples, property
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
#if any of the examples include detailed info on failures...
|
57
|
+
if have_key? examples, :failures
|
58
|
+
|
59
|
+
it "should give details on failures" do
|
60
|
+
examples.each do |test_results, correct_info, parsed_info|
|
61
|
+
|
62
|
+
next if !correct_info[:failures]
|
63
|
+
|
64
|
+
correct_info[:failures].each do |correct_hash|
|
65
|
+
|
66
|
+
#find the relevent failure in the parsed_info by the filename/line number this may not work for some systems...
|
67
|
+
|
68
|
+
parsed_hash = parsed_info[:failures].find {|p_h| p_h[:file] == correct_hash[:file] && p_h[:line] == correct_hash[:line] }
|
69
|
+
|
70
|
+
if !parsed_hash
|
71
|
+
fail "didn't find the error in '#{correct_hash[:file]}' line #{correct_hash[:line]}"
|
72
|
+
else
|
73
|
+
#anything in the correct_info needs to match what was parsed
|
74
|
+
#this enables the parsed data to include more info than we're testing for
|
75
|
+
correct_hash.each do |(key,val)|
|
76
|
+
parsed_hash[key].should == val
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
#the number of detailed failure accounts should match the number of reported failures
|
84
|
+
it "should give the same number of failure details as there were failures" do
|
85
|
+
examples.each do |test_results, correct_info, parsed_info|
|
86
|
+
parsed_info[:failures].length.should == parsed_info[:failure_count]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if have_key? examples, [:test_count,:success_count]
|
92
|
+
it "should give a test_count that's equal to the sum of failure_count and success_count" do
|
93
|
+
examples.each do |_tr,_ci, parsed_info|
|
94
|
+
next if (!parsed_info[:test_count]) || (!parsed_info[:success_count])
|
95
|
+
parsed_info[:test_count].should == parsed_info[:failure_count] + parsed_info[:success_count]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|