xcpretty-bb 0.1.12.bb1
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.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.hound.yml +2 -0
- data/.kick +17 -0
- data/.rubocop.yml +239 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +200 -0
- data/CONTRIBUTING.md +64 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +61 -0
- data/README.md +93 -0
- data/Rakefile +26 -0
- data/assets/report.html.erb +172 -0
- data/bin/xcpretty +85 -0
- data/features/assets/RACCommandSpec, line 80, hello xcpretty.png +0 -0
- data/features/assets/apple_raw.png +0 -0
- data/features/custom_formatter.feature +15 -0
- data/features/fixtures/xcodebuild.log +5963 -0
- data/features/html_report.feature +54 -0
- data/features/json_compilation_database_report.feature +21 -0
- data/features/junit_report.feature +44 -0
- data/features/knock_format.feature +11 -0
- data/features/simple_format.feature +204 -0
- data/features/steps/formatting_steps.rb +330 -0
- data/features/steps/html_steps.rb +32 -0
- data/features/steps/json_steps.rb +37 -0
- data/features/steps/junit_steps.rb +39 -0
- data/features/steps/report_steps.rb +22 -0
- data/features/steps/xcpretty_steps.rb +31 -0
- data/features/support/env.rb +117 -0
- data/features/tap_format.feature +31 -0
- data/features/test_format.feature +49 -0
- data/features/xcpretty.feature +14 -0
- data/lib/xcpretty/ansi.rb +72 -0
- data/lib/xcpretty/formatters/formatter.rb +177 -0
- data/lib/xcpretty/formatters/knock.rb +35 -0
- data/lib/xcpretty/formatters/rspec.rb +33 -0
- data/lib/xcpretty/formatters/simple.rb +200 -0
- data/lib/xcpretty/formatters/tap.rb +40 -0
- data/lib/xcpretty/parser.rb +591 -0
- data/lib/xcpretty/printer.rb +24 -0
- data/lib/xcpretty/reporters/html.rb +98 -0
- data/lib/xcpretty/reporters/json_compilation_database.rb +62 -0
- data/lib/xcpretty/reporters/junit.rb +102 -0
- data/lib/xcpretty/snippet.rb +38 -0
- data/lib/xcpretty/syntax.rb +51 -0
- data/lib/xcpretty/term.rb +14 -0
- data/lib/xcpretty/version.rb +4 -0
- data/lib/xcpretty.rb +37 -0
- data/spec/fixtures/NSStringTests.m +64 -0
- data/spec/fixtures/constants.rb +600 -0
- data/spec/fixtures/custom_formatter.rb +18 -0
- data/spec/fixtures/oneliner.m +1 -0
- data/spec/fixtures/raw_kiwi_compilation_fail.txt +24 -0
- data/spec/fixtures/raw_kiwi_fail.txt +1896 -0
- data/spec/fixtures/raw_specta_fail.txt +3110 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/support/matchers/colors.rb +21 -0
- data/spec/xcpretty/ansi_spec.rb +47 -0
- data/spec/xcpretty/formatters/formatter_spec.rb +140 -0
- data/spec/xcpretty/formatters/rspec_spec.rb +56 -0
- data/spec/xcpretty/formatters/simple_spec.rb +173 -0
- data/spec/xcpretty/parser_spec.rb +542 -0
- data/spec/xcpretty/printer_spec.rb +55 -0
- data/spec/xcpretty/snippet_spec.rb +46 -0
- data/spec/xcpretty/syntax_spec.rb +39 -0
- data/spec/xcpretty/term_spec.rb +26 -0
- data/xcpretty.gemspec +37 -0
- metadata +237 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'xcpretty'
|
|
4
|
+
require 'xcpretty/parser'
|
|
5
|
+
require 'fixtures/constants'
|
|
6
|
+
|
|
7
|
+
module XCPretty
|
|
8
|
+
|
|
9
|
+
describe Parser do
|
|
10
|
+
|
|
11
|
+
before(:each) do
|
|
12
|
+
@formatter = Formatter.new(false, false)
|
|
13
|
+
@parser = Parser.new(@formatter)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "parses analyze" do
|
|
17
|
+
@formatter.should receive(:format_analyze).with("CCChip8DisplayView.m", "CocoaChip/CCChip8DisplayView.m")
|
|
18
|
+
@parser.parse(SAMPLE_ANALYZE)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "parses analyze shallow" do
|
|
22
|
+
@formatter.should receive(:format_analyze).with("CCChip8DisplayView.m", "CocoaChip/CCChip8DisplayView.m")
|
|
23
|
+
@parser.parse(SAMPLE_ANALYZE_SHALLOW)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "parses build target" do
|
|
27
|
+
@formatter.should receive(:format_build_target).with("The Spacer", "Pods", "Debug")
|
|
28
|
+
@parser.parse(SAMPLE_BUILD)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "parses analyze target" do
|
|
32
|
+
@formatter.should receive(:format_analyze_target).with("The Spacer", "Pods", "Debug")
|
|
33
|
+
@parser.parse(SAMPLE_ANALYZE_TARGET)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "parses clean remove" do
|
|
37
|
+
@formatter.should receive(:format_clean_remove)
|
|
38
|
+
@parser.parse(SAMPLE_CLEAN_REMOVE)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "parses clean target" do
|
|
42
|
+
@formatter.should receive(:format_clean_target).with("Pods-ObjectiveSugar", "Pods", "Debug")
|
|
43
|
+
@parser.parse(SAMPLE_CLEAN)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "parses clean target withut dash in target name" do
|
|
47
|
+
@formatter.should receive(:format_clean_target).with("Pods", "Pods", "Debug")
|
|
48
|
+
@parser.parse(SAMPLE_ANOTHER_CLEAN)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "parses check dependencies" do
|
|
52
|
+
@formatter.should receive(:format_check_dependencies)
|
|
53
|
+
@parser.parse("Check dependencies")
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "parses code signing" do
|
|
57
|
+
@formatter.should receive(:format_codesign).with("build/Release/CocoaChip.app")
|
|
58
|
+
@parser.parse(SAMPLE_CODESIGN)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "parses code signing a framework" do
|
|
62
|
+
@formatter.should receive(:format_codesign).with("build/Release/CocoaChipCore.framework")
|
|
63
|
+
@parser.parse(SAMPLE_CODESIGN_FRAMEWORK)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'parses compiler_space_in_path' do
|
|
67
|
+
@formatter.should receive(:format_compile).with('SASellableItem.m', "SACore/App/Models/Core\\ Data/human/SASellableItem.m")
|
|
68
|
+
@parser.parse(SAMPLE_COMPILE_SPACE_IN_PATH)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "parses compiler commands" do
|
|
72
|
+
compile_statement = SAMPLE_ANOTHER_COMPILE.lines.to_a.last
|
|
73
|
+
@formatter.should receive(:format_compile_command).with(compile_statement.strip, "/Users/musalj/code/OSS/Kiwi/Classes/Core/KWNull.m")
|
|
74
|
+
@parser.parse(compile_statement)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "parses compiling categories" do
|
|
78
|
+
@formatter.should receive(:format_compile).with("NSMutableArray+ObjectiveSugar.m", "/Users/musalj/code/OSS/ObjectiveSugar/Classes/NSMutableArray+ObjectiveSugar.m")
|
|
79
|
+
@parser.parse(SAMPLE_COMPILE)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "parses compiling classes" do
|
|
83
|
+
@formatter.should receive(:format_compile).with("KWNull.m", "Classes/Core/KWNull.m")
|
|
84
|
+
@parser.parse(SAMPLE_ANOTHER_COMPILE)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "parses compiling Objective-C++ classes" do
|
|
88
|
+
@formatter.should receive(:format_compile).with("KWNull.mm", "Classes/Core/KWNull.mm")
|
|
89
|
+
@parser.parse(SAMPLE_ANOTHER_COMPILE.sub('.m', '.mm'))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'parses compiling Swift source files' do
|
|
93
|
+
@formatter.should receive(:format_compile).with("Resource.swift", "/Users/paul/foo/bar/siesta/Source/Resource.swift")
|
|
94
|
+
@parser.parse(SAMPLE_SWIFT_COMPILE)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "parses compiling C and C++ files" do
|
|
98
|
+
['.c', '.cc', '.cpp', '.cxx'].each do |file_extension|
|
|
99
|
+
@formatter.should receive(:format_compile).with("KWNull" + file_extension, "Classes/Core/KWNull" + file_extension)
|
|
100
|
+
@parser.parse(SAMPLE_ANOTHER_COMPILE.sub('.m', file_extension))
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "parses compiling XIBs" do
|
|
105
|
+
@formatter.should receive(:format_compile_xib).with("MainMenu.xib", "CocoaChip/en.lproj/MainMenu.xib")
|
|
106
|
+
@parser.parse(SAMPLE_COMPILE_XIB)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "parses compiling storyboards" do
|
|
110
|
+
@formatter.should receive(:format_compile_storyboard).with("Main.storyboard", "sample/Main.storyboard")
|
|
111
|
+
@parser.parse(SAMPLE_COMPILE_STORYBOARD)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'parses CopyPlistFile' do
|
|
115
|
+
@formatter.should receive(:format_copy_plist_file).with(
|
|
116
|
+
'/path/to/Some.plist', '/some other/File.plist')
|
|
117
|
+
@parser.parse('CopyPlistFile /path/to/Some.plist /some other/File.plist')
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "parses CopyStringsFile" do
|
|
121
|
+
@formatter.should receive(:format_copy_strings_file).with('InfoPlist.strings')
|
|
122
|
+
@parser.parse(SAMPLE_COPYSTRINGS)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "parses CpHeader" do
|
|
126
|
+
@formatter.should receive(:format_copy_header_file).with(
|
|
127
|
+
'/path/to/Header.h', '/some other/path/Header.h')
|
|
128
|
+
@parser.parse('CpHeader /path/to/Header.h /some other/path/Header.h')
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "parses CpResource" do
|
|
132
|
+
@formatter.should receive(:format_cpresource).with('ObjectiveSugar/Default-568h@2x.png')
|
|
133
|
+
@parser.parse(SAMPLE_CPRESOURCE)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it "parses GenerateDSYMFile" do
|
|
137
|
+
@formatter.should receive(:format_generate_dsym).with('ObjectiveSugarTests.octest.dSYM')
|
|
138
|
+
@parser.parse(SAMPLE_DSYM)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "parses info.plist processing" do
|
|
142
|
+
@formatter.should receive(:format_process_info_plist).with('The Spacer-Info.plist', 'The Spacer/The Spacer-Info.plist')
|
|
143
|
+
@parser.parse(SAMPLE_PROCESS_INFOPLIST)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "parses Ld" do
|
|
147
|
+
@formatter.should receive(:format_linking).with('ObjectiveSugar', 'normal', 'i386')
|
|
148
|
+
@parser.parse(SAMPLE_LD)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it "parses Libtool" do
|
|
152
|
+
@formatter.should receive(:format_libtool).with('libPods-ObjectiveSugarTests-Kiwi.a')
|
|
153
|
+
@parser.parse(SAMPLE_LIBTOOL)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "parses specta failing tests" do
|
|
157
|
+
@formatter.should receive(:format_failing_test).with("SKWelcomeViewControllerSpecSpec",
|
|
158
|
+
"SKWelcomeViewController_When_a_user_opens_the_app_from_a_clean_installation_displays_the_welcome_screen",
|
|
159
|
+
"The step timed out after 2.00 seconds: Failed to find accessibility element with the label \"The asimplest way to make smarter business decisions\"",
|
|
160
|
+
"/Users/vickeryj/Code/ipad-register/KIFTests/Specs/SKWelcomeViewControllerSpec.m:11")
|
|
161
|
+
@parser.parse(SAMPLE_SPECTA_FAILURE)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "parses old specta failing tests" do
|
|
165
|
+
@formatter.should receive(:format_failing_test).with("RACCommandSpec",
|
|
166
|
+
"enabled_signal_should_send_YES_while_executing_is_YES_and_allowsConcurrentExecution_is_YES",
|
|
167
|
+
"expected: 1, got: 0",
|
|
168
|
+
"/Users/musalj/code/OSS/ReactiveCocoa/ReactiveCocoaFramework/ReactiveCocoaTests/RACCommandSpec.m:458")
|
|
169
|
+
@parser.parse(SAMPLE_OLD_SPECTA_FAILURE)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it "parses ld bitcode errors" do
|
|
173
|
+
@formatter.should receive(:format_error).with(SAMPLE_BITCODE_LD.strip)
|
|
174
|
+
@parser.parse(SAMPLE_BITCODE_LD)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "parses passing ocunit tests" do
|
|
178
|
+
@formatter.should receive(:format_passing_test).with('RACCommandSpec',
|
|
179
|
+
'enabled_signal_should_send_YES_while_executing_is_YES_and_allowsConcurrentExecution_is_YES',
|
|
180
|
+
'0.001')
|
|
181
|
+
@parser.parse(SAMPLE_OCUNIT_TEST)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
it "parses passing specta tests" do
|
|
185
|
+
@formatter.should receive(:format_passing_test).with('SKWelcomeActivationViewControllerSpecSpec',
|
|
186
|
+
'SKWelcomeActivationViewController_When_a_user_enters_their_details_lets_them_enter_a_valid_manager_code',
|
|
187
|
+
'0.725')
|
|
188
|
+
@parser.parse(SAMPLE_SPECTA_TEST)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "parses pending tests" do
|
|
192
|
+
@formatter.should receive(:format_pending_test).with('TAPIConversationSpec',
|
|
193
|
+
'TAPIConversation_createConversation_SendsAPOSTRequestToTheConversationsEndpoint')
|
|
194
|
+
@parser.parse(SAMPLE_PENDING_KIWI_TEST)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it 'parses measuring tests' do
|
|
198
|
+
@formatter.should receive(:format_measuring_test).with(
|
|
199
|
+
'SecEncodeTransformTests.SecEncodeTransformTests',
|
|
200
|
+
'test_RFC4648_Decode_UsingBase32',
|
|
201
|
+
'0.013'
|
|
202
|
+
)
|
|
203
|
+
@parser.parse(SAMPLE_MEASURING_TEST)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "parses build success indicator" do
|
|
207
|
+
@formatter.should receive(:format_phase_success).with('BUILD')
|
|
208
|
+
@parser.parse(SAMPLE_BUILD_SUCCEEDED)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it "parses clean success indicator" do
|
|
212
|
+
@formatter.should receive(:format_phase_success).with('CLEAN')
|
|
213
|
+
@parser.parse(SAMPLE_CLEAN_SUCCEEDED)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
it "parses PhaseScriptExecution" do
|
|
217
|
+
@formatter.should receive(:format_phase_script_execution).with('Check Pods Manifest.lock')
|
|
218
|
+
@parser.parse(SAMPLE_RUN_SCRIPT)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
it "parses process PCH" do
|
|
222
|
+
@formatter.should receive(:format_process_pch).with("Pods-CocoaLumberjack-prefix.pch")
|
|
223
|
+
@parser.parse(SAMPLE_PRECOMPILE)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it 'parses process PCH command' do
|
|
227
|
+
compile_statement = SAMPLE_PRECOMPILE.lines.to_a.last
|
|
228
|
+
@formatter.should receive(:format_process_pch_command).with("/Users/musalj/code/OSS/ObjectiveRecord/Pods/Pods-CocoaLumberjack-prefix.pch")
|
|
229
|
+
@parser.parse(compile_statement)
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "parses preprocessing" do
|
|
233
|
+
@formatter.should receive(:format_preprocess).with("CocoaChip/CocoaChip-Info.plist")
|
|
234
|
+
@parser.parse(SAMPLE_PREPROCESS)
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it "parses PBXCp" do
|
|
238
|
+
@formatter.should receive(:format_pbxcp).with("build/Release/CocoaChipCore.framework")
|
|
239
|
+
@parser.parse(SAMPLE_PBXCP)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
it 'parses changing directories' do
|
|
243
|
+
@formatter.should receive(:format_shell_command).with('cd',
|
|
244
|
+
'/some/place/out\ there')
|
|
245
|
+
@parser.parse(' cd /some/place/out\ there')
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it 'parses any indented command' do
|
|
249
|
+
@formatter.should receive(:format_shell_command).with(
|
|
250
|
+
'/bin/rm', '-rf /bin /usr /Users')
|
|
251
|
+
@parser.parse(' /bin/rm -rf /bin /usr /Users')
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "parses Touch" do
|
|
255
|
+
@formatter.should receive(:format_touch).with(
|
|
256
|
+
'/Users/musalj/Library/Developer/Xcode/DerivedData/Alcatraz-aobuxcinaqyzjugrnxjjhfzgwaou/Build/Products/Debug/Alcatraz Tests.octest',
|
|
257
|
+
'Alcatraz Tests.octest')
|
|
258
|
+
@parser.parse(SAMPLE_TOUCH)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
it "parses write file" do
|
|
262
|
+
@formatter.should receive(:format_write_file).with(
|
|
263
|
+
'/Users/me/myproject/Build/Intermediates/Pods.build/Debug-iphonesimulator/Pods-AFNetworking.build/Objects-normal/x86_64/Pods-AFNetworking.LinkFileList')
|
|
264
|
+
@parser.parse(SAMPLE_WRITE_FILE)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it "parses write auxiliary files" do
|
|
268
|
+
@formatter.should receive(:format_write_auxiliary_files)
|
|
269
|
+
@parser.parse(SAMPLE_WRITE_AUXILIARY_FILES)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
it "parses TiffUtil" do
|
|
273
|
+
@formatter.should receive(:format_tiffutil).with('eye_icon.tiff')
|
|
274
|
+
@parser.parse(SAMPLE_TIFFUTIL)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
it "parses undefined symbols" do
|
|
278
|
+
@formatter.should receive(:format_undefined_symbols).with("Undefined symbols for architecture x86_64",
|
|
279
|
+
'_OBJC_CLASS_$_CABasicAnimation',
|
|
280
|
+
'objc-class-ref in ATZRadialProgressControl.o')
|
|
281
|
+
SAMPLE_UNDEFINED_SYMBOLS.each_line do |line|
|
|
282
|
+
@parser.parse(line)
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
it "parses duplicate symbols" do
|
|
287
|
+
@formatter.should receive(:format_duplicate_symbols).with(
|
|
288
|
+
"duplicate symbol _OBJC_IVAR_$ClassName._ivarName in",
|
|
289
|
+
[
|
|
290
|
+
'/Users/username/Library/Developer/Xcode/DerivedData/App-arcyyktezaigixbocjwfhsjllojz/Build/Intermediates/App.build/Debug-iphonesimulator/App.build/Objects-normal/i386/ClassName.o',
|
|
291
|
+
'/Users/username/Library/Developer/Xcode/DerivedData/App-arcyyktezaigixbocjwfhsjllojz/Build/Products/Debug-iphonesimulator/libPods.a(DuplicateClassName.o)'
|
|
292
|
+
]
|
|
293
|
+
)
|
|
294
|
+
SAMPLE_DUPLICATE_SYMBOLS.each_line do |line|
|
|
295
|
+
@parser.parse(line)
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
it "parses ocunit test run finished" do
|
|
300
|
+
@formatter.should receive(:format_test_run_finished).with('ReactiveCocoaTests.octest(Tests)', '2013-12-10 07:03:03 +0000.')
|
|
301
|
+
@parser.parse(SAMPLE_OCUNIT_TEST_RUN_COMPLETION)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it "parses ocunit test run passed" do
|
|
305
|
+
@formatter.should receive(:format_test_run_finished).with('Hazelnuts.xctest', '2014-09-24 23:09:20 +0000.')
|
|
306
|
+
@parser.parse(SAMPLE_OCUNIT_PASSED_TEST_RUN_COMPLETION)
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
it "parses ocunit test run failed" do
|
|
310
|
+
@formatter.should receive(:format_test_run_finished).with('Macadamia.octest', '2014-09-24 23:09:20 +0000.')
|
|
311
|
+
@parser.parse(SAMPLE_OCUNIT_FAILED_TEST_RUN_COMPLETION)
|
|
312
|
+
end
|
|
313
|
+
|
|
314
|
+
it "parses specta test run finished" do
|
|
315
|
+
@formatter.should receive(:format_test_run_finished).with('KIFTests.xctest', '2014-02-28 15:44:32 +0000.')
|
|
316
|
+
@parser.parse(SAMPLE_SPECTA_TEST_RUN_COMPLETION)
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
it "parses ocunit test run started" do
|
|
320
|
+
@formatter.should receive(:format_test_run_started).with('ReactiveCocoaTests.octest(Tests)')
|
|
321
|
+
@parser.parse(SAMPLE_OCUNIT_TEST_RUN_BEGINNING)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
it "parses specta test run started" do
|
|
325
|
+
@formatter.should receive(:format_test_run_started).with('KIFTests.xctest')
|
|
326
|
+
@parser.parse(SAMPLE_SPECTA_TEST_RUN_BEGINNING)
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
it "parses ocunit test suite started" do
|
|
330
|
+
@formatter.should receive(:format_test_suite_started).with('RACKVOWrapperSpec')
|
|
331
|
+
@parser.parse(SAMPLE_OCUNIT_SUITE_BEGINNING)
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
it "parses specta test suite started" do
|
|
335
|
+
@formatter.should receive(:format_test_suite_started).with('All tests')
|
|
336
|
+
@parser.parse(SAMPLE_SPECTA_SUITE_BEGINNING)
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
context "errors" do
|
|
340
|
+
it "parses clang errors" do
|
|
341
|
+
@formatter.should receive(:format_error).with(SAMPLE_CLANG_ERROR)
|
|
342
|
+
@parser.parse(SAMPLE_CLANG_ERROR)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
it "parses cocoapods errors" do
|
|
346
|
+
@formatter.should receive(:format_error).with("error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.")
|
|
347
|
+
@parser.parse(SAMPLE_PODS_ERROR)
|
|
348
|
+
end
|
|
349
|
+
|
|
350
|
+
it "parses compiling errors" do
|
|
351
|
+
@formatter.should receive(:format_compile_error).with(
|
|
352
|
+
"SampleTest.m",
|
|
353
|
+
"/Users/musalj/code/OSS/SampleApp/SampleTest.m:12:59",
|
|
354
|
+
"expected identifier",
|
|
355
|
+
" [[thread.lastMessage should] equal:thread.];",
|
|
356
|
+
" ^")
|
|
357
|
+
SAMPLE_COMPILE_ERROR.each_line do |line|
|
|
358
|
+
@parser.parse(line)
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
it 'parses fatal compiling errors' do
|
|
363
|
+
@formatter.should receive(:format_compile_error).with(
|
|
364
|
+
'SomeRandomClass.h',
|
|
365
|
+
'/Users/musalj/code/OSS/SampleApp/Pods/Headers/LessCoolPod/SomeRandomClass.h:31:9',
|
|
366
|
+
"'SomeRandomHeader.h' file not found",
|
|
367
|
+
'#import "SomeRandomHeader.h"',
|
|
368
|
+
' ^'
|
|
369
|
+
# For now, it's probably not worth to provide the import stack
|
|
370
|
+
# It'd require more state, and not sure if it'd be any useful
|
|
371
|
+
# %Q(In file included from /Users/musalj/code/OSS/SampleApp/Pods/SuperCoolPod/SuperAwesomeClass.m:12:
|
|
372
|
+
# In file included from /Users/musalj/code/OSS/SampleApp/Pods/../LessCoolPod/LessCoolClass.h:9:
|
|
373
|
+
# In file included from /Users/musalj/code/OSS/SampleApp/Pods/../LessCoolPod/EvenLessCoolClass.h:10:)
|
|
374
|
+
)
|
|
375
|
+
SAMPLE_FATAL_COMPILE_ERROR.each_line do |line|
|
|
376
|
+
@parser.parse(line)
|
|
377
|
+
end
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
it 'parses file missing errors' do
|
|
381
|
+
@formatter.should receive(:format_file_missing_error).with(
|
|
382
|
+
'error: no such file or directory:',
|
|
383
|
+
'/Users/travis/build/supermarin/project/Classes/Class + Category/Two Words/MissingViewController.swift'
|
|
384
|
+
)
|
|
385
|
+
@parser.parse(SAMPLE_FILE_MISSING_ERROR)
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
it 'parses fatal error: on the beginning of the line for corrupted AST files' do
|
|
389
|
+
@formatter.should receive(:format_error).with(
|
|
390
|
+
"fatal error: malformed or corrupted AST file: 'could not find file '/Users/mpv/dev/project/Crashlytics.framework/Headers/Crashlytics.h' referenced by AST file' note: after modifying system headers, please delete the module cache at '/Users/mpv/Library/Developer/Xcode/DerivedData/ModuleCache/M5WJ0FYE7N06'"
|
|
391
|
+
)
|
|
392
|
+
@parser.parse(SAMPLE_FATAL_HEADER_ERROR)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
it 'parses fatal error: on the beginning of the line for cached PCH' do
|
|
396
|
+
@formatter.should receive(:format_error).with(
|
|
397
|
+
"fatal error: file '/path/to/myproject/Pods/Pods-environment.h' has been modified since the precompiled header '/Users/hiroshi/Library/Developer/Xcode/DerivedData/MyProject-gfmuvpipjscewkdnqacgumhfarrd/Build/Intermediates/PrecompiledHeaders/MyProject-Prefix-dwjpvcnrlaydzmegejmcvrtcfkpf/MyProject-Prefix.pch.pch' was built"
|
|
398
|
+
)
|
|
399
|
+
@parser.parse(SAMPLE_FATAL_COMPILE_PCH_ERROR)
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
it "parses compiling errors with tildes" do
|
|
405
|
+
@formatter.should receive(:format_compile_error).with(
|
|
406
|
+
'NSSetTests.m',
|
|
407
|
+
'/Users/musalj/code/OSS/ObjectiveSugar/Example/ObjectiveSugarTests/NSSetTests.m:93:16',
|
|
408
|
+
"no visible @interface for 'NSArray' declares the selector 'shoulds'",
|
|
409
|
+
' }] shoulds] equal:@[ @"F458 Italia", @"Testarossa" ]];',
|
|
410
|
+
' ~~ ^~~~~~~')
|
|
411
|
+
SAMPLE_COMPILE_ERROR_WITH_TILDES.each_line do |line|
|
|
412
|
+
@parser.parse(line)
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
it "parses code sign error:" do
|
|
417
|
+
@formatter.should receive(:format_error).with(
|
|
418
|
+
'Code Sign error: No code signing identites found: No valid signing identities (i.e. certificate and private key pair) matching the team ID “CAT6HF57NJ” were found.'
|
|
419
|
+
)
|
|
420
|
+
@parser.parse(SAMPLE_CODESIGN_ERROR)
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
it "parses CodeSign error: (no spaces)" do
|
|
424
|
+
@formatter.should receive(:format_error).with(
|
|
425
|
+
"CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.0'"
|
|
426
|
+
)
|
|
427
|
+
@parser.parse(SAMPLE_CODESIGN_ERROR_NO_SPACES)
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
it "parses ld library errors" do
|
|
431
|
+
@formatter.should receive(:format_error).with(
|
|
432
|
+
SAMPLE_LD_LIBRARY_ERROR
|
|
433
|
+
)
|
|
434
|
+
@parser.parse(SAMPLE_LD_LIBRARY_ERROR)
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
it 'parses ld symbols errors' do
|
|
438
|
+
@formatter.should receive(:format_error).with(
|
|
439
|
+
SAMPLE_LD_SYMBOLS_ERROR
|
|
440
|
+
)
|
|
441
|
+
@parser.parse(SAMPLE_LD_SYMBOLS_ERROR)
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
it "doesn't print the same error over and over" do
|
|
445
|
+
SAMPLE_COMPILE_ERROR.each_line do |line|
|
|
446
|
+
@parser.parse(line)
|
|
447
|
+
end
|
|
448
|
+
@formatter.should_not receive(:format_compile_error)
|
|
449
|
+
@parser.parse("hohohoooo")
|
|
450
|
+
end
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
context "warnings" do
|
|
454
|
+
it 'parses compiler warnings' do
|
|
455
|
+
@formatter.should receive(:format_warning).with("TEST 123")
|
|
456
|
+
@parser.parse("warning: TEST 123")
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
it "parses compiling warnings" do
|
|
460
|
+
@formatter.should receive(:format_compile_warning).with(
|
|
461
|
+
"AppDelegate.m",
|
|
462
|
+
"/Users/supermarin/code/oss/ObjectiveSugar/Example/ObjectiveSugar/AppDelegate.m:19:31",
|
|
463
|
+
"format specifies type 'id' but the argument has type 'int' [-Wformat]",
|
|
464
|
+
" NSLog(@\"I HAZ %@ CATS\", 1);",
|
|
465
|
+
" ~~ ^")
|
|
466
|
+
SAMPLE_FORMAT_WARNING.each_line do |line|
|
|
467
|
+
@parser.parse(line)
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
it "parses ld warnings" do
|
|
472
|
+
@formatter.should receive(:format_ld_warning).with("ld: embedded dylibs/frameworks only run on iOS 8 or later")
|
|
473
|
+
@parser.parse("ld: warning: embedded dylibs/frameworks only run on iOS 8 or later")
|
|
474
|
+
end
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
context "summary" do
|
|
478
|
+
def given_tests_have_started(reporter = SAMPLE_OCUNIT_TEST_RUN_BEGINNING)
|
|
479
|
+
@parser.parse(reporter)
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
def given_tests_are_done(reporter = SAMPLE_OCUNIT_TEST_RUN_COMPLETION)
|
|
483
|
+
@parser.parse(reporter)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
def given_kiwi_tests_are_done
|
|
487
|
+
@parser.parse(SAMPLE_KIWI_TEST_RUN_COMPLETION)
|
|
488
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
|
489
|
+
@parser.parse(SAMPLE_KIWI_SUITE_COMPLETION)
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
it "returns empty string if the suite is not done" do
|
|
493
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS).should == ""
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
it "knows when the test suite is done for OCunit" do
|
|
497
|
+
given_tests_are_done
|
|
498
|
+
@formatter.should receive(:format_test_summary)
|
|
499
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
it "knows when the test suite is done for Specta" do
|
|
503
|
+
given_tests_are_done
|
|
504
|
+
@formatter.should receive(:format_test_summary)
|
|
505
|
+
@parser.parse(SAMPLE_SPECTA_EXECUTED_TESTS)
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
it "doesn't print executed message twice for Kiwi tests" do
|
|
509
|
+
@formatter.should_receive(:format_test_summary).once
|
|
510
|
+
given_tests_have_started(SAMPLE_KIWI_TEST_RUN_BEGINNING)
|
|
511
|
+
given_kiwi_tests_are_done
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
it "knows when the test suite is done for XCtest" do
|
|
515
|
+
@formatter.should_receive(:format_test_summary).once
|
|
516
|
+
2.times {
|
|
517
|
+
given_tests_are_done(SAMPLE_KIWI_TEST_RUN_COMPLETION)
|
|
518
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
|
519
|
+
}
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
it "prints OCunit / XCTest summary twice if tests executed twice" do
|
|
523
|
+
@formatter.should_receive(:format_test_summary).twice
|
|
524
|
+
2.times {
|
|
525
|
+
given_tests_have_started
|
|
526
|
+
given_tests_are_done
|
|
527
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
|
528
|
+
}
|
|
529
|
+
end
|
|
530
|
+
|
|
531
|
+
it "prints Kiwi summary twice if tests executed twice" do
|
|
532
|
+
@formatter.should_receive(:format_test_summary).twice
|
|
533
|
+
2.times {
|
|
534
|
+
given_tests_have_started(SAMPLE_KIWI_TEST_RUN_BEGINNING)
|
|
535
|
+
given_kiwi_tests_are_done
|
|
536
|
+
}
|
|
537
|
+
end
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
end
|
|
541
|
+
end
|
|
542
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require "xcpretty/printer"
|
|
2
|
+
require 'xcpretty/formatters/formatter'
|
|
3
|
+
require 'xcpretty/formatters/simple'
|
|
4
|
+
|
|
5
|
+
module XCPretty
|
|
6
|
+
describe Printer do
|
|
7
|
+
|
|
8
|
+
before(:each) do
|
|
9
|
+
STDOUT.stub(:print) { |text| text }
|
|
10
|
+
@printer = Printer.new(colorize: true, unicode: true, formatter: DummyFormatter)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "prints to stdout" do
|
|
14
|
+
STDOUT.should receive(:print).with("hey ho let's go\n")
|
|
15
|
+
@printer.pretty_print("hey ho let's go")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "doesn't print empty lines" do
|
|
19
|
+
STDOUT.should_not receive(:print)
|
|
20
|
+
@printer.pretty_print("")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "prints with newlines only when needed" do
|
|
24
|
+
@printer.formatter.stub(:optional_newline).and_return("")
|
|
25
|
+
|
|
26
|
+
STDOUT.should receive(:print).with("hey ho let's go")
|
|
27
|
+
@printer.pretty_print("hey ho let's go")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "makes a formatter with unicode and colorized flags" do
|
|
31
|
+
@printer.formatter.colorize?.should == true
|
|
32
|
+
@printer.formatter.use_unicode?.should == true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
module XCPretty
|
|
39
|
+
class DummyFormatter < Formatter
|
|
40
|
+
|
|
41
|
+
def initialize(unicode, colorize)
|
|
42
|
+
@use_unicode = unicode
|
|
43
|
+
@colorize = colorize
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def pretty_format(text)
|
|
47
|
+
text
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def optional_newline
|
|
51
|
+
"\n"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require 'xcpretty/snippet'
|
|
2
|
+
|
|
3
|
+
module XCPretty
|
|
4
|
+
|
|
5
|
+
describe Snippet do
|
|
6
|
+
|
|
7
|
+
it "gets the snippet out of the file path" do
|
|
8
|
+
path = File.expand_path('spec/fixtures/NSStringTests.m:36')
|
|
9
|
+
Snippet.from_filepath(path).contents.should ==
|
|
10
|
+
<<-EOS
|
|
11
|
+
it(@"-split: splits with delimiter string, not just a char", ^{
|
|
12
|
+
[[[@"one / two / three" split:@" / "] should] equal:@[@"one", @"two", @"three"]];
|
|
13
|
+
});
|
|
14
|
+
EOS
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'saves the file path' do
|
|
18
|
+
path = File.expand_path('spec/fixtures/NSStringTests.m:36')
|
|
19
|
+
Snippet.from_filepath(path).file_path.should == path
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "doesn't crash when there's nothing to read" do
|
|
23
|
+
path = File.expand_path('spec/fixtures/NSStringTests.m:64')
|
|
24
|
+
Snippet.from_filepath(path).contents.should == "\nSPEC_END\n"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "doesn't crash if file path is invalid" do
|
|
28
|
+
path = 'invalid-path'
|
|
29
|
+
Snippet.from_filepath(path).contents.should == ''
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "doesn't crash if a failure is on the first line" do
|
|
33
|
+
path = File.expand_path('spec/fixtures/NSStringTests.m:0')
|
|
34
|
+
Snippet.from_filepath(path).contents.should ==
|
|
35
|
+
"//\n// NSStringTests.m\n// SampleProject\n"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "doesn't crash if the file has only 1 line" do
|
|
39
|
+
path = File.expand_path('spec/fixtures/oneliner.m:0')
|
|
40
|
+
Snippet.from_filepath(path).contents.should ==
|
|
41
|
+
"[[[@1 should] equal] @3];\n"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'xcpretty/syntax'
|
|
2
|
+
|
|
3
|
+
module XCPretty
|
|
4
|
+
describe Syntax do
|
|
5
|
+
it 'syntax highlights given code' do
|
|
6
|
+
code = 'self.color = [UIColor redColor];'
|
|
7
|
+
snippet = Snippet.new(code, 'test.m')
|
|
8
|
+
output = Syntax.highlight(snippet)
|
|
9
|
+
|
|
10
|
+
stripped_output = output.gsub(/(?:(?:\u001b\[)|\u009b)(?:(?:[0-9]{1,3})?(?:;[0-9]{0,3})*?[A-M|f-m])|\u001b[A-M]/, '')
|
|
11
|
+
stripped_output.should == code
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'uses Objective-C lexer for Objective-C' do
|
|
15
|
+
Syntax.find_lexer('test.m', '').should == Rouge::Lexers::ObjectiveC
|
|
16
|
+
Syntax.find_lexer('test.h', '').should == Rouge::Lexers::ObjectiveC
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'uses Swift lexer for Swift' do
|
|
20
|
+
Syntax.find_lexer('test.swift', '').should == Rouge::Lexers::Swift
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'uses Ruby lexer for Ruby' do
|
|
24
|
+
Syntax.find_lexer('test.rb', '').should == Rouge::Lexers::Ruby
|
|
25
|
+
Syntax.find_lexer('test.ruby', '').should == Rouge::Lexers::Ruby
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'uses C++ lexer for C++' do
|
|
29
|
+
Syntax.find_lexer('test.cpp', '').should == Rouge::Lexers::Cpp
|
|
30
|
+
Syntax.find_lexer('test.cc', '').should == Rouge::Lexers::Cpp
|
|
31
|
+
Syntax.find_lexer('test.c++', '').should == Rouge::Lexers::Cpp
|
|
32
|
+
Syntax.find_lexer('test.cxx', '').should == Rouge::Lexers::Cpp
|
|
33
|
+
Syntax.find_lexer('test.hpp', '').should == Rouge::Lexers::Cpp
|
|
34
|
+
Syntax.find_lexer('test.h++', '').should == Rouge::Lexers::Cpp
|
|
35
|
+
Syntax.find_lexer('test.hxx', '').should == Rouge::Lexers::Cpp
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|