cjohansen-juicer 0.2.0 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. data/History.txt +17 -5
  2. data/Manifest.txt +33 -15
  3. data/Rakefile +22 -1
  4. data/Readme.rdoc +68 -32
  5. data/bin/juicer +1 -0
  6. data/lib/juicer.rb +26 -1
  7. data/lib/juicer/binary.rb +173 -0
  8. data/lib/juicer/cache_buster.rb +45 -0
  9. data/lib/juicer/chainable.rb +1 -0
  10. data/lib/juicer/cli.rb +13 -8
  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 +130 -31
  14. data/lib/juicer/command/util.rb +32 -0
  15. data/lib/juicer/command/verify.rb +60 -0
  16. data/lib/juicer/core.rb +61 -0
  17. data/lib/juicer/css_cache_buster.rb +106 -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 -72
  24. data/lib/juicer/merger/dependency_resolver.rb +34 -16
  25. data/lib/juicer/merger/stylesheet_merger.rb +71 -1
  26. data/lib/juicer/minifyer/yui_compressor.rb +20 -43
  27. data/tasks/test/setup.rake +35 -0
  28. data/test/juicer/command/test_install.rb +53 -0
  29. data/test/juicer/command/test_list.rb +69 -0
  30. data/test/juicer/command/test_merge.rb +160 -0
  31. data/test/juicer/command/test_util.rb +54 -0
  32. data/test/juicer/command/test_verify.rb +33 -0
  33. data/test/juicer/install/test_installer_base.rb +195 -0
  34. data/test/juicer/install/test_jslint_installer.rb +54 -0
  35. data/test/juicer/install/test_rhino_installer.rb +57 -0
  36. data/test/juicer/install/test_yui_compressor_installer.rb +56 -0
  37. data/test/juicer/merger/test_base.rb +2 -3
  38. data/test/juicer/merger/test_css_dependency_resolver.rb +8 -4
  39. data/test/juicer/merger/test_javascript_dependency_resolver.rb +6 -7
  40. data/test/juicer/merger/test_javascript_merger.rb +1 -2
  41. data/test/juicer/merger/test_stylesheet_merger.rb +118 -2
  42. data/test/juicer/minifyer/test_yui_compressor.rb +109 -29
  43. data/test/juicer/test_cache_buster.rb +58 -0
  44. data/test/juicer/test_chainable.rb +7 -0
  45. data/test/juicer/test_core.rb +47 -0
  46. data/test/juicer/test_css_cache_buster.rb +91 -0
  47. data/test/juicer/test_jslint.rb +33 -0
  48. data/test/test_helper.rb +65 -196
  49. metadata +77 -26
  50. data/.gitignore +0 -2
  51. data/juicer.gemspec +0 -38
  52. data/lib/juicer/minifyer/compressor.rb +0 -125
  53. data/test/juicer/minifyer/test_compressor.rb +0 -36
@@ -4,8 +4,7 @@ class TestJavaScriptDependencyResolver < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @resolver = Juicer::Merger::JavaScriptDependencyResolver.new
7
- @file_setup = Juicer::Test::FileSetup.new($DATA_DIR)
8
- @file_setup.create!
7
+ Juicer::Test::FileSetup.new.create
9
8
  end
10
9
 
11
10
  def test_init
@@ -13,24 +12,24 @@ class TestJavaScriptDependencyResolver < Test::Unit::TestCase
13
12
  end
14
13
 
15
14
  def test_resolve
16
- b_file = File.expand_path(path('b.js'))
17
- a_file = File.expand_path(path('a.js'))
15
+ b_file = path('b.js')
16
+ a_file = path('a.js')
18
17
 
19
- files = @resolver.resolve(path('a.js')) do |file|
18
+ files = @resolver.resolve(a_file) do |file|
20
19
  assert b_file == file || a_file == file, file
21
20
  b_file != file
22
21
  end
23
22
 
24
23
  assert_equal [a_file], files
25
24
 
26
- files = @resolver.resolve(path('a.js')) do |file|
25
+ files = @resolver.resolve(a_file) do |file|
27
26
  assert b_file == file || a_file == file
28
27
  true
29
28
  end
30
29
 
31
30
  assert_equal [a_file, b_file], files.sort
32
31
 
