File: rx_test.rb

package info (click to toggle)
ruby-sass 3.7.4-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,396 kB
  • sloc: ruby: 32,443; sh: 26; makefile: 25
file content (159 lines) | stat: -rwxr-xr-x 5,319 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# -*- coding: utf-8 -*-
require File.dirname(__FILE__) + '/../../test_helper'
require 'sass/engine'

class ScssRxTest < Minitest::Test
  include Sass::SCSS::RX

  def test_identifiers
    assert_match IDENT, "foo"
    assert_match IDENT, "\xC3\xBFoo" # Initial char can be nonascii
    assert_match IDENT, "\\123abcoo" # Initial char can be unicode escape
    assert_match IDENT, "\\f oo" # Unicode escapes can be followed by whitespace
    assert_match IDENT, "\\fa\too"
    assert_match IDENT, "\\ff2\roo"
    assert_match IDENT, "\\f13a\foo"
    assert_match IDENT, "\\f13abcoo"
    assert_match IDENT, "\\ oo" # Initial char can be a plain escape as well
    assert_match IDENT, "\\~oo"
    assert_match IDENT, "\\\\oo"
    assert_match IDENT, "\\{oo"
    assert_match IDENT, "\\\xC3\xBFoo"
    assert_match IDENT, "-foo" # Can put a - before anything
    assert_match IDENT, "-\xC3\xBFoo"
    assert_match IDENT, "-\\f oo"
    assert_match IDENT, "_foo" # Can put a _ before anything
    assert_match IDENT, "_\xC3\xBFoo"
    assert_match IDENT, "_\\f oo"
    assert_match IDENT, "--foo" # "Custom" identifier

    assert_match IDENT, "foo-bar"
    assert_match IDENT, "f012-23"
    assert_match IDENT, "foo_-_bar"
    assert_match IDENT, "f012_23"

    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-003.xht
    assert_match IDENT, "c\\lass"
    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-004.xht
    assert_match IDENT, "c\\00006Cas\\000073"
    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-001.xht
    assert_match IDENT, "IdE6n-3t0_6"
    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-006.xht
    assert_match IDENT, "\\6000ident"
    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-007.xht
    assert_match IDENT, "iden\\6000t\\6000"
    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/ident-013.xht
    assert_match IDENT, "\\-ident"
  end

  def test_underscores_in_identifiers
    assert_match IDENT, "foo_bar"
    assert_match IDENT, "_\xC3\xBFfoo"
    assert_match IDENT, "__foo"
    assert_match IDENT, "_1foo"
    assert_match IDENT, "-_foo"
    assert_match IDENT, "_-foo"
  end

  def test_invalid_identifiers
    assert_no_match IDENT, ""
    assert_no_match IDENT, "1foo"
    assert_no_match IDENT, "-1foo"
    assert_no_match IDENT, "foo bar"
    assert_no_match IDENT, "foo~bar"

    # http://www.w3.org/Style/CSS/Test/CSS2.1/current/xhtml1/escapes-008.xht
    assert_no_match IDENT, "c\\06C  ass"
    assert_no_match IDENT, "back\\67\n round"
  end

  def test_double_quote_strings
    assert_match STRING, '"foo bar"'
    assert_match STRING, '"foo\\\nbar"'
    assert_match STRING, "\"\\\"\""
    assert_match STRING, '"\t !#$%&(-~()*+,-./0123456789~"'
  end

  def test_single_quote_strings
    assert_match STRING, "'foo bar'"
    assert_match STRING, "'foo\\\nbar'"
    assert_match STRING, "'\\''"
    assert_match STRING, "'\t !#\$%&(-~()*+,-./0123456789~'"
  end

  def test_invalid_strings
    assert_no_match STRING, "\"foo\nbar\""
    assert_no_match STRING, "\"foo\"bar\""
    assert_no_match STRING, "'foo\nbar'"
    assert_no_match STRING, "'foo'bar'"
  end

  def test_uri
    assert_match URI, 'url("foo bar)")'
    assert_match URI, "url('foo bar)')"
    assert_match URI, 'url( "foo bar)" )'
    assert_match URI, "url(#\\%&**+,-./0123456789~)"
  end

  def test_invalid_uri
    assert_no_match URI, 'url(foo)bar)'
  end

  def test_unicode_range
    assert_match UNICODERANGE, 'U+00-Ff'
    assert_match UNICODERANGE, 'u+980-9FF'
    assert_match UNICODERANGE, 'U+9aF??'
    assert_match UNICODERANGE, 'U+??'
  end

  def test_escape_empty_ident
    assert_equal "", Sass::SCSS::RX.escape_ident("")
  end

  def test_escape_just_prefix_ident
    assert_equal "\\-", Sass::SCSS::RX.escape_ident("-")
    assert_equal "\\_", Sass::SCSS::RX.escape_ident("_")
  end

  def test_escape_plain_ident
    assert_equal "foo", Sass::SCSS::RX.escape_ident("foo")
    assert_equal "foo-1bar", Sass::SCSS::RX.escape_ident("foo-1bar")
    assert_equal "-foo-bar", Sass::SCSS::RX.escape_ident("-foo-bar")
    assert_equal "f2oo_bar", Sass::SCSS::RX.escape_ident("f2oo_bar")
    assert_equal "_foo_bar", Sass::SCSS::RX.escape_ident("_foo_bar")
  end

  def test_escape_initial_funky_ident
    assert_equal "\\000035foo", Sass::SCSS::RX.escape_ident("5foo")
    assert_equal "-\\000035foo", Sass::SCSS::RX.escape_ident("-5foo")
    assert_equal "_\\000035foo", Sass::SCSS::RX.escape_ident("_5foo")

    assert_equal "\\&foo", Sass::SCSS::RX.escape_ident("&foo")
    assert_equal "-\\&foo", Sass::SCSS::RX.escape_ident("-&foo")

    assert_equal "-\\ foo", Sass::SCSS::RX.escape_ident("- foo")
  end

  def test_escape_mid_funky_ident
    assert_equal "foo\\&bar", Sass::SCSS::RX.escape_ident("foo&bar")
    assert_equal "foo\\ \\ bar", Sass::SCSS::RX.escape_ident("foo  bar")
    assert_equal "foo\\00007fbar", Sass::SCSS::RX.escape_ident("foo\177bar")
  end

  def test_no_static_hyphenated_units
    assert_no_match STATIC_VALUE, "20px-20px"
  end

  private

  def assert_match(rx, str)
    refute_nil(match = rx.match(str))
    assert_equal str.size, match[0].size
  end

  def assert_no_match(rx, str)
    match = rx.match(str)
    refute_equal str.size, match && match[0].size
  end

end