xcpretty-security-patched 0.3.0
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 +12 -0
- data/CHANGELOG.md +269 -0
- data/CONTRIBUTING.md +64 -0
- data/Gemfile +9 -0
- data/LICENSE.txt +61 -0
- data/README.md +95 -0
- data/Rakefile +18 -0
- data/assets/report.html.erb +173 -0
- data/bin/xcpretty +90 -0
- data/features/assets/RACCommandSpec_enabled_signal_should_send_YES_while_executing_is_YES.png +0 -0
- data/features/assets/apple_raw.png +0 -0
- data/features/custom_formatter.feature +15 -0
- data/features/custom_reporter.feature +29 -0
- data/features/fixtures/xcodebuild.log +5963 -0
- data/features/html_report.feature +54 -0
- data/features/json_compilation_database_report.feature +33 -0
- data/features/junit_report.feature +49 -0
- data/features/knock_format.feature +11 -0
- data/features/simple_format.feature +238 -0
- data/features/steps/custom_reporter_steps.rb +16 -0
- data/features/steps/formatting_steps.rb +386 -0
- data/features/steps/html_steps.rb +32 -0
- data/features/steps/json_steps.rb +45 -0
- data/features/steps/junit_steps.rb +39 -0
- data/features/steps/report_steps.rb +27 -0
- data/features/steps/xcpretty_steps.rb +31 -0
- data/features/support/env.rb +123 -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 +200 -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 +596 -0
- data/lib/xcpretty/printer.rb +28 -0
- data/lib/xcpretty/reporters/html.rb +93 -0
- data/lib/xcpretty/reporters/json_compilation_database.rb +51 -0
- data/lib/xcpretty/reporters/junit.rb +102 -0
- data/lib/xcpretty/reporters/reporter.rb +62 -0
- data/lib/xcpretty/snippet.rb +38 -0
- data/lib/xcpretty/syntax.rb +58 -0
- data/lib/xcpretty/term.rb +14 -0
- data/lib/xcpretty/version.rb +4 -0
- data/lib/xcpretty.rb +38 -0
- data/spec/fixtures/NSStringTests.m +64 -0
- data/spec/fixtures/constants.rb +707 -0
- data/spec/fixtures/custom_formatter.rb +18 -0
- data/spec/fixtures/custom_reporter.rb +30 -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 +151 -0
- data/spec/xcpretty/formatters/rspec_spec.rb +56 -0
- data/spec/xcpretty/formatters/simple_spec.rb +178 -0
- data/spec/xcpretty/parser_spec.rb +636 -0
- data/spec/xcpretty/printer_spec.rb +55 -0
- data/spec/xcpretty/reporters/junit_spec.rb +20 -0
- data/spec/xcpretty/reporters/reporter_spec.rb +40 -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 +250 -0
@@ -0,0 +1,636 @@
|
|
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 analyze for a C++ target" do
|
27
|
+
@formatter.should receive(:format_analyze).with("CCChip8DisplayView.cpp", "CocoaChip/CCChip8DisplayView.cpp")
|
28
|
+
@parser.parse(SAMPLE_ANALYZE_CPP)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "parses build target" do
|
32
|
+
@formatter.should receive(:format_build_target).with("The Spacer", "Pods", "Debug")
|
33
|
+
@parser.parse(SAMPLE_BUILD)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "parses aggregate target" do
|
37
|
+
@formatter.should receive(:format_aggregate_target).with("Be Aggro", "AggregateExample", "Debug")
|
38
|
+
@parser.parse(SAMPLE_AGGREGATE_TARGET)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "parses analyze target" do
|
42
|
+
@formatter.should receive(:format_analyze_target).with("The Spacer", "Pods", "Debug")
|
43
|
+
@parser.parse(SAMPLE_ANALYZE_TARGET)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "parses clean remove" do
|
47
|
+
@formatter.should receive(:format_clean_remove)
|
48
|
+
@parser.parse(SAMPLE_CLEAN_REMOVE)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "parses clean target" do
|
52
|
+
@formatter.should receive(:format_clean_target).with("Pods-ObjectiveSugar", "Pods", "Debug")
|
53
|
+
@parser.parse(SAMPLE_CLEAN)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "parses clean target withut dash in target name" do
|
57
|
+
@formatter.should receive(:format_clean_target).with("Pods", "Pods", "Debug")
|
58
|
+
@parser.parse(SAMPLE_ANOTHER_CLEAN)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "parses check dependencies" do
|
62
|
+
@formatter.should receive(:format_check_dependencies)
|
63
|
+
@parser.parse("Check dependencies")
|
64
|
+
end
|
65
|
+
|
66
|
+
it "parses code signing" do
|
67
|
+
@formatter.should receive(:format_codesign).with("build/Release/CocoaChip.app")
|
68
|
+
@parser.parse(SAMPLE_CODESIGN)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "parses code signing a framework" do
|
72
|
+
@formatter.should receive(:format_codesign).with("build/Release/CocoaChipCore.framework")
|
73
|
+
@parser.parse(SAMPLE_CODESIGN_FRAMEWORK)
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'parses compiler_space_in_path' do
|
77
|
+
@formatter.should receive(:format_compile).with('SASellableItem.m', "SACore/App/Models/Core\\ Data/human/SASellableItem.m")
|
78
|
+
@parser.parse(SAMPLE_COMPILE_SPACE_IN_PATH)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "parses compiler commands" do
|
82
|
+
compile_statement = SAMPLE_ANOTHER_COMPILE.lines.to_a.last
|
83
|
+
@formatter.should receive(:format_compile_command).with(compile_statement.strip, "/Users/musalj/code/OSS/Kiwi/Classes/Core/KWNull.m")
|
84
|
+
@parser.parse(compile_statement)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "parses compiling categories" do
|
88
|
+
@formatter.should receive(:format_compile).with("NSMutableArray+ObjectiveSugar.m", "/Users/musalj/code/OSS/ObjectiveSugar/Classes/NSMutableArray+ObjectiveSugar.m")
|
89
|
+
@parser.parse(SAMPLE_COMPILE)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "parses compiling classes" do
|
93
|
+
@formatter.should receive(:format_compile).with("KWNull.m", "Classes/Core/KWNull.m")
|
94
|
+
@parser.parse(SAMPLE_ANOTHER_COMPILE)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "parses compiling Objective-C++ classes" do
|
98
|
+
@formatter.should receive(:format_compile).with("KWNull.mm", "Classes/Core/KWNull.mm")
|
99
|
+
@parser.parse(SAMPLE_ANOTHER_COMPILE.sub('.m', '.mm'))
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'parses compiling Swift source files' do
|
103
|
+
@formatter.should receive(:format_compile).with("Resource.swift", "/Users/paul/foo/bar/siesta/Source/Resource.swift")
|
104
|
+
@parser.parse(SAMPLE_SWIFT_COMPILE)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "parses compiling C and C++ files" do
|
108
|
+
['.c', '.cc', '.cpp', '.cxx'].each do |file_extension|
|
109
|
+
@formatter.should receive(:format_compile).with("KWNull" + file_extension, "Classes/Core/KWNull" + file_extension)
|
110
|
+
@parser.parse(SAMPLE_ANOTHER_COMPILE.sub('.m', file_extension))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it "parses compiling XIBs" do
|
115
|
+
@formatter.should receive(:format_compile_xib).with("MainMenu.xib", "CocoaChip/en.lproj/MainMenu.xib")
|
116
|
+
@parser.parse(SAMPLE_COMPILE_XIB)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "parses compiling storyboards" do
|
120
|
+
@formatter.should receive(:format_compile_storyboard).with("Main.storyboard", "sample/Main.storyboard")
|
121
|
+
@parser.parse(SAMPLE_COMPILE_STORYBOARD)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'parses CopyPlistFile' do
|
125
|
+
@formatter.should receive(:format_copy_plist_file).with(
|
126
|
+
'/path/to/Some.plist', '/some other/File.plist')
|
127
|
+
@parser.parse('CopyPlistFile /path/to/Some.plist /some other/File.plist')
|
128
|
+
end
|
129
|
+
|
130
|
+
it "parses CopyStringsFile" do
|
131
|
+
@formatter.should receive(:format_copy_strings_file).with('InfoPlist.strings')
|
132
|
+
@parser.parse(SAMPLE_COPYSTRINGS)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "parses CpHeader" do
|
136
|
+
@formatter.should receive(:format_copy_header_file).with(
|
137
|
+
'/path/to/Header.h', '/some other/path/Header.h')
|
138
|
+
@parser.parse('CpHeader /path/to/Header.h /some other/path/Header.h')
|
139
|
+
end
|
140
|
+
|
141
|
+
it "parses CpResource" do
|
142
|
+
@formatter.should receive(:format_cpresource).with('ObjectiveSugar/Default-568h@2x.png')
|
143
|
+
@parser.parse(SAMPLE_CPRESOURCE)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "parses GenerateDSYMFile" do
|
147
|
+
@formatter.should receive(:format_generate_dsym).with('ObjectiveSugarTests.octest.dSYM')
|
148
|
+
@parser.parse(SAMPLE_DSYM)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "parses info.plist processing" do
|
152
|
+
@formatter.should receive(:format_process_info_plist).with('The Spacer-Info.plist', 'The Spacer/The Spacer-Info.plist')
|
153
|
+
@parser.parse(SAMPLE_PROCESS_INFOPLIST)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "parses Ld" do
|
157
|
+
@formatter.should receive(:format_linking).with('ObjectiveSugar', 'normal', 'i386')
|
158
|
+
@parser.parse(SAMPLE_LD)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "parses Ld with relative path" do
|
162
|
+
@formatter.should receive(:format_linking).with('ObjectiveSugar', 'normal', 'i386')
|
163
|
+
@parser.parse(SAMPLE_LD_RELATIVE)
|
164
|
+
end
|
165
|
+
|
166
|
+
it "parses Libtool" do
|
167
|
+
@formatter.should receive(:format_libtool).with('libPods-ObjectiveSugarTests-Kiwi.a')
|
168
|
+
@parser.parse(SAMPLE_LIBTOOL)
|
169
|
+
end
|
170
|
+
|
171
|
+
it "parses uitest failing tests" do
|
172
|
+
@formatter.should receive(:format_failing_test).with(
|
173
|
+
"viewUITests.vmtAboutWindow",
|
174
|
+
"testConnectToDesktop",
|
175
|
+
"UI Testing Failure - Unable to find hit point for element Button 0x608001165880: {{74.0, -54.0}, {44.0, 38.0}}, label: 'Disconnect'",
|
176
|
+
"<unknown>:0"
|
177
|
+
)
|
178
|
+
@parser.parse(SAMPLE_UITEST_CASE_WITH_FAILURE)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "parses specta failing tests" do
|
182
|
+
@formatter.should receive(:format_failing_test).with("SKWelcomeViewControllerSpecSpec",
|
183
|
+
"SKWelcomeViewController_When_a_user_opens_the_app_from_a_clean_installation_displays_the_welcome_screen",
|
184
|
+
"The step timed out after 2.00 seconds: Failed to find accessibility element with the label \"The asimplest way to make smarter business decisions\"",
|
185
|
+
"/Users/vickeryj/Code/ipad-register/KIFTests/Specs/SKWelcomeViewControllerSpec.m:11")
|
186
|
+
@parser.parse(SAMPLE_SPECTA_FAILURE)
|
187
|
+
end
|
188
|
+
|
189
|
+
it "parses old specta failing tests" do
|
190
|
+
@formatter.should receive(:format_failing_test).with("RACCommandSpec",
|
191
|
+
"enabled_signal_should_send_YES_while_executing_is_YES_and_allowsConcurrentExecution_is_YES",
|
192
|
+
"expected: 1, got: 0",
|
193
|
+
"/Users/musalj/code/OSS/ReactiveCocoa/ReactiveCocoaFramework/ReactiveCocoaTests/RACCommandSpec.m:458")
|
194
|
+
@parser.parse(SAMPLE_OLD_SPECTA_FAILURE)
|
195
|
+
end
|
196
|
+
|
197
|
+
it "parses ld bitcode errors" do
|
198
|
+
@formatter.should receive(:format_error).with(SAMPLE_BITCODE_LD.strip)
|
199
|
+
@parser.parse(SAMPLE_BITCODE_LD)
|
200
|
+
end
|
201
|
+
|
202
|
+
it "parses passing ocunit tests" do
|
203
|
+
@formatter.should receive(:format_passing_test).with('RACCommandSpec',
|
204
|
+
'enabled_signal_should_send_YES_while_executing_is_YES',
|
205
|
+
'0.001')
|
206
|
+
@parser.parse(SAMPLE_OCUNIT_TEST)
|
207
|
+
end
|
208
|
+
|
209
|
+
it "parses passing specta tests" do
|
210
|
+
@formatter.should receive(:format_passing_test).with('SKWelcomeActivationViewControllerSpecSpec',
|
211
|
+
'SKWelcomeActivationViewController_When_a_user_enters_their_details_lets_them_enter_a_valid_manager_code',
|
212
|
+
'0.725')
|
213
|
+
@parser.parse(SAMPLE_SPECTA_TEST)
|
214
|
+
end
|
215
|
+
|
216
|
+
it "parses pending tests" do
|
217
|
+
@formatter.should receive(:format_pending_test).with('TAPIConversationSpec',
|
218
|
+
'TAPIConversation_createConversation_SendsAPOSTRequestToTheConversationsEndpoint')
|
219
|
+
@parser.parse(SAMPLE_PENDING_KIWI_TEST)
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'parses measuring tests' do
|
223
|
+
@formatter.should receive(:format_measuring_test).with(
|
224
|
+
'SecEncodeTransformTests.SecEncodeTransformTests',
|
225
|
+
'test_RFC4648_Decode_UsingBase32',
|
226
|
+
'0.013'
|
227
|
+
)
|
228
|
+
@parser.parse(SAMPLE_MEASURING_TEST)
|
229
|
+
end
|
230
|
+
|
231
|
+
it "parses build success indicator" do
|
232
|
+
@formatter.should receive(:format_phase_success).with('BUILD')
|
233
|
+
@parser.parse(SAMPLE_BUILD_SUCCEEDED)
|
234
|
+
end
|
235
|
+
|
236
|
+
it "parses clean success indicator" do
|
237
|
+
@formatter.should receive(:format_phase_success).with('CLEAN')
|
238
|
+
@parser.parse(SAMPLE_CLEAN_SUCCEEDED)
|
239
|
+
end
|
240
|
+
|
241
|
+
it "parses PhaseScriptExecution" do
|
242
|
+
@formatter.should receive(:format_phase_script_execution).with('Check Pods Manifest.lock')
|
243
|
+
@parser.parse(SAMPLE_RUN_SCRIPT)
|
244
|
+
end
|
245
|
+
|
246
|
+
it "parses process PCH" do
|
247
|
+
@formatter.should receive(:format_process_pch).with("Pods-CocoaLumberjack-prefix.pch")
|
248
|
+
@parser.parse(SAMPLE_PRECOMPILE)
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'parses process PCH command' do
|
252
|
+
compile_statement = SAMPLE_PRECOMPILE.lines.to_a.last
|
253
|
+
@formatter.should receive(:format_process_pch_command).with("/Users/musalj/code/OSS/ObjectiveRecord/Pods/Pods-CocoaLumberjack-prefix.pch")
|
254
|
+
@parser.parse(compile_statement)
|
255
|
+
end
|
256
|
+
|
257
|
+
it "parses preprocessing" do
|
258
|
+
@formatter.should receive(:format_preprocess).with("CocoaChip/CocoaChip-Info.plist")
|
259
|
+
@parser.parse(SAMPLE_PREPROCESS)
|
260
|
+
end
|
261
|
+
|
262
|
+
it "parses PBXCp" do
|
263
|
+
@formatter.should receive(:format_pbxcp).with("build/Release/CocoaChipCore.framework")
|
264
|
+
@parser.parse(SAMPLE_PBXCP)
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'parses changing directories' do
|
268
|
+
@formatter.should receive(:format_shell_command).with('cd',
|
269
|
+
'/some/place/out\ there')
|
270
|
+
@parser.parse(' cd /some/place/out\ there')
|
271
|
+
end
|
272
|
+
|
273
|
+
it 'parses any indented command' do
|
274
|
+
@formatter.should receive(:format_shell_command).with(
|
275
|
+
'/bin/rm', '-rf /bin /usr /Users')
|
276
|
+
@parser.parse(' /bin/rm -rf /bin /usr /Users')
|
277
|
+
end
|
278
|
+
|
279
|
+
it "parses Touch" do
|
280
|
+
@formatter.should receive(:format_touch).with(
|
281
|
+
'/Users/musalj/Library/Developer/Xcode/DerivedData/Alcatraz-aobuxcinaqyzjugrnxjjhfzgwaou/Build/Products/Debug/Alcatraz Tests.octest',
|
282
|
+
'Alcatraz Tests.octest')
|
283
|
+
@parser.parse(SAMPLE_TOUCH)
|
284
|
+
end
|
285
|
+
|
286
|
+
it "parses write file" do
|
287
|
+
@formatter.should receive(:format_write_file).with(
|
288
|
+
'/Users/me/myproject/Build/Intermediates/Pods.build/Debug-iphonesimulator/Pods-AFNetworking.build/Objects-normal/x86_64/Pods-AFNetworking.LinkFileList')
|
289
|
+
@parser.parse(SAMPLE_WRITE_FILE)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "parses write auxiliary files" do
|
293
|
+
@formatter.should receive(:format_write_auxiliary_files)
|
294
|
+
@parser.parse(SAMPLE_WRITE_AUXILIARY_FILES)
|
295
|
+
end
|
296
|
+
|
297
|
+
it "parses TiffUtil" do
|
298
|
+
@formatter.should receive(:format_tiffutil).with('eye_icon.tiff')
|
299
|
+
@parser.parse(SAMPLE_TIFFUTIL)
|
300
|
+
end
|
301
|
+
|
302
|
+
it "parses undefined symbols" do
|
303
|
+
@formatter.should receive(:format_undefined_symbols).with("Undefined symbols for architecture x86_64",
|
304
|
+
'_OBJC_CLASS_$_CABasicAnimation',
|
305
|
+
'objc-class-ref in ATZRadialProgressControl.o')
|
306
|
+
SAMPLE_UNDEFINED_SYMBOLS.each_line do |line|
|
307
|
+
@parser.parse(line)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
it "parses duplicate symbols" do
|
312
|
+
@formatter.should receive(:format_duplicate_symbols).with(
|
313
|
+
"duplicate symbol _OBJC_IVAR_$ClassName._ivarName in",
|
314
|
+
[
|
315
|
+
'/Users/username/Library/Developer/Xcode/DerivedData/App-arcyyktezaigixbocjwfhsjllojz/Build/Intermediates/App.build/Debug-iphonesimulator/App.build/Objects-normal/i386/ClassName.o',
|
316
|
+
'/Users/username/Library/Developer/Xcode/DerivedData/App-arcyyktezaigixbocjwfhsjllojz/Build/Products/Debug-iphonesimulator/libPods.a(DuplicateClassName.o)'
|
317
|
+
]
|
318
|
+
)
|
319
|
+
SAMPLE_DUPLICATE_SYMBOLS.each_line do |line|
|
320
|
+
@parser.parse(line)
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
it "parses ocunit test run finished" do
|
325
|
+
@formatter.should receive(:format_test_run_finished).with('ReactiveCocoaTests.octest(Tests)', '2013-12-10 07:03:03 +0000.')
|
326
|
+
@parser.parse(SAMPLE_OCUNIT_TEST_RUN_COMPLETION)
|
327
|
+
end
|
328
|
+
|
329
|
+
it "parses ocunit test run passed" do
|
330
|
+
@formatter.should receive(:format_test_run_finished).with('Hazelnuts.xctest', '2014-09-24 23:09:20 +0000.')
|
331
|
+
@parser.parse(SAMPLE_OCUNIT_PASSED_TEST_RUN_COMPLETION)
|
332
|
+
end
|
333
|
+
|
334
|
+
it "parses ocunit test run failed" do
|
335
|
+
@formatter.should receive(:format_test_run_finished).with('Macadamia.octest', '2014-09-24 23:09:20 +0000.')
|
336
|
+
@parser.parse(SAMPLE_OCUNIT_FAILED_TEST_RUN_COMPLETION)
|
337
|
+
end
|
338
|
+
|
339
|
+
it "parses specta test run finished" do
|
340
|
+
@formatter.should receive(:format_test_run_finished).with('KIFTests.xctest', '2014-02-28 15:44:32 +0000.')
|
341
|
+
@parser.parse(SAMPLE_SPECTA_TEST_RUN_COMPLETION)
|
342
|
+
end
|
343
|
+
|
344
|
+
it "parses ocunit test run started" do
|
345
|
+
@formatter.should receive(:format_test_run_started).with('ReactiveCocoaTests.octest(Tests)')
|
346
|
+
@parser.parse(SAMPLE_OCUNIT_TEST_RUN_BEGINNING)
|
347
|
+
end
|
348
|
+
|
349
|
+
it "parses specta test run started" do
|
350
|
+
@formatter.should receive(:format_test_run_started).with('KIFTests.xctest')
|
351
|
+
@parser.parse(SAMPLE_SPECTA_TEST_RUN_BEGINNING)
|
352
|
+
end
|
353
|
+
|
354
|
+
it "parses ocunit test suite started" do
|
355
|
+
@formatter.should receive(:format_test_suite_started).with('RACKVOWrapperSpec')
|
356
|
+
@parser.parse(SAMPLE_OCUNIT_SUITE_BEGINNING)
|
357
|
+
end
|
358
|
+
|
359
|
+
it "parses specta test suite started" do
|
360
|
+
@formatter.should receive(:format_test_suite_started).with('All tests')
|
361
|
+
@parser.parse(SAMPLE_SPECTA_SUITE_BEGINNING)
|
362
|
+
end
|
363
|
+
|
364
|
+
it "parses unknown strings" do
|
365
|
+
@formatter.should receive(:format_other).with(
|
366
|
+
SAMPLE_FORMAT_OTHER_UNRECOGNIZED_STRING
|
367
|
+
)
|
368
|
+
@parser.parse(SAMPLE_FORMAT_OTHER_UNRECOGNIZED_STRING)
|
369
|
+
end
|
370
|
+
|
371
|
+
context "errors" do
|
372
|
+
it "parses clang errors" do
|
373
|
+
@formatter.should receive(:format_error).with(SAMPLE_CLANG_ERROR)
|
374
|
+
@parser.parse(SAMPLE_CLANG_ERROR)
|
375
|
+
end
|
376
|
+
|
377
|
+
it "parses cocoapods errors" do
|
378
|
+
@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.")
|
379
|
+
@parser.parse(SAMPLE_PODS_ERROR)
|
380
|
+
end
|
381
|
+
|
382
|
+
it "parses compiling errors" do
|
383
|
+
@formatter.should receive(:format_compile_error).with(
|
384
|
+
"SampleTest.m",
|
385
|
+
"/Users/musalj/code/OSS/SampleApp/SampleTest.m:12:59",
|
386
|
+
"expected identifier",
|
387
|
+
" [[thread.lastMessage should] equal:thread.];",
|
388
|
+
" ^")
|
389
|
+
SAMPLE_COMPILE_ERROR.each_line do |line|
|
390
|
+
@parser.parse(line)
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
it 'parses fatal compiling errors' do
|
395
|
+
@formatter.should receive(:format_compile_error).with(
|
396
|
+
'SomeRandomClass.h',
|
397
|
+
'/Users/musalj/code/OSS/SampleApp/Pods/Headers/LessCoolPod/SomeRandomClass.h:31:9',
|
398
|
+
"'SomeRandomHeader.h' file not found",
|
399
|
+
'#import "SomeRandomHeader.h"',
|
400
|
+
' ^'
|
401
|
+
# For now, it's probably not worth to provide the import stack
|
402
|
+
# It'd require more state, and not sure if it'd be any useful
|
403
|
+
# %Q(In file included from /Users/musalj/code/OSS/SampleApp/Pods/SuperCoolPod/SuperAwesomeClass.m:12:
|
404
|
+
# In file included from /Users/musalj/code/OSS/SampleApp/Pods/../LessCoolPod/LessCoolClass.h:9:
|
405
|
+
# In file included from /Users/musalj/code/OSS/SampleApp/Pods/../LessCoolPod/EvenLessCoolClass.h:10:)
|
406
|
+
)
|
407
|
+
SAMPLE_FATAL_COMPILE_ERROR.each_line do |line|
|
408
|
+
@parser.parse(line)
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
it 'parses file missing errors' do
|
413
|
+
@formatter.should receive(:format_file_missing_error).with(
|
414
|
+
'error: no such file or directory:',
|
415
|
+
'/Users/travis/build/supermarin/project/Classes/Class + Category/Two Words/MissingViewController.swift'
|
416
|
+
)
|
417
|
+
@parser.parse(SAMPLE_FILE_MISSING_ERROR)
|
418
|
+
end
|
419
|
+
|
420
|
+
it 'parses fatal error: on the beginning of the line for corrupted AST files' do
|
421
|
+
@formatter.should receive(:format_error).with(
|
422
|
+
"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'"
|
423
|
+
)
|
424
|
+
@parser.parse(SAMPLE_FATAL_HEADER_ERROR)
|
425
|
+
end
|
426
|
+
|
427
|
+
it 'parses fatal error: on the beginning of the line for cached PCH' do
|
428
|
+
@formatter.should receive(:format_error).with(
|
429
|
+
"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"
|
430
|
+
)
|
431
|
+
@parser.parse(SAMPLE_FATAL_COMPILE_PCH_ERROR)
|
432
|
+
end
|
433
|
+
|
434
|
+
|
435
|
+
|
436
|
+
it "parses compiling errors with tildes" do
|
437
|
+
@formatter.should receive(:format_compile_error).with(
|
438
|
+
'NSSetTests.m',
|
439
|
+
'/Users/musalj/code/OSS/ObjectiveSugar/Example/ObjectiveSugarTests/NSSetTests.m:93:16',
|
440
|
+
"no visible @interface for 'NSArray' declares the selector 'shoulds'",
|
441
|
+
' }] shoulds] equal:@[ @"F458 Italia", @"Testarossa" ]];',
|
442
|
+
' ~~ ^~~~~~~')
|
443
|
+
SAMPLE_COMPILE_ERROR_WITH_TILDES.each_line do |line|
|
444
|
+
@parser.parse(line)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
it "parses code sign error:" do
|
449
|
+
@formatter.should receive(:format_error).with(
|
450
|
+
'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.'
|
451
|
+
)
|
452
|
+
@parser.parse(SAMPLE_CODESIGN_ERROR)
|
453
|
+
end
|
454
|
+
|
455
|
+
it "parses CodeSign error: (no spaces)" do
|
456
|
+
@formatter.should receive(:format_error).with(
|
457
|
+
"CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.0'"
|
458
|
+
)
|
459
|
+
@parser.parse(SAMPLE_CODESIGN_ERROR_NO_SPACES)
|
460
|
+
end
|
461
|
+
|
462
|
+
it "parses No profile matching error:" do
|
463
|
+
@formatter.should receive(:format_error).with(
|
464
|
+
"No profile matching 'TargetName' found: Xcode couldn't find a profile matching 'TargetName'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the General tab of the target editor."
|
465
|
+
)
|
466
|
+
@parser.parse(SAMPLE_NO_PROFILE_MATCHING_ERROR)
|
467
|
+
end
|
468
|
+
|
469
|
+
it "parses requires provision error:" do
|
470
|
+
@formatter.should receive(:format_error).with(
|
471
|
+
'PROJECT_NAME requires a provisioning profile. Select a provisioning profile for the "Debug" build configuration in the project editor.'
|
472
|
+
)
|
473
|
+
@parser.parse(SAMPLE_REQUIRES_PROVISION)
|
474
|
+
end
|
475
|
+
|
476
|
+
it "parses no certificate error:" do
|
477
|
+
@formatter.should receive(:format_error).with(
|
478
|
+
"No certificate matching 'iPhone Distribution: Name (B89SBB0AV9)' for team 'B89SBB0AV9': Select a different signing certificate for CODE_SIGN_IDENTITY, a team that matches your selected certificate, or switch to automatic provisioning."
|
479
|
+
)
|
480
|
+
@parser.parse(SAMPLE_NO_CERTIFICATE)
|
481
|
+
end
|
482
|
+
|
483
|
+
it "parses swift unavailable error:" do
|
484
|
+
@formatter.should receive(:format_error).with(
|
485
|
+
SAMPLE_SWIFT_UNAVAILABLE
|
486
|
+
)
|
487
|
+
@parser.parse(SAMPLE_SWIFT_UNAVAILABLE)
|
488
|
+
end
|
489
|
+
|
490
|
+
it "parses use legacy swift error:" do
|
491
|
+
@formatter.should receive(:format_error).with(
|
492
|
+
SAMPLE_USE_LEGACY_SWIFT
|
493
|
+
)
|
494
|
+
@parser.parse(SAMPLE_USE_LEGACY_SWIFT)
|
495
|
+
end
|
496
|
+
|
497
|
+
it "parses ld library errors" do
|
498
|
+
@formatter.should receive(:format_error).with(
|
499
|
+
SAMPLE_LD_LIBRARY_ERROR
|
500
|
+
)
|
501
|
+
@parser.parse(SAMPLE_LD_LIBRARY_ERROR)
|
502
|
+
end
|
503
|
+
|
504
|
+
it 'parses ld symbols errors' do
|
505
|
+
@formatter.should receive(:format_error).with(
|
506
|
+
SAMPLE_LD_SYMBOLS_ERROR
|
507
|
+
)
|
508
|
+
@parser.parse(SAMPLE_LD_SYMBOLS_ERROR)
|
509
|
+
end
|
510
|
+
|
511
|
+
it "doesn't print the same error over and over" do
|
512
|
+
SAMPLE_COMPILE_ERROR.each_line do |line|
|
513
|
+
@parser.parse(line)
|
514
|
+
end
|
515
|
+
@formatter.should_not receive(:format_compile_error)
|
516
|
+
@parser.parse("hohohoooo")
|
517
|
+
end
|
518
|
+
|
519
|
+
it "parses provisioning profile doesn't support capability error" do
|
520
|
+
@formatter.should receive(:format_error)
|
521
|
+
@parser.parse(SAMPLE_PROFILE_DOESNT_SUPPORT_CAPABILITY_ERROR)
|
522
|
+
end
|
523
|
+
|
524
|
+
it "parses provisioning profile doesn't include entitlement error" do
|
525
|
+
@formatter.should receive(:format_error)
|
526
|
+
@parser.parse(SAMPLE_PROFILE_DOESNT_INCLUDE_ENTITLEMENT_ERROR)
|
527
|
+
end
|
528
|
+
|
529
|
+
it "parses code signing is required error" do
|
530
|
+
@formatter.should receive(:format_error)
|
531
|
+
@parser.parse(SAMPLE_CODE_SIGNING_IS_REQUIRED_ERROR)
|
532
|
+
end
|
533
|
+
|
534
|
+
it "parses module includes error" do
|
535
|
+
@formatter.should receive(:format_error).with(
|
536
|
+
"error: umbrella header for module 'ModuleName' does not include header 'Header.h'"
|
537
|
+
)
|
538
|
+
@parser.parse(SAMPLE_MODULE_INCLUDES_ERROR)
|
539
|
+
end
|
540
|
+
end
|
541
|
+
|
542
|
+
context "warnings" do
|
543
|
+
it 'parses compiler warnings' do
|
544
|
+
@formatter.should receive(:format_warning).with("TEST 123")
|
545
|
+
@parser.parse("warning: TEST 123")
|
546
|
+
end
|
547
|
+
|
548
|
+
it "parses compiling warnings" do
|
549
|
+
@formatter.should receive(:format_compile_warning).with(
|
550
|
+
"AppDelegate.m",
|
551
|
+
"/Users/supermarin/code/oss/ObjectiveSugar/Example/ObjectiveSugar/AppDelegate.m:19:31",
|
552
|
+
"format specifies type 'id' but the argument has type 'int' [-Wformat]",
|
553
|
+
" NSLog(@\"I HAZ %@ CATS\", 1);",
|
554
|
+
" ~~ ^")
|
555
|
+
SAMPLE_FORMAT_WARNING.each_line do |line|
|
556
|
+
@parser.parse(line)
|
557
|
+
end
|
558
|
+
end
|
559
|
+
|
560
|
+
it "parses ld warnings" do
|
561
|
+
@formatter.should receive(:format_ld_warning).with("ld: embedded dylibs/frameworks only run on iOS 8 or later")
|
562
|
+
@parser.parse("ld: warning: embedded dylibs/frameworks only run on iOS 8 or later")
|
563
|
+
end
|
564
|
+
|
565
|
+
it "parses will not be code signed warnings" do
|
566
|
+
@formatter.should receive(:format_will_not_be_code_signed).with(SAMPLE_WILL_NOT_BE_CODE_SIGNED)
|
567
|
+
@parser.parse(SAMPLE_WILL_NOT_BE_CODE_SIGNED)
|
568
|
+
end
|
569
|
+
end
|
570
|
+
|
571
|
+
context "summary" do
|
572
|
+
def given_tests_have_started(reporter = SAMPLE_OCUNIT_TEST_RUN_BEGINNING)
|
573
|
+
@parser.parse(reporter)
|
574
|
+
end
|
575
|
+
|
576
|
+
def given_tests_are_done(reporter = SAMPLE_OCUNIT_TEST_RUN_COMPLETION)
|
577
|
+
@parser.parse(reporter)
|
578
|
+
end
|
579
|
+
|
580
|
+
def given_kiwi_tests_are_done
|
581
|
+
@parser.parse(SAMPLE_KIWI_TEST_RUN_COMPLETION)
|
582
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
583
|
+
@parser.parse(SAMPLE_KIWI_SUITE_COMPLETION)
|
584
|
+
end
|
585
|
+
|
586
|
+
it "returns empty string if the suite is not done" do
|
587
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS).should == ""
|
588
|
+
end
|
589
|
+
|
590
|
+
it "knows when the test suite is done for OCunit" do
|
591
|
+
given_tests_are_done
|
592
|
+
@formatter.should receive(:format_test_summary)
|
593
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
594
|
+
end
|
595
|
+
|
596
|
+
it "knows when the test suite is done for Specta" do
|
597
|
+
given_tests_are_done
|
598
|
+
@formatter.should receive(:format_test_summary)
|
599
|
+
@parser.parse(SAMPLE_SPECTA_EXECUTED_TESTS)
|
600
|
+
end
|
601
|
+
|
602
|
+
it "doesn't print executed message twice for Kiwi tests" do
|
603
|
+
@formatter.should_receive(:format_test_summary).once
|
604
|
+
given_tests_have_started(SAMPLE_KIWI_TEST_RUN_BEGINNING)
|
605
|
+
given_kiwi_tests_are_done
|
606
|
+
end
|
607
|
+
|
608
|
+
it "knows when the test suite is done for XCtest" do
|
609
|
+
@formatter.should_receive(:format_test_summary).once
|
610
|
+
2.times {
|
611
|
+
given_tests_are_done(SAMPLE_KIWI_TEST_RUN_COMPLETION)
|
612
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
613
|
+
}
|
614
|
+
end
|
615
|
+
|
616
|
+
it "prints OCunit / XCTest summary twice if tests executed twice" do
|
617
|
+
@formatter.should_receive(:format_test_summary).twice
|
618
|
+
2.times {
|
619
|
+
given_tests_have_started
|
620
|
+
given_tests_are_done
|
621
|
+
@parser.parse(SAMPLE_EXECUTED_TESTS)
|
622
|
+
}
|
623
|
+
end
|
624
|
+
|
625
|
+
it "prints Kiwi summary twice if tests executed twice" do
|
626
|
+
@formatter.should_receive(:format_test_summary).twice
|
627
|
+
2.times {
|
628
|
+
given_tests_have_started(SAMPLE_KIWI_TEST_RUN_BEGINNING)
|
629
|
+
given_kiwi_tests_are_done
|
630
|
+
}
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
@@ -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
|
+
|