UNPKG

8.91 kBJavaScriptView Raw
1// Jasmine unit tests
2// To run tests, run these commands from the project root:
3// 1. `npm install -g jasmine-node`
4// 2. `jasmine-node spec`
5
6/* global describe, it, expect */
7
8'use strict';
9var postcss = require('postcss');
10var pxtorem = require('..');
11var basicCSS = '.rule { font-size: 15px }';
12
13describe('pxtorem', function () {
14 it('should work on the readme example', function () {
15 var input = 'h1 { margin: 0 0 20px; font-size: 32px; line-height: 1.2; letter-spacing: 1px; }';
16 var output = 'h1 { margin: 0 0 20px; font-size: 2rem; line-height: 1.2; letter-spacing: 0.0625rem; }';
17 var processed = postcss(pxtorem()).process(input).css;
18
19 expect(processed).toBe(output);
20 });
21
22 it('should replace the px unit with rem', function () {
23 var processed = postcss(pxtorem()).process(basicCSS).css;
24 var expected = '.rule { font-size: 0.9375rem }';
25
26 expect(processed).toBe(expected);
27 });
28
29 it('should ignore non px properties', function () {
30 var expected = '.rule { font-size: 2em }';
31 var processed = postcss(pxtorem()).process(expected).css;
32
33 expect(processed).toBe(expected);
34 });
35
36 it('should handle < 1 values and values without a leading 0', function () {
37 var rules = '.rule { margin: 0.5rem .5px -0.2px -.2em }';
38 var expected = '.rule { margin: 0.5rem 0.03125rem -0.0125rem -.2em }';
39 var options = {
40 propWhiteList: ['margin']
41 };
42 var processed = postcss(pxtorem(options)).process(rules).css;
43
44 expect(processed).toBe(expected);
45 });
46
47 it('should not add properties that already exist', function () {
48 var expected = '.rule { font-size: 16px; font-size: 1rem; }';
49 var processed = postcss(pxtorem()).process(expected).css;
50
51 expect(processed).toBe(expected);
52 });
53});
54
55describe('value parsing', function () {
56 it('should not replace values in double quotes or single quotes', function () {
57 var options = {
58 propWhiteList: []
59 };
60 var rules = '.rule { content: \'16px\'; font-family: "16px"; font-size: 16px; }';
61 var expected = '.rule { content: \'16px\'; font-family: "16px"; font-size: 1rem; }';
62 var processed = postcss(pxtorem(options)).process(rules).css;
63
64 expect(processed).toBe(expected);
65 });
66
67 it('should not replace values in `url()`', function () {
68 var options = {
69 propWhiteList: []
70 };
71 var rules = '.rule { background: url(16px.jpg); font-size: 16px; }';
72 var expected = '.rule { background: url(16px.jpg); font-size: 1rem; }';
73 var processed = postcss(pxtorem(options)).process(rules).css;
74
75 expect(processed).toBe(expected);
76 });
77});
78
79describe('rootValue', function () {
80 // Deprecate
81 it('should replace using a root value of 10 - legacy', function () {
82 var expected = '.rule { font-size: 1.5rem }';
83 var options = {
84 root_value: 10
85 };
86 var processed = postcss(pxtorem(options)).process(basicCSS).css;
87
88 expect(processed).toBe(expected);
89 });
90
91 it('should replace using a root value of 10', function () {
92 var expected = '.rule { font-size: 1.5rem }';
93 var options = {
94 rootValue: 10
95 };
96 var processed = postcss(pxtorem(options)).process(basicCSS).css;
97
98 expect(processed).toBe(expected);
99 });
100});
101
102describe('unitPrecision', function () {
103 // Deprecate
104 it('should replace using a decimal of 2 places - legacy', function () {
105 var expected = '.rule { font-size: 0.94rem }';
106 var options = {
107 unit_precision: 2
108 };
109 var processed = postcss(pxtorem(options)).process(basicCSS).css;
110
111 expect(processed).toBe(expected);
112 });
113
114 it('should replace using a decimal of 2 places', function () {
115 var expected = '.rule { font-size: 0.94rem }';
116 var options = {
117 unitPrecision: 2
118 };
119 var processed = postcss(pxtorem(options)).process(basicCSS).css;
120
121 expect(processed).toBe(expected);
122 });
123});
124
125describe('propWhiteList', function () {
126 // Deprecate
127 it('should only replace properties in the white list - legacy', function () {
128 var expected = '.rule { font-size: 15px }';
129 var options = {
130 prop_white_list: ['font']
131 };
132 var processed = postcss(pxtorem(options)).process(basicCSS).css;
133
134 expect(processed).toBe(expected);
135 });
136
137 it('should only replace properties in the white list', function () {
138 var expected = '.rule { font-size: 15px }';
139 var options = {
140 propWhiteList: ['font']
141 };
142 var processed = postcss(pxtorem(options)).process(basicCSS).css;
143
144 expect(processed).toBe(expected);
145 });
146
147 it('should replace all properties when white list is empty', function () {
148 var rules = '.rule { margin: 16px; font-size: 15px }';
149 var expected = '.rule { margin: 1rem; font-size: 0.9375rem }';
150 var options = {
151 propWhiteList: []
152 };
153 var processed = postcss(pxtorem(options)).process(rules).css;
154
155 expect(processed).toBe(expected);
156 });
157});
158
159describe('selectorBlackList', function () {
160 // Deprecate
161 it('should ignore selectors in the selector black list - legacy', function () {
162 var rules = '.rule { font-size: 15px } .rule2 { font-size: 15px }';
163 var expected = '.rule { font-size: 0.9375rem } .rule2 { font-size: 15px }';
164 var options = {
165 selector_black_list: ['.rule2']
166 };
167 var processed = postcss(pxtorem(options)).process(rules).css;
168
169 expect(processed).toBe(expected);
170 });
171
172 it('should ignore selectors in the selector black list', function () {
173 var rules = '.rule { font-size: 15px } .rule2 { font-size: 15px }';
174 var expected = '.rule { font-size: 0.9375rem } .rule2 { font-size: 15px }';
175 var options = {
176 selectorBlackList: ['.rule2']
177 };
178 var processed = postcss(pxtorem(options)).process(rules).css;
179
180 expect(processed).toBe(expected);
181 });
182
183 it('should ignore every selector with `body$`', function () {
184 var rules = 'body { font-size: 16px; } .class-body$ { font-size: 16px; } .simple-class { font-size: 16px; }';
185 var expected = 'body { font-size: 1rem; } .class-body$ { font-size: 16px; } .simple-class { font-size: 1rem; }';
186 var options = {
187 selectorBlackList: ['body$']
188 };
189 var processed = postcss(pxtorem(options)).process(rules).css;
190
191 expect(processed).toBe(expected);
192 });
193
194 it('should only ignore exactly `body`', function () {
195 var rules = 'body { font-size: 16px; } .class-body { font-size: 16px; } .simple-class { font-size: 16px; }';
196 var expected = 'body { font-size: 16px; } .class-body { font-size: 1rem; } .simple-class { font-size: 1rem; }';
197 var options = {
198 selectorBlackList: [/^body$/]
199 };
200 var processed = postcss(pxtorem(options)).process(rules).css;
201
202 expect(processed).toBe(expected);
203 });
204});
205
206describe('replace', function () {
207 it('should leave fallback pixel unit with root em value', function () {
208 var options = {
209 replace: false
210 };
211 var processed = postcss(pxtorem(options)).process(basicCSS).css;
212 var expected = '.rule { font-size: 15px; font-size: 0.9375rem }';
213
214 expect(processed).toBe(expected);
215 });
216});
217
218describe('mediaQuery', function () {
219 // Deprecate
220 it('should replace px in media queries', function () {
221 var options = {
222 media_query: true
223 };
224 var processed = postcss(pxtorem(options)).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
225 var expected = '@media (min-width: 31.25rem) { .rule { font-size: 1rem } }';
226
227 expect(processed).toBe(expected);
228 });
229
230 it('should replace px in media queries', function () {
231 var options = {
232 mediaQuery: true
233 };
234 var processed = postcss(pxtorem(options)).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
235 var expected = '@media (min-width: 31.25rem) { .rule { font-size: 1rem } }';
236
237 expect(processed).toBe(expected);
238 });
239});
240
241describe('minPixelValue', function () {
242 it('should not replace values below minPixelValue', function () {
243 var options = {
244 propWhiteList: [],
245 minPixelValue: 2
246 };
247 var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
248 var expected = '.rule { border: 1px solid #000; font-size: 1rem; margin: 1px 0.625rem; }';
249 var processed = postcss(pxtorem(options)).process(rules).css;
250
251 expect(processed).toBe(expected);
252 });
253});