33
- files = @resolver.resolve(path('b.js')) do |file|
32
+ files = @resolver.resolve(b_file) do |file|
34
33
  assert b_file == file || a_file == file
35
34
  true
36
35
  end
@@ -4,8 +4,7 @@ class TestJavaScriptMerger < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @file_merger = Juicer::Merger::JavaScriptMerger.new
7
- @file_setup = Juicer::Test::FileSetup.new($DATA_DIR)
8
- @file_setup.create!
7
+ Juicer::Test::FileSetup.new.create
9
8
  end
10
9
 
11
10
  def teardown
@@ -4,8 +4,8 @@ class TestStylesheetMerger < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @file_merger = Juicer::Merger::StylesheetMerger.new
7
- @file_setup = Juicer::Test::FileSetup.new($DATA_DIR)
8
- @file_setup.create!
7
+ Juicer::Test::FileSetup.new.create
8
+ Dir.chdir path("")
9
9
  end
10
10
 
11
11
  def teardown
@@ -59,4 +59,120 @@ EOF
59
59
 
60
60
  assert_equal merged, IO.read(output_file)
61
61
  end
62
+
63
+ def test_included_files_should_have_referenced_relative_urls_rereferenced
64
+ @file_merger << path("path_test.css")
65
+ ios = StringIO.new
66
+ @file_merger.save(ios)
67
+ files = ios.string.scan(/url\(([^\)]*)\)/).collect { |f| f.first }.uniq.sort
68
+
69
+ assert_equal "a1.css::css/2.gif::images/1.png", files.join("::")
70
+ end
71
+
72
+ def test_resolve_path_should_leave_absolute_urls
73
+ merger = Juicer::Merger::StylesheetMerger.new
74
+ url = "/some/url"
75
+
76
+ Juicer::Merger::StylesheetMerger.publicize_methods do
77
+ assert_equal url, merger.resolve_path(url, nil)
78
+ end
79
+ end
80
+
81
+ def test_resolve_path_error_when_relative_missing_web_root
82
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
83
+
84
+ Juicer::Merger::StylesheetMerger.publicize_methods do
85
+ assert_raise ArgumentError do
86
+ merger.resolve_path("/some/url", nil)
87
+ end
88
+ end
89
+ end
90
+
91
+ def test_resolve_path_should_make_absolute_urls_relative
92
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :web_root => "/home/usr"
93
+
94
+ Juicer::Merger::StylesheetMerger.publicize_methods do
95
+ merger.instance_eval { @root = Pathname.new "/home/usr/design" }
96
+ assert_equal "../some/url", merger.resolve_path("/some/url", nil)
97
+ end
98
+ end
99
+
100
+ def test_resolve_path_should_leave_full_urls
101
+ merger = Juicer::Merger::StylesheetMerger.new []
102
+ url = "http://test.com"
103
+
104
+ Juicer::Merger::StylesheetMerger.publicize_methods do
105
+ merger.instance_eval { @root = Pathname.new "/home/usr/design" }
106
+ assert_equal url, merger.resolve_path(url, nil)
107
+ end
108
+ end
109
+
110
+ def test_resolve_path_error_when_missing_absolute_web_root
111
+ merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true
112
+
113
+ Juicer::Merger::StylesheetMerger.publicize_methods do
114
+ assert_raise ArgumentError do
115
+ merger.resolve_path("../some/url", nil)
116
+ end
117
+ end
118
+ end
119
+
120
+ def test_resolve_path_should_make_relative_urls_absolute
121
+ merger = Juicer::Merger::StylesheetMerger.new [], :absolute_urls => true, :web_root => "/home/usr"
122
+
123
+ Juicer::Merger::StylesheetMerger.publicize_methods do
124
+ merger.instance_eval { @root = Pathname.new "/home/usr/design" }
125
+ assert_equal "/design/images/1.png", merger.resolve_path("../images/1.png", "/home/usr/design/css")
126
+ end
127
+ end
128
+
129
+ def test_resolve_path_should_redefine_relative_urls
130
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true
131
+
132
+ Juicer::Merger::StylesheetMerger.publicize_methods do
133
+ merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
134
+ assert_equal "../../design/images/1.png", merger.resolve_path("../images/1.png", "/home/usr/design/css")
135
+ end
136
+ end
137
+
138
+ def test_resolve_path_should_redefine_absolute_urls
139
+ merger = Juicer::Merger::StylesheetMerger.new [], :relative_urls => true, :web_root => "/home/usr"
140
+
141
+ Juicer::Merger::StylesheetMerger.publicize_methods do
142
+ merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
143
+ assert_equal "../../images/1.png", merger.resolve_path("/images/1.png", "/home/usr/design/css")
144
+ end
145
+ end
146
+
147
+ def test_resolve_path_with_hosts_should_cycle_asset_hosts
148
+ merger = Juicer::Merger::StylesheetMerger.new [], :hosts => ["http://assets1", "http://assets2", "http://assets3"]
149
+
150
+ Juicer::Merger::StylesheetMerger.publicize_methods do
151
+ merger.instance_eval { @root = Pathname.new "/home/usr/design2/css" }
152
+ assert_equal "http://assets1/images/1.png", merger.resolve_path("/images/1.png", nil)
153
+ assert_equal "http://assets2/images/1.png", merger.resolve_path("/images/1.png", nil)
154
+ assert_equal "http://assets3/images/1.png", merger.resolve_path("/images/1.png", nil)
155
+ assert_equal "http://assets1/images/1.png", merger.resolve_path("/images/1.png", nil)
156
+ end
157
+ end
158
+
159
+ def test_resolve_paths_should_handle_relative_web_roots
160
+ merger = Juicer::Merger::StylesheetMerger.new [], :web_root => "test/data", :relative_urls => true
161
+ merger << File.expand_path("css/test2.css")
162
+
163
+ Juicer::Merger::StylesheetMerger.publicize_methods do
164
+ merger.instance_eval { @root = Pathname.new File.expand_path("test/data/css") }
165
+ assert_equal "../images/1.png", merger.resolve_path("/images/1.png", nil)
166
+ end
167
+ end
168
+
169
+ def test_cycle_asset_hosts_should_use_same_host_for_same_url
170
+ @file_merger = Juicer::Merger::StylesheetMerger.new nil, :hosts => ["http://assets1", "http://assets2", "http://assets3"]
171
+ @file_merger << path("path_test2.css")
172
+ ios = StringIO.new
173
+ @file_merger.save(ios)
174
+ files = ios.string.scan(/url\(([^\)]*)\)/).collect { |f| f.first }
175
+
176
+ assert_equal "1/images/1.png::2/css/2.gif::3/a1.css::2/css/2.gif::1/a2.css".gsub(/(\d\/)/, 'http://assets\1'), files.join("::")
177
+ end
62
178
  end
