juicer 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/History.txt +10 -0
  2. data/Manifest.txt +58 -0
  3. data/Rakefile +44 -0
  4. data/Readme.rdoc +143 -0
  5. data/bin/juicer +8 -0
  6. data/lib/juicer.rb +70 -0
  7. data/lib/juicer/binary.rb +173 -0
  8. data/lib/juicer/cache_buster.rb +45 -0
  9. data/lib/juicer/chainable.rb +106 -0
  10. data/lib/juicer/cli.rb +56 -0
  11. data/lib/juicer/command/install.rb +59 -0
  12. data/lib/juicer/command/list.rb +50 -0
  13. data/lib/juicer/command/merge.rb +185 -0
  14. data/lib/juicer/command/util.rb +32 -0
  15. data/lib/juicer/command/verify.rb +60 -0
  16. data/lib/juicer/core.rb +59 -0
  17. data/lib/juicer/css_cache_buster.rb +99 -0
  18. data/lib/juicer/install/base.rb +186 -0
  19. data/lib/juicer/install/jslint_installer.rb +51 -0
  20. data/lib/juicer/install/rhino_installer.rb +52 -0
  21. data/lib/juicer/install/yui_compressor_installer.rb +66 -0
  22. data/lib/juicer/jslint.rb +90 -0
  23. data/lib/juicer/merger/base.rb +74 -0
  24. data/lib/juicer/merger/css_dependency_resolver.rb +25 -0
  25. data/lib/juicer/merger/dependency_resolver.rb +82 -0
  26. data/lib/juicer/merger/javascript_dependency_resolver.rb +21 -0
  27. data/lib/juicer/merger/javascript_merger.rb +30 -0
  28. data/lib/juicer/merger/stylesheet_merger.rb +112 -0
  29. data/lib/juicer/minifyer/yui_compressor.rb +129 -0
  30. data/tasks/ann.rake +80 -0
  31. data/tasks/bones.rake +20 -0
  32. data/tasks/gem.rake +201 -0
  33. data/tasks/git.rake +40 -0
  34. data/tasks/notes.rake +27 -0
  35. data/tasks/post_load.rake +34 -0
  36. data/tasks/rdoc.rake +50 -0
  37. data/tasks/rubyforge.rake +55 -0
  38. data/tasks/setup.rb +300 -0
  39. data/tasks/spec.rake +54 -0
  40. data/tasks/svn.rake +47 -0
  41. data/tasks/test.rake +40 -0
  42. data/tasks/test/setup.rake +35 -0
  43. data/test/bin/jslint.js +474 -0
  44. data/test/bin/rhino1_7R1.zip +0 -0
  45. data/test/bin/rhino1_7R2-RC1.zip +0 -0
  46. data/test/bin/yuicompressor +238 -0
  47. data/test/bin/yuicompressor-2.3.5.zip +0 -0
  48. data/test/bin/yuicompressor-2.4.2.zip +0 -0
  49. data/test/juicer/command/test_install.rb +53 -0
  50. data/test/juicer/command/test_list.rb +69 -0
  51. data/test/juicer/command/test_merge.rb +155 -0
  52. data/test/juicer/command/test_util.rb +54 -0
  53. data/test/juicer/command/test_verify.rb +33 -0
  54. data/test/juicer/install/test_installer_base.rb +195 -0
  55. data/test/juicer/install/test_jslint_installer.rb +54 -0
  56. data/test/juicer/install/test_rhino_installer.rb +57 -0
  57. data/test/juicer/install/test_yui_compressor_installer.rb +56 -0
  58. data/test/juicer/merger/test_base.rb +122 -0
  59. data/test/juicer/merger/test_css_dependency_resolver.rb +36 -0
  60. data/test/juicer/merger/test_javascript_dependency_resolver.rb +39 -0
  61. data/test/juicer/merger/test_javascript_merger.rb +74 -0
  62. data/test/juicer/merger/test_stylesheet_merger.rb +178 -0
  63. data/test/juicer/minifyer/test_yui_compressor.rb +159 -0
  64. data/test/juicer/test_cache_buster.rb +58 -0
  65. data/test/juicer/test_chainable.rb +94 -0
  66. data/test/juicer/test_core.rb +47 -0
  67. data/test/juicer/test_css_cache_buster.rb +72 -0
  68. data/test/juicer/test_jslint.rb +33 -0
  69. data/test/test_helper.rb +146 -0
  70. data/test/test_juicer.rb +4 -0
  71. metadata +194 -0
