ktheory-juicer 1.0.0.ktheory1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. data/History.txt +30 -0
  2. data/Manifest.txt +58 -0
  3. data/Rakefile +96 -0
  4. data/Readme.rdoc +312 -0
  5. data/VERSION +1 -0
  6. data/bin/juicer +8 -0
  7. data/lib/juicer.rb +70 -0
  8. data/lib/juicer/asset/path.rb +275 -0
  9. data/lib/juicer/asset/path_resolver.rb +79 -0
  10. data/lib/juicer/binary.rb +171 -0
  11. data/lib/juicer/cache_buster.rb +130 -0
  12. data/lib/juicer/chainable.rb +106 -0
  13. data/lib/juicer/cli.rb +56 -0
  14. data/lib/juicer/command/install.rb +61 -0
  15. data/lib/juicer/command/list.rb +57 -0
  16. data/lib/juicer/command/merge.rb +205 -0
  17. data/lib/juicer/command/util.rb +32 -0
  18. data/lib/juicer/command/verify.rb +60 -0
  19. data/lib/juicer/css_cache_buster.rb +80 -0
  20. data/lib/juicer/datafy/datafy.rb +20 -0
  21. data/lib/juicer/dependency_resolver/css_dependency_resolver.rb +29 -0
  22. data/lib/juicer/dependency_resolver/dependency_resolver.rb +101 -0
  23. data/lib/juicer/dependency_resolver/javascript_dependency_resolver.rb +23 -0
  24. data/lib/juicer/ext/logger.rb +5 -0
  25. data/lib/juicer/ext/string.rb +47 -0
  26. data/lib/juicer/ext/symbol.rb +15 -0
  27. data/lib/juicer/image_embed.rb +136 -0
  28. data/lib/juicer/install/base.rb +186 -0
  29. data/lib/juicer/install/closure_compiler_installer.rb +69 -0
  30. data/lib/juicer/install/jslint_installer.rb +51 -0
  31. data/lib/juicer/install/rhino_installer.rb +53 -0
  32. data/lib/juicer/install/yui_compressor_installer.rb +67 -0
  33. data/lib/juicer/jslint.rb +90 -0
  34. data/lib/juicer/merger/base.rb +74 -0
  35. data/lib/juicer/merger/javascript_merger.rb +29 -0
  36. data/lib/juicer/merger/stylesheet_merger.rb +110 -0
  37. data/lib/juicer/minifyer/closure_compiler.rb +90 -0
  38. data/lib/juicer/minifyer/java_base.rb +77 -0
  39. data/lib/juicer/minifyer/yui_compressor.rb +96 -0
  40. data/test/bin/jslint-1.0.js +523 -0
  41. data/test/bin/jslint.js +523 -0
  42. data/test/bin/rhino1_7R1.zip +0 -0
  43. data/test/bin/rhino1_7R2-RC1.jar +0 -0
  44. data/test/bin/rhino1_7R2-RC1.zip +0 -0
  45. data/test/bin/yuicompressor +0 -0
  46. data/test/bin/yuicompressor-2.3.5.zip +0 -0
  47. data/test/bin/yuicompressor-2.4.2.jar +0 -0
  48. data/test/bin/yuicompressor-2.4.2.zip +0 -0
  49. data/test/data/Changelog.txt +10 -0
  50. data/test/data/a.css +3 -0
  51. data/test/data/a.js +5 -0
  52. data/test/data/a1.css +5 -0
  53. data/test/data/b.css +1 -0
  54. data/test/data/b.js +5 -0
  55. data/test/data/b1.css +5 -0
  56. data/test/data/c1.css +3 -0
  57. data/test/data/css/2.gif +1 -0
  58. data/test/data/css/test.css +11 -0
  59. data/test/data/css/test2.css +1 -0
  60. data/test/data/d1.css +3 -0
  61. data/test/data/images/1.png +1 -0
  62. data/test/data/my_app.js +2 -0
  63. data/test/data/not-ok.js +2 -0
  64. data/test/data/ok.js +3 -0
  65. data/test/data/path_test.css +5 -0
  66. data/test/data/path_test2.css +14 -0
  67. data/test/data/pkg/module/moda.js +2 -0
  68. data/test/data/pkg/module/modb.js +3 -0
  69. data/test/data/pkg/pkg.js +1 -0
  70. data/test/test_helper.rb +169 -0
  71. data/test/unit/juicer/asset/path_resolver_test.rb +76 -0
  72. data/test/unit/juicer/asset/path_test.rb +370 -0
  73. data/test/unit/juicer/cache_buster_test.rb +104 -0
  74. data/test/unit/juicer/chainable_test.rb +94 -0
  75. data/test/unit/juicer/command/install_test.rb +58 -0
  76. data/test/unit/juicer/command/list_test.rb +81 -0
  77. data/test/unit/juicer/command/merge_test.rb +162 -0
  78. data/test/unit/juicer/command/util_test.rb +58 -0
  79. data/test/unit/juicer/command/verify_test.rb +48 -0
  80. data/test/unit/juicer/css_cache_buster_test.rb +71 -0
  81. data/test/unit/juicer/datafy_test.rb +37 -0
  82. data/test/unit/juicer/dependency_resolver/css_dependency_resolver_test.rb +36 -0
  83. data/test/unit/juicer/dependency_resolver/javascript_dependency_resolver_test.rb +50 -0
  84. data/test/unit/juicer/ext/string_test.rb +59 -0
  85. data/test/unit/juicer/ext/symbol_test.rb +27 -0
  86. data/test/unit/juicer/image_embed_test.rb +271 -0
  87. data/test/unit/juicer/install/installer_base_test.rb +214 -0
  88. data/test/unit/juicer/install/jslint_installer_test.rb +54 -0
  89. data/test/unit/juicer/install/rhino_installer_test.rb +57 -0
  90. data/test/unit/juicer/install/yui_compressor_test.rb +56 -0
  91. data/test/unit/juicer/jslint_test.rb +60 -0
  92. data/test/unit/juicer/merger/base_test.rb +122 -0
  93. data/test/unit/juicer/merger/javascript_merger_test.rb +74 -0
  94. data/test/unit/juicer/merger/stylesheet_merger_test.rb +180 -0
  95. data/test/unit/juicer/minifyer/closure_compressor_test.rb +107 -0
  96. data/test/unit/juicer/minifyer/yui_compressor_test.rb +116 -0
  97. data/test/unit/juicer_test.rb +1 -0
  98. metadata +265 -0