@@ -4,75 +4,155 @@ class TestYuiCompressor < Test::Unit::TestCase
4
4
 
5
5
  def setup
6
6
  @path = ENV.key?('YUI_HOME') ? ENV['YUI_HOME'] : File.expand_path('~/sources/yuicompressor-2.3.5/build')
7
- # @path = File.expand_path(File.join(File.dirname(__FILE__), %w[.. .. ..]))
7
+
8
8
  @yui_compressor = Juicer::Minifyer::YuiCompressor.new({ :bin_path => @path })
9
- @file_setup = Juicer::Test::FileSetup.new($DATA_DIR)
10
- @file_setup.create!
9
+ Juicer::Test::FileSetup.new.create
11
10
  @file = path('out.min.css')
12
11
  end
13
12
 
14
13
  def teardown
15
- File.delete(@file) if File.exists?(@file)
14
+ File.delete(@file) if @file && File.exists?(@file)
16
15
  end
17
16
 
18
- def test_save
17
+ def test_save_overwrite
19
18
  FileUtils.cp(path('a.css'), path('a-1.css'))
20
19
  @yui_compressor.save(path('a-1.css'))
21
20
  assert_equal "@import 'b.css';", IO.read(path('a-1.css'))
21
+ end
22
22
 
23
- filename = path('a-minified.css')
24
- @yui_compressor.save(path('a.css'), filename)
25
- assert_equal "@import 'b.css';", IO.read(filename)
23
+ def test_save_with_symbol_type
24
+ @yui_compressor.save(path('a.css'), path('a-1.css'), :css)
25
+ assert_equal "@import 'b.css';", IO.read(path('a-1.css'))
26
+ File.delete(path('a-1.css'))
27
+ end
26
28
 
