css_parser 1.2.6 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,114 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
-
3
- # Test cases for the handling of media types
4
- class CssParserMediaTypesTests < Test::Unit::TestCase
5
- include CssParser
6
-
7
- def setup
8
- @cp = Parser.new
9
- end
10
-
11
- def test_finding_by_media_type
12
- # from http://www.w3.org/TR/CSS21/media.html#at-media-rule
13
- css = <<-EOT
14
- @media print {
15
- body { font-size: 10pt }
16
- }
17
- @media screen {
18
- body { font-size: 13px }
19
- }
20
- @media screen, print {
21
- body { line-height: 1.2 }
22
- }
23
- @media screen, 3d-glasses, print and resolution > 90dpi {
24
- body { color: blue; }
25
- }
26
- EOT
27
-
28
- @cp.add_block!(css)
29
-
30
- assert_equal 'font-size: 10pt; line-height: 1.2;', @cp.find_by_selector('body', :print).join(' ')
31
- assert_equal 'font-size: 13px; line-height: 1.2; color: blue;', @cp.find_by_selector('body', :screen).join(' ')
32
- assert_equal 'color: blue;', @cp.find_by_selector('body', 'print and resolution > 90dpi'.to_sym).join(' ')
33
- end
34
-
35
- def test_finding_by_multiple_media_types
36
- css = <<-EOT
37
- @media print {
38
- body { font-size: 10pt }
39
- }
40
- @media handheld {
41
- body { font-size: 13px }
42
- }
43
- @media screen, print {
44
- body { line-height: 1.2 }
45
- }
46
- EOT
47
- @cp.add_block!(css)
48
-
49
- assert_equal 'font-size: 13px; line-height: 1.2;', @cp.find_by_selector('body', [:screen,:handheld]).join(' ')
50
- end
51
-
52
- def test_adding_block_with_media_types
53
- css = <<-EOT
54
- body { font-size: 10pt }
55
- EOT
56
-
57
- @cp.add_block!(css, :media_types => [:screen])
58
-
59
- assert_equal 'font-size: 10pt;', @cp.find_by_selector('body', :screen).join(' ')
60
- assert @cp.find_by_selector('body', :handheld).empty?
61
- end
62
-
63
- def test_adding_block_and_limiting_media_types1
64
- css = <<-EOT
65
- @import "import1.css", print
66
- EOT
67
-
68
- base_dir = File.dirname(__FILE__) + '/fixtures/'
69
-
70
- @cp.add_block!(css, :only_media_types => :screen, :base_dir => base_dir)
71
- assert @cp.find_by_selector('div').empty?
72
-
73
- end
74
-
75
- def test_adding_block_and_limiting_media_types2
76
- css = <<-EOT
77
- @import "import1.css", print and (color)
78
- EOT
79
-
80
- base_dir = File.dirname(__FILE__) + '/fixtures/'
81
-
82
- @cp.add_block!(css, :only_media_types => 'print and (color)', :base_dir => base_dir)
83
- assert_match 'color: lime', @cp.find_by_selector('div').join(' ')
84
- end
85
-
86
- def test_adding_block_and_limiting_media_types
87
- css = <<-EOT
88
- @import "import1.css"
89
- EOT
90
-
91
- base_dir = File.dirname(__FILE__) + '/fixtures/'
92
- @cp.add_block!(css, :only_media_types => :print, :base_dir => base_dir)
93
- assert_match '', @cp.find_by_selector('div').join(' ')
94
- end
95
-
96
- def test_adding_rule_set_with_media_type
97
- @cp.add_rule!('body', 'color: black;', [:handheld,:tty])
98
- @cp.add_rule!('body', 'color: blue;', :screen)
99
- assert_equal 'color: black;', @cp.find_by_selector('body', :handheld).join(' ')
100
- end
101
-
102
- def test_adding_rule_set_with_media_query
103
- @cp.add_rule!('body', 'color: black;', 'aural and (device-aspect-ratio: 16/9)')
104
- assert_equal 'color: black;', @cp.find_by_selector('body', 'aural and (device-aspect-ratio: 16/9)').join(' ')
105
- assert_equal 'color: black;', @cp.find_by_selector('body', :all).join(' ')
106
- end
107
-
108
- def test_selecting_with_all_media_types
109
- @cp.add_rule!('body', 'color: black;', [:handheld,:tty])
110
- assert_equal 'color: black;', @cp.find_by_selector('body', :all).join(' ')
111
- end
112
-
113
-
114
- end
@@ -1,164 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
-
3
- # Test cases for the CssParser.
4
- class CssParserTests < Test::Unit::TestCase
5
- include CssParser
6
-
7
- def setup
8
- @cp = Parser.new
9
- end
10
-
11
- def test_at_page_rule
12
- # from http://www.w3.org/TR/CSS21/page.html#page-selectors
13
- css = <<-EOT
14
- @page { margin: 2cm }
15
-
16
- @page :first {
17
- margin-top: 10cm
18
- }
19
- EOT
20
-
21
- @cp.add_block!(css)
22
-
23
- assert_equal 'margin: 2cm;', @cp.find_by_selector('@page').join(' ')
24
- assert_equal 'margin-top: 10cm;', @cp.find_by_selector('@page :first').join(' ')
25
- end
26
-
27
- def test_should_ignore_comments
28
- # see http://www.w3.org/Style/CSS/Test/CSS2.1/current/html4/t040109-c17-comments-00-b.htm
29
- css =<<-EOT
30
- /* This is a CSS comment. */
31
- .one {color: green;} /* Another comment */
32
- /* The following should not be used:
33
- .one {color: red;} */
34
- .two {color: green; /* color: yellow; */}
35
- /**
36
- .three {color: red;} */
37
- .three {color: green;}
38
- /**/
39
- .four {color: green;}
40
- /*********/
41
- .five {color: green;}
42
- /* a comment **/
43
- .six {color: green;}
44
- EOT
45
-
46
- @cp.add_block!(css)
47
- @cp.each_selector do |sel, decs, spec|
48
- assert_equal 'color: green;', decs
49
- end
50
- end
51
-
52
- def test_parsing_blocks
53
- # dervived from http://www.w3.org/TR/CSS21/syndata.html#rule-sets
54
- css = <<-EOT
55
- div[name='test'] {
56
-
57
- color:
58
-
59
- red;
60
-
61
- }div:hover{coloR:red;
62
- }div:first-letter{color:red;/*color:blue;}"commented out"*/}
63
-
64
- p[example="public class foo\
65
- {\
66
- private string x;\
67
- \
68
- foo(int x) {\
69
- this.x = 'test';\
70
- this.x = \"test\";\
71
- }\
72
- \
73
- }"] { color: red }
74
-
75
- p { color:red}
76
- EOT
77
-
78
- @cp.add_block!(css)
79
-
80
- @cp.each_selector do |sel, decs, spec|
81
- assert_equal 'color: red;', decs
82
- end
83
- end
84
-
85
- def test_ignoring_malformed_declarations
86
- # dervived from http://www.w3.org/TR/CSS21/syndata.html#parsing-errors
87
- css = <<-EOT
88
- p { color:green }
89
- p { color:green; color } /* malformed declaration missing ':', value */
90
- p { color:red; color; color:green } /* same with expected recovery */
91
- p { color:green; color: } /* malformed declaration missing value */
92
- p { color:red; color:; color:green } /* same with expected recovery */
93
- p { color:green; color{;color:maroon} } /* unexpected tokens { } */
94
- p { color:red; color{;color:maroon}; color:green } /* same with recovery */
95
- EOT
96
-
97
- @cp.add_block!(css)
98
-
99
- @cp.each_selector do |sel, decs, spec|
100
- assert_equal 'color: green;', decs
101
- end
102
- end
103
-
104
- def test_calculating_specificity
105
- # from http://www.w3.org/TR/CSS21/cascade.html#specificity
106
- assert_equal 0, CssParser.calculate_specificity('*')
107
- assert_equal 1, CssParser.calculate_specificity('li')
108
- assert_equal 2, CssParser.calculate_specificity('li:first-line')
109
- assert_equal 2, CssParser.calculate_specificity('ul li')
110
- assert_equal 3, CssParser.calculate_specificity('ul ol+li')
111
- assert_equal 11, CssParser.calculate_specificity('h1 + *[rel=up]')
112
- assert_equal 13, CssParser.calculate_specificity('ul ol li.red')
113
- assert_equal 21, CssParser.calculate_specificity('li.red.level')
114
- assert_equal 100, CssParser.calculate_specificity('#x34y')
115
-
116
- # from http://www.hixie.ch/tests/adhoc/css/cascade/specificity/003.html
117
- assert_equal CssParser.calculate_specificity('div *'), CssParser.calculate_specificity('p')
118
- assert CssParser.calculate_specificity('body div *') > CssParser.calculate_specificity('div *')
119
-
120
- # other tests
121
- assert_equal 11, CssParser.calculate_specificity('h1[id|=123]')
122
- end
123
-
124
- def test_converting_uris
125
- base_uri = 'http://www.example.org/style/basic.css'
126
- ["body { background: url(yellow) };", "body { background: url('yellow') };",
127
- "body { background: url('/style/yellow') };",
128
- "body { background: url(\"../style/yellow\") };",
129
- "body { background: url(\"lib/../../style/yellow\") };"].each do |css|
130
- converted_css = CssParser.convert_uris(css, base_uri)
131
- assert_equal "body { background: url('http://www.example.org/style/yellow') };", converted_css
132
- end
133
-
134
- converted_css = CssParser.convert_uris("body { background: url(../style/yellow-dot_symbol$.png?abc=123&amp;def=456&ghi=789#1011) };", base_uri)
135
- assert_equal "body { background: url('http://www.example.org/style/yellow-dot_symbol$.png?abc=123&amp;def=456&ghi=789#1011') };", converted_css
136
-
137
- # taken from error log: 2007-10-23 04:37:41#2399
138
- converted_css = CssParser.convert_uris('.specs {font-family:Helvetica;font-weight:bold;font-style:italic;color:#008CA8;font-size:1.4em;list-style-image:url("images/bullet.gif");}', 'http://www.example.org/directory/file.html')
139
- assert_equal ".specs {font-family:Helvetica;font-weight:bold;font-style:italic;color:#008CA8;font-size:1.4em;list-style-image:url('http://www.example.org/directory/images/bullet.gif');}", converted_css
140
- end
141
-
142
- def test_ruleset_with_braces
143
- =begin
144
- parser = Parser.new
145
- parser.add_block!("div { background-color: black !important; }")
146
- parser.add_block!("div { background-color: red; }")
147
-
148
- rulesets = []
149
-
150
- parser['div'].each do |declaration|
151
- rulesets << RuleSet.new('div', declaration)
152
- end
153
-
154
- merged = CssParser.merge(rulesets)
155
-
156
- result: # merged.to_s => "{ background-color: black !important; }"
157
- =end
158
-
159
- new_rule = RuleSet.new('div', "{ background-color: black !important; }")
160
-
161
- assert_equal 'div { background-color: black !important; }', new_rule.to_s
162
- end
163
-
164
- end
@@ -1,69 +0,0 @@
1
- # coding: iso-8859-1
2
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
3
-
4
- # Test cases for CSS regular expressions
5
- #
6
- # see http://www.w3.org/TR/CSS21/syndata.html and
7
- # http://www.w3.org/TR/CSS21/grammar.html
8
- class CssParserRegexpTests < Test::Unit::TestCase
9
- def test_strings
10
- # complete matches
11
- ['"abcd"', '" A sd s�drcv \'dsf\' asd rfg asd"', '"A\ d??ef 123!"',
12
- "\"this is\\\n a test\"", '"back\67round"', '"r\000065 ed"',
13
- "'abcd'", "' A sd sedrcv \"dsf\" asd rf�&23$%#%$g asd'", "'A\\\n def 123!'",
14
- "'this is\\\n a test'", "'back\\67round'", "'r\\000065 ed'"
15
- ].each do |str|
16
- assert_equal str, str.match(CssParser::RE_STRING).to_s
17
- end
18
-
19
- test_string = "p { background: red url(\"url\\.'p'ng\"); }"
20
- assert_equal "\"url\\.'p'ng\"", test_string.match(CssParser::RE_STRING).to_s
21
-
22
- end
23
-
24
- def test_unicode
25
- ['back\67round', 'r\000065 ed', '\00006C'].each do |str|
26
- assert_match(Regexp.new(CssParser::RE_UNICODE), str)
27
- end
28
- end
29
-
30
- def test_colour
31
- ['color: #fff', 'color:#f0a09c;', 'color: #04A', 'color: #04a9CE',
32
- 'color: rgb(100, -10%, 300);', 'color: rgb(10,10,10)', 'color:rgb(12.7253%, -12%,0)',
33
- 'color: black', 'color:Red;', 'color: AqUa;', 'color: blue ', 'color: transparent'
34
- ].each do |colour|
35
- assert_match(CssParser::RE_COLOUR, colour)
36
- end
37
-
38
- ['color: #fa', 'color:#f009c;', 'color: #04G', 'color: #04a9Cq',
39
- 'color: rgb 100, -10%, 300;', 'color: rgb 10,10,10', 'color:rgb(12px, -12%,0)',
40
- 'color:fuscia;', 'color: thick'
41
- ].each do |colour|
42
- assert_no_match(CssParser::RE_COLOUR, colour)
43
- end
44
- end
45
-
46
- def test_uris
47
- crazy_uri = 'http://www.example.com:80/~/redb%20all.png?test=test&test;test+test#test!'
48
-
49
- assert_equal "url('#{crazy_uri}')",
50
- "li { list-style: url('#{crazy_uri}') disc }".match(CssParser::RE_URI).to_s
51
-
52
- assert_equal "url(#{crazy_uri})",
53
- "li { list-style: url(#{crazy_uri}) disc }".match(CssParser::RE_URI).to_s
54
-
55
- assert_equal "url(\"#{crazy_uri}\")",
56
- "li { list-style: url(\"#{crazy_uri}\") disc }".match(CssParser::RE_URI).to_s
57
- end
58
-
59
-
60
- protected
61
- def load_test_file(filename)
62
- fh = File.new("fixtures/#{filename}", 'r')
63
- test_file = fh.read
64
- fh.close
65
-
66
- return test_file
67
- end
68
-
69
- end
data/test/test_helper.rb DELETED
@@ -1,6 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'net/http'
4
- require 'open-uri'
5
- require 'webrick'
6
- require File.dirname(__FILE__) + '/../lib/css_parser'
data/test/test_merging.rb DELETED
@@ -1,116 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/test_helper')
2
-
3
- class MergingTests < Test::Unit::TestCase
4
- include CssParser
5
-
6
- def setup
7
- @cp = CssParser::Parser.new
8
- end
9
-
10
- def test_simple_merge
11
- rs1 = RuleSet.new(nil, 'color: black;')
12
- rs2 = RuleSet.new(nil, 'margin: 0px;')
13
- merged = CssParser.merge(rs1, rs2)
14
- assert_equal '0px;', merged['margin']
15
- assert_equal 'black;', merged['color']
16
- end
17
-
18
- def test_merging_array
19
- rs1 = RuleSet.new(nil, 'color: black;')
20
- rs2 = RuleSet.new(nil, 'margin: 0px;')
21
- merged = CssParser.merge([rs1, rs2])
22
- assert_equal '0px;', merged['margin']
23
- assert_equal 'black;', merged['color']
24
- end
25
-
26
-
27
- def test_merging_multiple
28
- rs1 = RuleSet.new(nil, 'color: black;')
29
- rs2 = RuleSet.new(nil, 'margin: 0px;')
30
- rs3 = RuleSet.new(nil, 'margin: 5px;')
31
- merged = CssParser.merge(rs1, rs2, rs3)
32
- assert_equal '5px;', merged['margin']
33
- end
34
-
35
- def test_multiple_selectors_should_have_zero_specificity
36
- rs1 = RuleSet.new('p, a[rel="external"]', 'color: black;')
37
- rs2 = RuleSet.new('a', 'color: blue;')
38
- merged = CssParser.merge(rs1, rs2)
39
- assert_equal 'blue;', merged['color']
40
- end
41
-
42
- def test_setting_specificity
43
- rs1 = RuleSet.new(nil, 'color: red;', 20)
44
- rs2 = RuleSet.new(nil, 'color: blue;', 10)
45
- merged = CssParser.merge(rs1, rs2)
46
- assert_equal 'red;', merged['color']
47
- end
48
-
49
- def test_properties_should_be_case_insensitive
50
- rs1 = RuleSet.new(nil, ' CoLor : red ;', 20)
51
- rs2 = RuleSet.new(nil, 'color: blue;', 10)
52
- merged = CssParser.merge(rs1, rs2)
53
- assert_equal 'red;', merged['color']
54
- end
55
-
56
- def test_merging_backgrounds
57
- rs1 = RuleSet.new(nil, 'background-color: black;')
58
- rs2 = RuleSet.new(nil, 'background-image: none;')
59
- merged = CssParser.merge(rs1, rs2)
60
- assert_equal 'black none;', merged['background']
61
- end
62
-
63
- def test_merging_dimensions
64
- rs1 = RuleSet.new(nil, 'margin: 3em;')
65
- rs2 = RuleSet.new(nil, 'margin-left: 1em;')
66
- merged = CssParser.merge(rs1, rs2)
67
- assert_equal '3em 3em 3em 1em;', merged['margin']
68
- end
69
-
70
- def test_merging_fonts
71
- rs1 = RuleSet.new(nil, 'font: 11px Arial;')
72
- rs2 = RuleSet.new(nil, 'font-weight: bold;')
73
- merged = CssParser.merge(rs1, rs2)
74
- assert_equal 'bold 11px Arial;', merged['font']
75
- end
76
-
77
- def test_raising_error_on_bad_type
78
- assert_raise ArgumentError do
79
- CssParser.merge([1,2,3])
80
- end
81
- end
82
-
83
- def test_returning_early_with_only_one_params
84
- rs = RuleSet.new(nil, 'font-weight: bold;')
85
- merged = CssParser.merge(rs)
86
- assert_equal rs.object_id, merged.object_id
87
- end
88
-
89
- def test_merging_important
90
- rs1 = RuleSet.new(nil, 'color: black !important;')
91
- rs2 = RuleSet.new(nil, 'color: red;')
92
- merged = CssParser.merge(rs1, rs2)
93
- assert_equal 'black !important;', merged['color']
94
- end
95
-
96
- def test_merging_multiple_important
97
- rs1 = RuleSet.new(nil, 'color: black !important;', 1000)
98
- rs2 = RuleSet.new(nil, 'color: red !important;', 1)
99
- merged = CssParser.merge(rs1, rs2)
100
- assert_equal 'black !important;', merged['color']
101
-
102
- rs3 = RuleSet.new(nil, 'color: blue !important;', 1000)
103
- merged = CssParser.merge(rs1, rs2, rs3)
104
- assert_equal 'blue !important;', merged['color']
105
-
106
-
107
- end
108
-
109
- def test_merging_shorthand_important
110
- rs1 = RuleSet.new(nil, 'background: black none !important;')
111
- rs2 = RuleSet.new(nil, 'background-color: red;')
112
- merged = CssParser.merge(rs1, rs2)
113
- assert_equal 'black !important;', merged['background-color']
114
- end
115
-
116
- end