Binary file
@@ -0,0 +1,238 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <title>Download the YUI Compressor</title>
5
+ <style>
6
+
7
+ /* reset.css */
8
+
9
+ body {color:#000;background:#FFF;}
10
+ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
11
+ table{border-collapse:collapse;border-spacing:0;}
12
+ fieldset,img{border:0;}
13
+ address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}
14
+ li {list-style:none;}
15
+ caption,th {text-align:left;}
16
+ h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
17
+ q:before,q:after{content:'';}
18
+ abbr,acronym {border:0;font-variant:normal;}
19
+ sup,sub {line-height:-1px;vertical-align: text-top;}
20
+ sub {vertical-align:text-bottom;}
21
+ input, textarea, select{font-family:inherit;font-size:inherit;font-weight:inherit;}
22
+
23
+ /* fonts.css */
24
+
25
+ body {font:13px/1.22 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
26
+ table {font-size:inherit;font:100%;}
27
+ pre,code,kbd,samp,tt {font-family:monospace;*font-size:108%;line-height:99%;}
28
+
29
+ /* button.css */
30
+
31
+ .yui-button{display:-moz-inline-box;display:inline-block;border-width:1px 0;border-style:solid;border-color:#999;background:#ecece3 url(background.png)left center;margin:auto .25em;}
32
+ .yui-button.ie6{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../../build/button/assets/background.png',sizingMethod = 'scale');}
33
+ .yui-button .first-child{display:block;*display:inline-block;border-width:0 1px;border-style:solid;border-color:#999;margin:0 -1px;*position:relative;*left:-1px;}
34
+ .yui-button button,.yui-button a{display:block;*display:inline-block;padding:.25em .5em;border:1px solid #ccc;}
35
+ .yui-button button{*overflow:visible;font-size:100%;background-color:transparent;cursor:pointer;cursor:hand;}
36
+ .yui-button a{text-decoration:none;color:#000;}
37
+ .yui-split-button button,.yui-menu-button button{padding-right:20px;background-position:right center;background-repeat:no-repeat;}
38
+ .yui-menu-button button{background-image:url(menuarrow.gif);}
39
+ .yui-split-button button{background-image:url(splitarrow.gif);}
40
+ .yui-button-focus{border-color:#5e5c95;}
41
+ .yui-button-focus .first-child{border-color:#5e5c95;}
42
+ .yui-button-focus button,.yui-button-focus a{border-color:#cec1fc;}
43
+ .yui-button-hover{border-color:#406fac;background-color:#98d5fc;}
44
+ .yui-button-hover .first-child{border-color:#406fac;}
45
+ .yui-button-hover button,.yui-button-hover a{border-color:#7099ce;}
46
+ .yui-button-active{border-color:#7a8180;background-color:#333;}
47
+ .yui-button-active .first-child{border-color:#7a8180;}
48
+ .yui-button-active button,.yui-button-active a{border-color:#98a09f;}
49
+ .yui-split-button-activeoption button{background-color:transparent;background-image:url(splitarrow_active.gif);}
50
+ .yui-radio-button-checked,.yui-checkbox-button-checked{border-color:#7a8180;background-color:#333;}
51
+ .yui-radio-button-checked .first-child,.yui-checkbox-button-checked .first-child{border-color:#7a8180;}
52
+ .yui-radio-button-checked button,.yui-checkbox-button-checked button{border-color:#98a09f;}
53
+ .yui-button-disabled{border-color:#cbcdc5;background:#ecece3;filter:none;}
54
+ .yui-button-disabled .first-child{border-color:#cbcdc5;}
55
+ .yui-button-disabled button,.yui-button-disabled a{border-color:transparent;color:#b9b9b9;cursor:default;}
56
+
57
+ /* custom css */
58
+
59
+ body { padding:1em; }
60
+
61
+ #downloadbutton a {
62
+ padding:.8em; padding-left:3em;
63
+ background:#deecf7 url(download.png) 4% 50% no-repeat;
64
+ font-size:1.5em;
65
+ font-weight:bold;
66
+ }
67
+
68
+ h3 {
69
+ margin:1em 0;
70
+ font-size:1.5em;
71
+ font-weight:bold;
72
+ }
73
+
74
+ ul {
75
+ margin-left:1em;
76
+ }
77
+
78
+ ul li {
79
+ list-style-type:disc;
80
+ }
81
+ </style>
82
+ </head>
83
+ <body>
84
+
85
+ <div id="doc">
86
+
87
+ <span id="downloadbutton" class="yui-button yui-link-button" style="margin-bottom:1em;">
88
+ <em class="first-child">
89
+ <a href="yuicompressor-2.4.2.zip">Download YUI Compressor version 2.4.2</a>
90
+ </em>
91
+ </span>
92
+
93
+ <h3>Documentation</h3>
94
+
95
+ <pre>==============================================================================
96
+ YUI Compressor
97
+ ==============================================================================
98
+
99
+ NAME
100
+
101
+ YUI Compressor - The Yahoo! JavaScript and CSS Compressor
102
+
103
+ SYNOPSIS
104
+
105
+ Usage: java -jar yuicompressor-x.y.z.jar [options] [input file]
106
+
107
+ Global Options
108
+ -h, --help Displays this information
109
+ --type &lt;js|css&gt; Specifies the type of the input file
110
+ --charset &lt;charset&gt; Read the input file using &lt;charset&gt;
111
+ --line-break &lt;column&gt; Insert a line break after the specified column number
112
+ -v, --verbose Display informational messages and warnings
113
+ -o &lt;file&gt; Place the output into &lt;file&gt;. Defaults to stdout.
114
+
115
+ JavaScript Options
116
+ --nomunge Minify only, do not obfuscate
117
+ --preserve-semi Preserve all semicolons
118
+ --disable-optimizations Disable all micro optimizations
119
+
120
+ DESCRIPTION
121
+
122
+ The YUI Compressor is a JavaScript compressor which, in addition to removing
123
+ comments and white-spaces, obfuscates local variables using the smallest
124
+ possible variable name. This obfuscation is safe, even when using constructs
125
+ such as 'eval' or 'with' (although the compression is not optimal is those
126
+ cases) Compared to jsmin, the average savings is around 20%.
127
+
128
+ The YUI Compressor is also able to safely compress CSS files. The decision
129
+ on which compressor is being used is made on the file extension (js or css)
130
+
131
+ GLOBAL OPTIONS
132
+
133
+ -h, --help
134
+ Prints help on how to use the YUI Compressor
135
+
136
+ --line-break
137
+ Some source control tools don't like files containing lines longer than,
138
+ say 8000 characters. The linebreak option is used in that case to split
139
+ long lines after a specific column. It can also be used to make the code
140
+ more readable, easier to debug (especially with the MS Script Debugger)
141
+ Specify 0 to get a line break after each semi-colon in JavaScript, and
142
+ after each rule in CSS.
143
+
144
+ --type js|css
145
+ The type of compressor (JavaScript or CSS) is chosen based on the
146
+ extension of the input file name (.js or .css) This option is required
147
+ if no input file has been specified. Otherwise, this option is only
148
+ required if the input file extension is neither 'js' nor 'css'.
149
+
150
+ --charset character-set
151
+ If a supported character set is specified, the YUI Compressor will use it
152
+ to read the input file. Otherwise, it will assume that the platform's
153
+ default character set is being used. The output file is encoded using
154
+ the same character set.
155
+
156
+ -o outfile
157
+ Place output in file outfile. If not specified, the YUI Compressor will
158
+ default to the standard output, which you can redirect to a file.
159
+
160
+ -v, --verbose
161
+ Display informational messages and warnings.
162
+
163
+ JAVASCRIPT ONLY OPTIONS
164
+
165
+ --nomunge
166
+ Minify only. Do not obfuscate local symbols.
167
+
168
+ --preserve-semi
169
+ Preserve unnecessary semicolons (such as right before a '}') This option
170
+ is useful when compressed code has to be run through JSLint (which is the
171
+ case of YUI for example)
172
+
173
+ --disable-optimizations
174
+ Disable all the built-in micro optimizations.
175
+
176
+ NOTES
177
+
178
+ + If no input file is specified, it defaults to stdin.
179
+
180
+ + The YUI Compressor requires Java version &gt;= 1.4.
181
+
182
+ + It is possible to prevent a local variable, nested function or function
183
+ argument from being obfuscated by using "hints". A hint is a string that
184
+ is located at the very beginning of a function body like so:
185
+
186
+ function fn (arg1, arg2, arg3) {
187
+ "arg2:nomunge, localVar:nomunge, nestedFn:nomunge";
188
+
189
+ ...
190
+ var localVar;
191
+ ...
192
+
193
+ function nestedFn () {
194
+ ....
195
+ }
196
+
197
+ ...
198
+ }
199
+
200
+ The hint itself disappears from the compressed file.
201
+
202
+ + C-style comments starting with /*! are preserved. This is useful with
203
+ comments containing copyright/license information. For example:
204
+
205
+ /*!
206
+ * TERMS OF USE - EASING EQUATIONS
207
+ * Open source under the BSD License.
208
+ * Copyright 2001 Robert Penner All rights reserved.
209
+ */
210
+
211
+ becomes:
212
+
213
+ /*
214
+ * TERMS OF USE - EASING EQUATIONS
215
+ * Open source under the BSD License.
216
+ * Copyright 2001 Robert Penner All rights reserved.
217
+ */
218
+
219
+ AUTHOR
220
+
221
+ The YUI Compressor was written and is maintained by:
222
+ Julien Lecomte &lt;jlecomte@yahoo-inc.com&gt;
223
+ The CSS portion is a port of Isaac Schlueter's cssmin utility.
224
+
225
+ COPYRIGHT
226
+
227
+ Copyright (c) 2007-2009, Yahoo! Inc. All rights reserved.
228
+
229
+ LICENSE
230
+
231
+ All code specific to YUI Compressor is issued under a BSD license.
232
+ YUI Compressor extends and implements code from Mozilla's Rhino project.
233
+ Rhino is issued under the Mozilla Public License (MPL), and MPL applies
234
+ to the Rhino source and binaries that are distributed with YUI Compressor.</pre>
235
+
236
+ </div>
237
+ </body>
238
+ </html>
@@ -0,0 +1,53 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
2
+
3
+ class TestInstallCommand < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @io = StringIO.new
7
+ @command = Juicer::Command::Install.new(Logger.new(@io))
8
+ FileUtils.rm_rf(path(".juicer/lib")) if File.exists?(path(".juicer/lib"))
9
+ end
10
+
11
+ def test_default_version_should_bring_up_latest_from_installer
12
+ assert_equal "1.0", @command.version(Juicer::Install::JSLintInstaller.new)
13
+ end
14
+
15
+ def test_explicit_version_should_not_be_overridden
16
+ @command.instance_eval { @version = "1.0.1" }
17
+ assert_equal "1.0.1", @command.version(Juicer::Install::JSLintInstaller.new)
18
+ end
19
+
20
+ def test_execute_should_require_atleast_one_argument
21
+ assert_raise ArgumentError do
22
+ @command.execute
23
+ end
24
+ end
25
+
26
+ def test_install_single_lib
27
+ installer = Juicer::Install::JSLintInstaller.new(path(".juicer"))
28
+ assert !installer.installed?
29
+
30
+ @command.instance_eval { @path = path(".juicer") }
31
+ @command.execute("jslint")
32
+ assert installer.installed?
33
+ end
34
+
35
+ def test_install_already_installed_lib
36
+ installer = Juicer::Install::JSLintInstaller.new(path(".juicer"))
37
+ installer.install
38
+ assert installer.installed?
39
+
40
+ @command.execute("jslint")
41
+ assert_match(/is already installed in/, @io.string)
42
+ end
43
+
44
+ def test_install_specific_version
45
+ installer = Juicer::Install::JSLintInstaller.new(path(".juicer"))
46
+ assert !installer.installed?("0.9")
47
+
48
+ @command.instance_eval { @path = path(".juicer") }
49
+ @command.instance_eval { @version = "0.9" }
50
+ @command.execute("jslint")
51
+ assert installer.installed?("0.9")
52
+ end
53
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
2
+
3
+ class TestListCommand < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @io = StringIO.new
7
+ @command = Juicer::Command::List.new(@io)
8
+ Juicer::Test::FileSetup.new.create
9
+ end
10
+
11
+ def test_list_nothing
12
+ assert_raise ArgumentError do
13
+ @command.execute
14
+ end
15
+
16
+ assert_raise ArgumentError do
17
+ @command.execute []
18
+ end
19
+ end
20
+
21
+ def test_list_css_file
22
+ @command.execute "test/data/a.css"
23
+
24
+ msg = <<-STDOUT
25
+ Dependency chain for test/data/a.css:
26
+ test/data/b.css
27
+ test/data/a.css
28
+
29
+ STDOUT
30
+
31
+ assert_equal msg, @io.string
32
+ end
33
+
34
+ def test_list_js_file
35
+ @command.execute "test/data/a.js"
36
+
37
+ msg = <<-STDOUT
38
+ Dependency chain for test/data/a.js:
39
+ test/data/b.js
40
+ test/data/a.js
41
+
42
+ STDOUT
43
+
44
+ assert_equal msg, @io.string
45
+ end
46
+
47
+ def test_list_several_files
48
+ @command.execute ["test/data/a.js", "test/data/b.js"]
49
+
50
+ msg = <<-STDOUT
51
+ Dependency chain for test/data/a.js:
52
+ test/data/b.js
53
+ test/data/a.js
54
+
55
+ Dependency chain for test/data/b.js:
56
+ test/data/a.js
57
+ test/data/b.js
58
+
59
+ STDOUT
60
+
61
+ assert_equal msg, @io.string
62
+ end
63
+
64
+ def test_list_files_unable_to_guess_type
65
+ assert_raise FileNotFoundError do
66
+ @command.execute("test/data/*.txt")
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,155 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. test_helper])) unless defined?(Juicer)
2
+
3
+ class TestMergeCommand < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @io = StringIO.new
7
+ @merge = Juicer::Command::Merge.new(Logger.new(@io))
8
+
9
+ Juicer::Test::FileSetup.new.create
10
+
11
+ ["a.min.css", "not-ok.min.js"].each { |f| File.delete(path(f)) if File.exists?(path(f)) }
12
+
13
+ Juicer.home = path(".juicer")
14
+ installer = Juicer::Install::YuiCompressorInstaller.new(Juicer.home)
15
+ installer.install("2.4.2") unless installer.installed?("2.4.2")
16
+
17
+ installer = Juicer::Install::JSLintInstaller.new(Juicer.home)
18
+ installer.install unless installer.installed?
19
+ end
20
+
21
+ def test_get_minifier_from_nil_minifyer
22
+ @merge.instance_eval { @minifyer = nil }
23
+
24
+ Juicer::Command::Merge.publicize_methods do
25
+ assert_nil @merge.minifyer
26
+ end
27
+ end
28
+
29
+ def test_get_minifier_from_empty_minifyer
30
+ @merge.instance_eval { @minifyer = "" }
31
+
32
+ Juicer::Command::Merge.publicize_methods do
33
+ assert_nil @merge.minifyer
34
+ end
35
+ end
36
+
37
+ def test_get_minifier_from_none_minifyer
38
+ Juicer::Command::Merge.publicize_methods do
39
+ @merge.instance_eval { @minifyer = "none" }
40
+ assert_nil @merge.minifyer
41
+
42
+ @merge.instance_eval { @minifyer = "None" }
43
+ assert_nil @merge.minifyer
44
+
45
+ @merge.instance_eval { @minifyer = "NONE" }
46
+ assert_nil @merge.minifyer
47
+ end
48
+ end
49
+
50
+ def test_get_minifyer
51
+ Juicer::Command::Merge.publicize_methods do
52
+ assert @merge.minifyer.class == Juicer::Minifyer::YuiCompressor
53
+ end
54
+ end
55
+
56
+ def test_output_name_from_file_should_have_suffix_prepended_with_min
57
+ Juicer::Command::Merge.publicize_methods do
58
+ assert_equal "test.min.js", @merge.output("test.js")
59
+ end
60
+ end
61
+
62
+ def test_output_name_from_nothing_should_be_timestamp
63
+ Juicer::Command::Merge.publicize_methods do
64
+ assert_match(/\d{10}\.min\.tmp/, @merge.output)
65
+ end
66
+ end
67
+
68
+ def test_output_name_instance_value
69
+ Juicer::Command::Merge.publicize_methods do
70
+ @merge.instance_eval { @output = "output.css" }
71
+ assert_equal "output.css", @merge.output
72
+ assert_equal "output.css", @merge.output("bleh.css")
73
+ end
74
+ end
75
+
76
+ def test_merger_from_valid_type
77
+ Juicer::Command::Merge.publicize_methods do
78
+ assert_equal Juicer::Merger::JavaScriptMerger, @merge.merger("bleh.js")
79
+ end
80
+ end
81
+
82
+ def test_merger_from_invalid_type
83
+ Juicer::Command::Merge.publicize_methods do
84
+ assert_equal Juicer::Merger::JavaScriptMerger, @merge.merger("bleh.txt")
85
+ assert_match(/Unknown type 'txt', defaulting to 'js'/, @io.string)
86
+ end
87
+ end
88
+
89
+ def test_merger_from_preset_type
90
+ Juicer::Command::Merge.publicize_methods do
91
+ @merge.instance_eval { @type = "css" }
92
+ assert_equal Juicer::Merger::StylesheetMerger, @merge.merger
93
+ assert_equal Juicer::Merger::StylesheetMerger, @merge.merger("bleh.txt")
94
+ end
95
+ end
96
+
97
+ def test_merge_without_input
98
+ assert_raise SystemExit do
99
+ @merge.execute([])
100
+ end
101
+ end
102
+
103
+ def test_merge_with_bogus_input
104
+ assert_raise SystemExit do
105
+ @merge.execute(["*.css", "bleh/*.js"])
106
+ end
107
+ end
108
+
109
+ def test_unable_to_merge_on_existing_file
110
+ assert_raise SystemExit do
111
+ @merge.instance_eval { @output = path("a.css") }
112
+ @merge.execute(path("a.css"))
113
+ assert_match(/Run again with --force to overwrite/, @io.string)
114
+ end
115
+ end
116
+
117
+ def test_update_output_when_force
118
+ assert_nothing_raised do
119
+ @merge.instance_eval { @force = true }
120
+ @merge.execute(path("a.css"))
121
+ end
122
+ end
123
+
124
+ def test_merge_successful
125
+ begin
126
+ @merge.instance_eval { @output = path("a.min.css") }
127
+ assert @merge.execute(path("a1.css"))
128
+ assert_equal "h2{font-size:10px;}html{background:red;}h1{font-size:12px;}body{width:800px;}", IO.read(path("a.min.css"))
129
+ rescue Test::Unit::AssertionFailedError => err
130
+ raise err
131
+ rescue Exception => err
132
+ puts err.message
133
+ end
134
+ end
135
+
136
+ def test_fail_when_syntax_no_good
137
+ assert_raise SystemExit do
138
+ @merge.execute(path("not-ok.js"))
139
+ assert_match(/Problems were detected during verification/, @io.string)
140
+ assert_no_match(/Ignoring detected problems/, @io.string)
141
+ end
142
+ end
143
+
144
+ def test_ignore_problems
145
+ @merge.instance_eval { @ignore = true }
146
+
147
+ assert_nothing_raised do
148
+ @merge.execute(path("not-ok.js"))
149
+ assert_match(/Problems were detected during verification/, @io.string)
150
+ assert_match(/Ignoring detected problems/, @io.string)
151
+ end
152
+ end
153
+
154
+
155
+ end