27
- File.delete(filename)
29
+ def test_save_with_string_type
30
+ @yui_compressor.save(path('a.css'), path('a-1.css'), "css")
31
+ assert_equal "@import 'b.css';", IO.read(path('a-1.css'))
28
32
  File.delete(path('a-1.css'))
29
33
  end
30
34
 
31
- def test_command
35
+ def test_save_other_file
36
+ @yui_compressor.save(path('a.css'), path('a-1.css'))
37
+ assert_equal "@import 'b.css';", IO.read(path('a-1.css'))
38
+ assert_not_equal IO.read(path('a-1.css')), IO.read(path('a.css'))
39
+ File.delete(path('a-1.css'))
40
+ end
41
+
42
+ def test_save_should_create_non_existant_path
43
+ @yui_compressor.save(path('a.css'), path('bleh/blah/a-1.css'))
44
+ assert File.exists? path('bleh/blah/a-1.css')
45
+ FileUtils.rm_rf(path('bleh'))
46
+ end
47
+
48
+ # def test_command
49
+ # Juicer::Minifyer::YuiCompressor.publicize_methods do
50
+ # cmd = /java -jar #{@path.sub('2.3.5', '\d\.\d\.\d')}\/yuicompressor-\d\.\d\.\d\.jar --type css/
51
+ # assert_match cmd, @yui_compressor.command('css')
52
+
53
+ # @yui_compressor.no_munge = true
54
+ # cmd = /#{cmd} --no-munge/
55
+ # assert_match cmd, @yui_compressor.command('css')
56
+ # end
57
+ # end
58
+
59
+ def test_locate_jar_no_existing_jar
32
60
  Juicer::Minifyer::YuiCompressor.publicize_methods do
33
- cmd = /java -jar #{@path.sub('2.3.5', '\d\.\d\.\d')}\/yuicompressor-\d\.\d\.\d\.jar --type css/
34
- assert_match cmd, @yui_compressor.command('css')
61
+ # Avoid developer env settings
62
+ yuic_home = ENV['YUIC_HOME']
63
+ ENV.delete('YUIC_HOME')
64
+
65
+ assert_nil @yui_compressor.locate_jar
35
66
 
36
- @yui_compressor.no_munge = true
37
- cmd = /#{cmd} --no-munge/
38
- assert_match cmd, @yui_compressor.command('css')
67
+ # Reset developer env settings
68
+ ENV['YUIC_HOME'] = yuic_home
39
69
  end
40
70
  end
41
71
 
42
- def test_locate_jar
72
+ def test_locate_jar_one_file_in_cwd
43
73
  Juicer::Minifyer::YuiCompressor.publicize_methods do
44
- # No env, no option, and no file in cwd
74
+ # Avoid developer env settings
45
75
  yuic_home = ENV['YUIC_HOME']
46
76
  ENV.delete('YUIC_HOME')
47
- @yui_compressor = Juicer::Minifyer::YuiCompressor.new
48
- assert_nil @yui_compressor.locate_jar
49
77
 
50
- # One file in cwd
51
78
  File.open('yuicompressor-2.3.4.jar', 'w') { |f| f.puts '' }
52
79
  assert_equal File.expand_path('yuicompressor-2.3.4.jar'), @yui_compressor.locate_jar
53
80
 
54
- # Two files in cwd
81
+ # Cleanup
82
+ File.delete('yuicompressor-2.3.4.jar')
83
+
84
+ # Reset developer env settings
85
+ ENV['YUIC_HOME'] = yuic_home
86
+ end
87
+ end
88
+
89
+ def test_locate_jar_two_files_in_cwd
90
+ Juicer::Minifyer::YuiCompressor.publicize_methods do
91
+ # Avoid developer env settings
92
+ yuic_home = ENV['YUIC_HOME']
93
+ ENV.delete('YUIC_HOME')
94
+
95
+ # Create files
96
+ File.open('yuicompressor-2.3.4.jar', 'w') { |f| f.puts '' }
55
97
  File.open('yuicompressor-2.3.5.jar', 'w') { |f| f.puts '' }
98
+
99
+ # Test
56
100
  assert_equal File.expand_path('yuicompressor-2.3.5.jar'), @yui_compressor.locate_jar
57
101
 