@@ -0,0 +1,214 @@
1
+ require "test_helper"
2
+
3
+ module Juicer
4
+ module Install
5
+ class SomeMagicInstaller < Juicer::Install::Base
6
+ def install(version = nil)
7
+ version ||= "1.0.0"
8
+ ver = super(version)
9
+ File.open(File.join(@install_dir, path, "bin", ver + ".app"), "w") do |file|
10
+ file.puts version
11
+ end
12
+
13
+ version
14
+ end
15
+
16
+ def uninstall(version = "1.0.0")
17
+ super(version) do |path, version|
18
+ File.delete(File.join(path, "bin", version + ".app"))
19
+ end
20
+ end
21
+ end
22
+
23
+ class SomeOtherInstaller < Juicer::Install::SomeMagicInstaller
24
+ def install(version = nil)
25
+ version ||= "1.0.0"
26
+ super(version)
27
+ end
28
+
29
+ def latest
30
+ "1.0.0"
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ class TestInstallerBase < Test::Unit::TestCase
37
+ def initialize(*args)
38
+ super
39
+ @juicer_home = File.expand_path(File.join("test", "data", ".juicer"))
40
+ end
41
+
42
+ def setup
43
+ FileUtils.rm_rf @juicer_home
44
+ @installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
45
+ end
46
+
47
+ context "installation directory" do
48
+ should "should be Juicer.home by default" do
49
+ installer = Juicer::Install::SomeMagicInstaller.new
50
+ assert_equal Juicer.home, installer.install_dir
51
+ end
52
+
53
+ should "override installation directory" do
54
+ installer = Juicer::Install::SomeMagicInstaller.new("/home/baluba")
55
+ assert_equal "/home/baluba", installer.install_dir
56
+ end
57
+ end
58
+
59
+ context "latest" do
60
+ should "raise NotImplementedError" do
61
+ assert_raise NotImplementedError do
62
+ @installer.latest
63
+ end
64
+ end
65
+ end
66
+
67
+ context "paths and name" do
68
+ should "reflect installer class name" do
69
+ assert_equal "lib/some_magic", @installer.path
70
+ end
71
+
72
+ should "reflect installer class name for bin path" do
73
+ assert_equal "lib/some_magic/bin", @installer.bin_path
74
+ end
75
+
76
+ should "reflect class name in human name" do
77
+ assert_equal "Some Magic", @installer.name
78
+ end
79
+ end
80
+
81
+ context "already installed module" do
82
+ should "report as installed" do
83
+ assert !@installer.installed?("x.y.z")
84
+ @installer.install("x.y.z")
85
+ assert @installer.installed?("x.y.z")
86
+ end
87
+
88
+ should "fail re-installation" do
89
+ @installer.install("1.0.0")
90
+
91
+ assert_raise RuntimeError do
92
+ @installer.install("1.0.0")
93
+ end
94
+ end
95
+ end
96
+
97
+ context "installation" do
98
+ should "create bin and release folders" do
99
+ assert_equal "1.0.0", @installer.install("1.0.0")
100
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/bin"))
101
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
102
+ end
103
+ end
104
+
105
+ context "uninstall" do
106
+ should "remove library path when only version is uninstalled" do
107
+ @installer.install("1.0.0")
108
+ @installer.uninstall("1.0.0")
109
+ assert !File.exists?(File.join(@juicer_home, "lib/some_magic"))
110
+ end
111
+
112
+ should "keep other versions" do
113
+ @installer.install("1.0.0")
114
+ @installer.install("1.0.1")
115
+ @installer.uninstall("1.0.0")
116
+ assert !File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
117
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic"))
118
+ end
119
+ end
120
+
121
+ context "download" do
122
+ # TODO: Don't download
123
+ should "cache files" do
124
+ File.expects(:delete).at_most(0)
125
+ @installer.download("http://www.julienlecomte.net/yuicompressor/")
126
+ filename = File.join(@juicer_home, "download/some_magic/yuicompressor")
127
+ assert File.exists?(filename)
128
+ @installer.download("http://www.julienlecomte.net/yuicompressor/")
129
+ end
130
+
131
+ should "redownload cached files when forced" do
132
+ File.expects(:delete).at_most(1)
133
+ @installer.download("http://www.julienlecomte.net/yuicompressor/")
134
+ filename = File.join(@juicer_home, "download/some_magic/yuicompressor")
135
+ assert File.exists?(filename)
136
+ File.expects(:open).at_most(1)
137
+ @installer.download("http://www.julienlecomte.net/yuicompressor/", true)
138
+ end
139
+ end
140
+
141
+ context "installer dependencies" do
142
+ should "not return true from installer when missing dependencies" do
143
+ @installer.install
144
+
145
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
146
+ assert !installer.installed?("1.0.1"), "Installer should be installed"
147
+
148
+ installer.dependency Juicer::Install::SomeOtherInstaller
149
+ assert !installer.installed?("1.0.1"), "Installer should not report as being installed when missing dependencies"
150
+ end
151
+
152
+ should "install single dependency" do
153
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
154
+ installer.dependency Juicer::Install::SomeOtherInstaller
155
+ installer.install "1.0.0"
156
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
157
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
158
+ end
159
+
160
+ should "not raise error when they exist" do
161
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
162
+ installer.dependency Juicer::Install::SomeOtherInstaller
163
+
164
+ dep = Juicer::Install::SomeOtherInstaller.new
165
+ dep.install unless dep.installed?
166
+
167
+ assert_nothing_raised do
168
+ installer.install "1.0.0"
169
+ end
170
+ end
171
+
172
+ should "get dependency from single symbol" do
173
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
174
+ installer.dependency :some_other
175
+ installer.install "1.0.0"
176
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
177
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
178
+ end
179
+
180
+ should "get dependency from single string" do
181
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
182
+ installer.dependency "some_other"
183
+ installer.install "1.0.0"
184
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
185
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
186
+ end
187
+
188
+ should "support multiple dependencies" do
189
+ installer = Juicer::Install::SomeMagicInstaller.new(@juicer_home)
190
+ installer.dependency :some_other
191
+ installer.dependency :some_other, "2.0.4"
192
+ installer.dependency :some_other, "3.0.5"
193
+ installer.install "1.0.0"
194
+ assert File.exists?(File.join(@juicer_home, "lib/some_magic/1.0.0"))
195
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/1.0.0"))
196
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/2.0.4"))
197
+ assert File.exists?(File.join(@juicer_home, "lib/some_other/3.0.5"))
198
+ end
199
+ end
200
+
201
+ context "resolving class" do
202
+ should "accept class input" do
203
+ assert_equal Juicer::Install::SomeMagicInstaller, Juicer::Install.get(Juicer::Install::SomeMagicInstaller)
204
+ end
205
+
206
+ should "accept symbol input" do
207
+ assert_equal Juicer::Install::SomeMagicInstaller, Juicer::Install.get(:some_magic)
208
+ end
209
+
210
+ should "accept string input" do
211
+ assert_equal Juicer::Install::SomeMagicInstaller, Juicer::Install.get("some_magic")
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,54 @@
1
+ require "test_helper"
2
+
3
+ class TestJsLintInstaller < Test::Unit::TestCase
4
+ def setup
5
+ @installer = Juicer::Install::JSLintInstaller.new(path(".juicer"))
6
+ end
7
+
8
+ def teardown
9
+ FileUtils.rm_rf(path(".juicer/lib")) if File.exists?(path(".juicer/lib"))
10
+ end
11
+
12
+ def test_install_should_download_js
13
+ @installer.install unless @installer.installed?
14
+
15
+ assert File.exists?(path(".juicer"))
16
+ assert File.exists?(path(".juicer/lib"))
17
+ assert File.exists?(path(".juicer/lib/jslint"))
18
+ assert File.exists?(path(".juicer/lib/jslint/bin"))
19
+ assert_match(/jslint-\d\.\d\.js/, Dir.glob(path(".juicer/lib/jslint/bin/*"))[0])
20
+ end
21
+
22
+ def test_uninstall_should_remove_all_files_and_empty_directories
23
+ @installer.install
24
+ assert File.exists?(path(".juicer/lib/jslint/bin"))
25
+ assert_equal 1, Dir.glob(path(".juicer/lib/jslint/**/*")).find_all { |f| File.file?(f) }.length
26
+
27
+ @installer.uninstall
28
+ assert !File.exists?(path(".juicer/lib/jslint"))
29
+ end
30
+
31
+ def test_install_specific_version
32
+ @installer.install("1.0")
33
+
34
+ assert File.exists?(path(".juicer/lib/jslint/bin"))
35
+ assert_equal "jslint-1.0.js", File.basename(Dir.glob(path(".juicer/lib/jslint/bin/*"))[0])
36
+ end
37
+
38
+ def test_install_should_install_rhino_also
39
+ assert !File.exists?(path(".juicer/lib/rhino"))
40
+ @installer.install
41
+ assert File.exists?(path(".juicer/lib/rhino"))
42
+ end
43
+
44
+ def test_uninstall_should_leave_directories_when_other_versions_are_installed
45
+ @installer.install
46
+ @installer.install("1.1")
47
+ assert File.exists?(path(".juicer/lib/jslint/bin"))
48
+ assert_equal 2, Dir.glob(path(".juicer/lib/jslint/**/*")).find_all { |f| File.file?(f) }.length
49
+
50
+ @installer.uninstall("1.1")
51
+ assert File.exists?(path(".juicer/lib/jslint"))
52
+ assert_equal 1, Dir.glob(path(".juicer/lib/jslint/**/*")).find_all { |f| File.file?(f) }.length
53
+ end
54
+ end
@@ -0,0 +1,57 @@
1
+ require "test_helper"
2
+
3
+ class TestRhinoInstaller < Test::Unit::TestCase
4
+ def setup
5
+ @installer = Juicer::Install::RhinoInstaller.new(path(".juicer"))
6
+ end
7
+
8
+ def teardown
9
+ FileUtils.rm_rf(path(".juicer/lib")) if File.exists?(path(".juicer/lib"))
10
+ end
11
+
12
+ def test_check_installation
13
+ FileUtils.rm_rf(path(".juicer/lib")) if File.exists?(path(".juicer/lib"))
14
+ assert !@installer.installed?
15
+ end
16
+
17
+ def test_install_should_download_jar_and_license
18
+ @installer.install
19
+
20
+ assert File.exists?(path(".juicer"))
21
+ assert File.exists?(path(".juicer/lib"))
22
+ assert File.exists?(path(".juicer/lib/rhino"))
23
+ assert File.exists?(path(".juicer/lib/rhino/bin"))
24
+ assert_match(/rhino\d\_\d[^\.]*\.jar/, Dir.glob(path(".juicer/lib/rhino/bin/*"))[0])
25
+
26
+ files = Dir.glob(path(".juicer/lib/rhino/*_*/**/*"))
27
+ assert_equal ["LICENSE.txt"], files.collect { |file| file.split("/").pop }.sort
28
+ end
29
+
30
+ def test_uninstall_should_remove_all_files_and_empty_directories
31
+ @installer.install
32
+ assert File.exists?(path(".juicer/lib/rhino/bin"))
33
+ assert_equal 2, Dir.glob(path(".juicer/lib/rhino/**/*")).find_all { |f| File.file?(f) }.length
34
+
35
+ @installer.uninstall
36
+ assert !File.exists?(path(".juicer/lib/rhino"))
37
+ end
38
+
39
+ def test_install_specific_version
40
+ @installer.install("1.7R2-RC1")
41
+
42
+ assert File.exists?(path(".juicer/lib/rhino/bin"))
43
+ assert File.exists?(path(".juicer/lib/rhino/1_7R2-RC1"))
44
+ assert_equal "rhino1_7R2-RC1.jar", File.basename(Dir.glob(path(".juicer/lib/rhino/bin/*"))[0])
45
+ end
46
+
47
+ def test_uninstall_should_leave_directories_when_other_versions_are_installed
48
+ @installer.install
49
+ @installer.install("1.7R1")
50
+ assert File.exists?(path(".juicer/lib/rhino/bin"))
51
+ assert_equal 3, Dir.glob(path(".juicer/lib/rhino/**/*")).find_all { |f| File.file?(f) }.length
52
+
53
+ @installer.uninstall("1.7R2-RC1")
54
+ assert File.exists?(path(".juicer/lib/rhino"))
55
+ assert_equal 1, Dir.glob(path(".juicer/lib/rhino/**/*")).find_all { |f| File.file?(f) }.length
56
+ end
57
+ end
@@ -0,0 +1,56 @@
1
+ require "test_helper"
2
+
3
+ class TestYuiCompressorInstall < Test::Unit::TestCase
4
+ def setup
5
+ @installer = Juicer::Install::YuiCompressorInstaller.new(path(".juicer"))
6
+ end
7
+
8
+ def teardown
9
+ FileUtils.rm_rf(path(".juicer/lib")) if File.exists?(path(".juicer/lib"))
10
+ end
11
+
12
+ def test_check_installation
13
+ assert !@installer.installed?
14
+ end
15
+
16
+ def test_install_should_download_jar_and_readme
17
+ @installer.install
18
+
19
+ assert File.exists?(path(".juicer"))
20
+ assert File.exists?(path(".juicer/lib"))
21
+ assert File.exists?(path(".juicer/lib/yui_compressor"))
22
+ assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
23
+ assert_match(/yuicompressor-\d\.\d\.\d\.jar/, Dir.glob(path(".juicer/lib/yui_compressor/bin/*"))[0])
24
+
25
+ files = Dir.glob(path(".juicer/lib/yui_compressor/*.*.*/**/*"))
26
+ assert_equal ["CHANGELOG", "README"], files.collect { |file| file.split("/").pop }.sort
27
+ end
28
+
29
+ def test_uninstall_should_remove_all_files_and_empty_directories
30
+ @installer.install
31
+ assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
32
+ assert_equal 3, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
33
+
34
+ @installer.uninstall
35
+ assert !File.exists?(path(".juicer/lib/yui_compressor"))
36
+ end
37
+
38
+ # def test_install_specific_version
39
+ # @installer.install("2.3.5")
40
+
41
+ # assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
42
+ # assert File.exists?(path(".juicer/lib/yui_compressor/2.3.5"))
43
+ # assert_equal "yuicompressor-2.3.5.jar", File.basename(Dir.glob(path(".juicer/lib/yui_compressor/bin/*"))[0])
44
+ # end
45
+
46
+ # def test_uninstall_should_leave_directories_when_other_versions_are_installed
47
+ # @installer.install
48
+ # @installer.install("2.3.5")
49
+ # assert File.exists?(path(".juicer/lib/yui_compressor/bin"))
50
+ # assert_equal 6, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
51
+
52
+ # @installer.uninstall("2.3.5")
53
+ # assert File.exists?(path(".juicer/lib/yui_compressor"))
54
+ # assert_equal 3, Dir.glob(path(".juicer/lib/yui_compressor/**/*")).find_all { |f| File.file?(f) }.length
55
+ # end
56
+ end
@@ -0,0 +1,60 @@
1
+ require "test_helper"
2
+
3
+ class TestJsLint < Test::Unit::TestCase
4
+ def initialize(*args)
5
+ @path = File.expand_path(path("../bin"))
6
+ @file = path("jsltest.js")
7
+ super
8
+ end
9
+
10
+ def setup
11
+ FileUtils.mkdir(path("")) unless File.exists?(path(""))
12
+ File.open(@file, "w") { |f| f.puts "" }
13
+ end
14
+
15
+ def teardown
16
+ File.delete(@file)
17
+ end
18
+
19
+ context "verifying file with jslint" do
20
+ should "shell out to rhino/jslint" do
21
+ jslint = Juicer::JsLint.new(:bin_path => @path)
22
+ jslint.expects(:execute).with("-jar \"#{@path}/rhino1_7R2-RC1.jar\" \"#{@path}/jslint-1.0.js\" \"#{@file}\"").returns("jslint: No problems")
23
+
24
+ assert jslint.check(@file).ok?
25
+ end
26
+ end
27
+
28
+ context "jslint report returns" do
29
+ should "be a report object for valid files" do
30
+ jslint = Juicer::JsLint.new(:bin_path => @path)
31
+ jslint.expects(:execute).returns("jslint: No problems")
32
+
33
+ assert_equal Juicer::JsLint::Report, jslint.check(@file).class
34
+ end
35
+
36
+ should "be a report object for invalid files" do
37
+ jslint = Juicer::JsLint.new(:bin_path => @path)
38
+ jslint.expects(:execute).returns("Wrong use of semicolon\nWrong blabla")
39
+
40
+ assert_equal Juicer::JsLint::Report, jslint.check(path("not-ok.js")).class
41
+ end
42
+ end
43
+
44
+ context "errors" do
45
+ should "be available on report" do
46
+ jslint = Juicer::JsLint.new(:bin_path => @path)
47
+ jslint.expects(:execute).returns("Wrong use of semicolon\nWrong blabla\nWrong use of semicolon\nWrong blabla")
48
+
49
+ assert_equal 2, jslint.check(@file).errors.length
50
+ end
51
+
52
+ should "be error objects" do
53
+ jslint = Juicer::JsLint.new(:bin_path => @path)
54
+ jslint.expects(:execute).returns("Wrong use of semicolon\nWrong blabla")
55
+
56
+ error = jslint.check(@file).errors.first
57
+ assert_equal Juicer::JsLint::Error, error.class
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,122 @@
1
+ require "test_helper"
2
+
3
+ class TestMergerBase < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @file_merger = Juicer::Merger::Base.new
7
+ Juicer::Test::FileSetup.new.create
8
+ end
9
+
10
+ def teardown
11
+ file = path('test_out.css')
12
+ File.delete(file) if File.exists?(file)
13
+ end
14
+
15
+ def test_constructor
16
+ files = ['a.css', 'b.css'].collect { |file| path(file) }
17
+ file_merger = Juicer::Merger::Base.new files
18
+ assert_equal 2, file_merger.files.length
19
+ end
20
+
21
+ def test_append_duplicate_files
22
+ @file_merger.append ['a.css', 'b.css'].collect { |file| path(file) }
23
+ assert_equal 2, @file_merger.files.length,
24
+ "b.css should not be included twice even when a.css imports it and it is manually added"
25
+ end
26
+
27
+ def test_append_duplicate
28
+ @file_merger.append ['a.css', 'b.css'].collect { |file| path(file) }
29
+ assert_equal 2, @file_merger.files.length
30
+
31
+ @file_merger.append path('a.css')
32
+ assert_equal 2, @file_merger.files.length
33
+
34
+ @file_merger.append path('version.txt')
35
+ assert_equal 3, @file_merger.files.length
36
+ end
37
+
38
+ def test_append_alias
39
+ @file_merger << ['a.css', 'b.css'].collect { |file| path(file) }
40
+ assert_equal 2, @file_merger.files.length
41
+ end
42
+
43
+ def test_save_to_stream
44
+ a_css = path('a.css')
45
+ a_css_contents = IO.read(a_css) + "\n"
46
+ ios = StringIO.new
47
+ @file_merger << a_css
48
+ @file_merger.save ios
49
+ assert_equal a_css_contents, ios.string
50
+ end
51
+
52
+ def test_save_to_file
53
+ a_css = path('a.css')
54
+ output_file = path('test_out.css')
55
+ @file_merger << a_css
56
+ @file_merger.save(output_file)
57
+
58
+ assert_equal IO.read(a_css) + "\n", IO.read(output_file)
59
+ end
60
+
61
+ def test_save_merged_to_stream
62
+ a_css = path('a.css')
63
+ b_css = path('b.css')
64
+ ios = StringIO.new
65
+
66
+ @file_merger << a_css
67
+ @file_merger << b_css
68
+ @file_merger.save(ios)
69
+
70
+ assert_equal "#{IO.read(a_css)}\n#{IO.read(b_css)}\n", ios.string
71
+ end
72
+
73
+ def test_save_merged_to_file
74
+ a_css = path('a.css')
75
+ b_css = path('b.css')
76
+ a_contents = IO.read(a_css) + "\n"
77
+ b_contents = IO.read(b_css) + "\n"
78
+ output_file = path('test_out.css')
79
+
80
+ @file_merger << a_css
81
+ @file_merger << b_css
82
+ @file_merger.save(output_file)
83
+
84
+ assert_equal "#{IO.read(a_css)}\n#{IO.read(b_css)}\n", IO.read(output_file)
85
+ end
86
+
87
+ def test_resolve_dependencies
88
+ Juicer::Merger::Base.publicize_methods do
89
+ @file_merger.dependency_resolver = MockImportResolver.new
90
+
91
+ @file_merger.resolve_dependencies('a.css')
92
+ assert_equal 1, @file_merger.files.length
93
+
94
+ @file_merger.resolve_dependencies('a.css')
95
+ assert_equal 1, @file_merger.files.length
96
+ end
97
+ end
98
+
99
+ def test_merge
100
+ Juicer::Merger::Base.publicize_methods do
101
+ a_content = <<EOF
102
+ @import 'b.css';
103
+
104
+ /* Dette er a.css */
105
+
106
+ EOF
107
+
108
+ content = @file_merger.merge(path('a.css'))
109
+ assert_equal a_content, content
110
+ end
111
+ end
112
+
113
+ def test_attributes
114
+ assert_not_nil @file_merger.files
115
+ end
116
+ end
117
+
118
+ class MockImportResolver
119
+ def resolve(file)
120
+ [file]
121
+ end
122
+ end