58
- # Three files in cwd
102
+ # Cleanup
103
+ File.delete('yuicompressor-2.3.4.jar')
104
+ File.delete('yuicompressor-2.3.5.jar')
105
+
106
+ # Reset developer env settings
107
+ ENV['YUIC_HOME'] = yuic_home
108
+ end
109
+ end
110
+
111
+ def test_locate_jar_three_files_in_cwd
112
+ Juicer::Minifyer::YuiCompressor.publicize_methods do
113
+ # Avoid developer env settings
114
+ yuic_home = ENV['YUIC_HOME']
115
+ ENV.delete('YUIC_HOME')
116
+
117
+ # Create files
118
+ File.open('yuicompressor-2.3.4.jar', 'w') { |f| f.puts '' }
119
+ File.open('yuicompressor-2.3.5.jar', 'w') { |f| f.puts '' }
59
120
  File.open('yuicompressor.jar', 'w') { |f| f.puts '' }
121
+
122
+ # Test
60
123
  assert_equal File.expand_path('yuicompressor.jar'), @yui_compressor.locate_jar
61
124
 
62
- # Specify another directory
125
+ # Cleanup
126
+ File.delete('yuicompressor-2.3.4.jar')
127
+ File.delete('yuicompressor-2.3.5.jar')
128
+ File.delete('yuicompressor.jar')
129
+
130
+ # Reset developer env settings
131
+ ENV['YUIC_HOME'] = yuic_home
132
+ end
133
+ end
134
+
135
+ def test_locate_jar_custom_directory
136
+ Juicer::Minifyer::YuiCompressor.publicize_methods do
137
+ # Avoid developer env settings
138
+ yuic_home = ENV['YUIC_HOME']
139
+ ENV.delete('YUIC_HOME')
140
+
141
+ # Prepare
63
142
  Dir.mkdir('another')
64
143
  Dir.chdir('another')
65
144
  File.open('yuicompressor-2.3.4.jar', 'w')
66
145
  Dir.chdir('..')
67
- assert_equal File.expand_path('yuicompressor.jar'), @yui_compressor.locate_jar
146
+
147
+ # Test
148
+ assert_nil @yui_compressor.locate_jar
68
149
  @yui_compressor = Juicer::Minifyer::YuiCompressor.new({ :bin_path => 'another' })
69
150
  assert_equal File.expand_path('another/yuicompressor-2.3.4.jar'), @yui_compressor.locate_jar
70
151
 
71
- # Cleanup
72
- FileUtils.rm('yuicompressor-2.3.4.jar')
73
- FileUtils.rm('yuicompressor-2.3.5.jar')
74
- FileUtils.rm('yuicompressor.jar')
75
- FileUtils.rm_rf('another')
152
+ # Clean up
153
+ FileUtils.rm_rf("another")
154
+
155
+ # Reset developer env settings
76
156
  ENV['YUIC_HOME'] = yuic_home
77
157
  end
78
158
  end
@@ -0,0 +1,58 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. test_helper])) unless defined?(Juicer)
2
+
3
+ class TestCacheBuster < Test::Unit::TestCase
4
+ def setup
5
+ Juicer::Test::FileSetup.new.create
6
+ end
7
+
8
+ def test_default_type_and_param_name
9
+ file = path("a.js")
10
+ mtime = File.new(file).mtime.to_i
11
+ assert_equal "#{file}?jcb=#{mtime}", Juicer::CacheBuster.path(file)
12
+ end
13
+
14
+ def test_soft_path_default_param_name
15
+ file = path("a.js")
16
+ mtime = File.new(file).mtime.to_i
17
+ assert_equal "#{file}?jcb=#{mtime}", Juicer::CacheBuster.path(file, :soft)
18
+ end
19
+
20
+ def test_soft_path
21
+ file = path("a.js")
22
+ mtime = File.new(file).mtime.to_i
23
+ assert_equal "#{file}?mtime=#{mtime}", Juicer::CacheBuster.path(file, :soft, "mtime")
24
+ assert_equal "#{file}?mtime=#{mtime}", Juicer::CacheBuster.path(file, :soft, :mtime)
25
+ end
26
+
27
+ def test_soft_path_with_empty_param_name
28
+ file = path("a.js")
29
+ mtime = File.new(file).mtime.to_i
30
+ assert_equal "#{file}?#{mtime}", Juicer::CacheBuster.path(file, :soft, nil)
31
+ assert_equal "#{file}?#{mtime}", Juicer::CacheBuster.path(file, :soft, "")
32
+ end
33
+
34
+ def test_hard_path_default_param_name
35
+ file = path("a.js")
36
+ mtime = File.new(file).mtime.to_i
37
+ assert_equal "#{File.dirname(file)}/a-#{mtime}.js", Juicer::CacheBuster.path(file, :hard)
38
+ end
39
+
40
+ def test_hard_path_with_empty_param_name
41
+ file = path("a.js")
42
+ mtime = File.new(file).mtime.to_i
43
+ assert_equal "#{File.dirname(file)}/a-#{mtime}.js", Juicer::CacheBuster.path(file, :hard, "")
44
+ assert_equal "#{File.dirname(file)}/a-#{mtime}.js", Juicer::CacheBuster.path(file, :hard, nil)
45
+ end
46
+
47
+ def test_hard_path
48
+ file = path("a.js")
49
+ mtime = File.new(file).mtime.to_i
50
+ assert_equal "#{File.dirname(file)}/a-cb#{mtime}.js", Juicer::CacheBuster.path(file, :hard, "cb")
51
+ end
52
+
53
+ def test_cached_path_should_be_updated_soft
54
+ file = path("a.js")
55
+ mtime = File.new(file).mtime.to_i
56
+ assert_equal "#{File.dirname(file)}/a.js?cb=#{mtime}", Juicer::CacheBuster.path("#{file}?cb=1234", :soft, "cb")
57
+ end
58
+ end
@@ -55,6 +55,13 @@ class TestChainable < Test::Unit::TestCase
55
55
  assert_equal host2, host.next_in_chain
56
56
  end
57
57
 
58
+ def test_set_next_return_self_if_next_nil
59
+ host = Host.new
60
+
61
+ assert_not_nil host.set_next(nil)
62
+ assert_equal host, host.set_next(nil)
63
+ end
64
+
58
65
  def test_simple_chain
59
66
  host = Host.new("a")
60
67
  host2 = host.next_in_chain = Host.new("b")
@@ -0,0 +1,47 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), %w[.. test_helper])) unless defined?(Juicer)
2
+
3
+ class TestStringExtensions < Test::Unit::TestCase
4
+ def test_camel_case
5
+ assert_equal "CamelCase", "camel_case".camel_case
6
+ assert_equal "Camel case", "camel case".camel_case
7
+ assert_equal "CamelCase", "CAMEL_CASE".camel_case
8
+ assert_equal "CamelCase", "Camel_Case".camel_case
9
+ end
10
+
11
+ def test_to_class
12
+ assert_equal String, "String".to_class
13
+
14
+ assert_raise RuntimeError do
15
+ "String".to_class(Array)
16
+ end
17
+
18
+ assert_equal String, "String".to_class(Object)
19
+ assert_equal Juicer::Merger, "Juicer::Merger".to_class
20
+ assert_equal Juicer::Merger, "Merger".to_class(Juicer)
21
+ assert_equal Juicer::Merger::StylesheetMerger, "Juicer::Merger::StylesheetMerger".to_class
22
+ assert_equal Juicer::Merger::StylesheetMerger, "StylesheetMerger".to_class(Juicer::Merger)
23
+ end
24
+
25
+ def test_classify
26
+ assert_equal Juicer::Merger, "merger".classify(Juicer)
27
+ assert_equal FileUtils, "file_utils".classify
28
+ end
29
+
30
+ def test_underscore
31
+ assert_equal "stylesheet_merger", "StylesheetMerger".underscore
32
+ end
33
+ end
34
+
35
+ class TestSymbolExtensions < Test::Unit::TestCase
36
+ def test_camel_case
37
+ assert_equal "CamelCase", :camel_case.camel_case
38
+ assert_equal "CamelCase", :camel_case.camel_case
39
+ assert_equal "CamelCase", :CAMEL_CASE.camel_case
40
+ assert_equal "CamelCase", :Camel_Case.camel_case
41
+ end
42
+
43
+ def test_classify
44
+ assert_equal Juicer::Merger, :merger.classify(Juicer)
45
+ assert_equal FileUtils, :file_utils.classify
46
+ end
47
+ end