You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

638 lines
22 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. // To run tests, run these commands from the project root:
  2. // 1. `npm install`
  3. // 2. `npm test`
  4. /* global describe, it, expect */
  5. var postcss = require('postcss');
  6. var pxToViewport = require('..');
  7. var basicCSS = '.rule { font-size: 15px }';
  8. var { filterPropList } = require('../src/prop-list-matcher');
  9. describe('px-to-viewport', function() {
  10. it('should work on the readme example', function () {
  11. var input = 'h1 { margin: 0 0 20px; font-size: 32px; line-height: 2; letter-spacing: 1px; }';
  12. var output = 'h1 { margin: 0 0 6.25vw; font-size: 10vw; line-height: 2; letter-spacing: 1px; }';
  13. var processed = postcss(pxToViewport()).process(input).css;
  14. expect(processed).toBe(output);
  15. });
  16. it('should replace the px unit with vw', function () {
  17. var processed = postcss(pxToViewport()).process(basicCSS).css;
  18. var expected = '.rule { font-size: 4.6875vw }';
  19. expect(processed).toBe(expected);
  20. });
  21. it('should handle < 1 values and values without a leading 0', function () {
  22. var rules = '.rule { margin: 0.5rem .5px -0.2px -.2em }';
  23. var expected = '.rule { margin: 0.5rem 0.15625vw -0.0625vw -.2em }';
  24. var options = {
  25. minPixelValue: 0
  26. };
  27. var processed = postcss(pxToViewport(options)).process(rules).css;
  28. expect(processed).toBe(expected);
  29. });
  30. it('should remain unitless if 0', function () {
  31. var expected = '.rule { font-size: 0px; font-size: 0; }';
  32. var processed = postcss(pxToViewport()).process(expected).css;
  33. expect(processed).toBe(expected);
  34. });
  35. it('should not add properties that already exist', function () {
  36. var expected = '.rule { font-size: 16px; font-size: 5vw; }';
  37. var processed = postcss(pxToViewport()).process(expected).css;
  38. expect(processed).toBe(expected);
  39. });
  40. it('should not replace units inside mediaQueries by default', function() {
  41. var expected = '@media (min-width: 500px) { .rule { font-size: 16px } }';
  42. var processed = postcss(pxToViewport()).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
  43. expect(processed).toBe(expected);
  44. })
  45. });
  46. describe('value parsing', function() {
  47. it('should not replace values in double quotes or single quotes', function () {
  48. var options = {
  49. propList: ['*']
  50. };
  51. var rules = '.rule { content: \'16px\'; font-family: "16px"; font-size: 16px; }';
  52. var expected = '.rule { content: \'16px\'; font-family: "16px"; font-size: 5vw; }';
  53. var processed = postcss(pxToViewport(options)).process(rules).css;
  54. expect(processed).toBe(expected);
  55. });
  56. it('should not replace values in `url()`', function () {
  57. var rules = '.rule { background: url(16px.jpg); font-size: 16px; }';
  58. var expected = '.rule { background: url(16px.jpg); font-size: 5vw; }';
  59. var processed = postcss(pxToViewport()).process(rules).css;
  60. expect(processed).toBe(expected);
  61. });
  62. it('should not replace values with an uppercase P or X', function () {
  63. var rules = '.rule { margin: 12px calc(100% - 14PX); height: calc(100% - 20px); font-size: 12Px; line-height: 16px; }';
  64. var expected = '.rule { margin: 3.75vw calc(100% - 14PX); height: calc(100% - 6.25vw); font-size: 12Px; line-height: 5vw; }';
  65. var processed = postcss(pxToViewport()).process(rules).css;
  66. expect(processed).toBe(expected);
  67. });
  68. });
  69. describe('unitToConvert', function() {
  70. it('should ignore non px values by default', function () {
  71. var expected = '.rule { font-size: 2em }';
  72. var processed = postcss(pxToViewport()).process(expected).css;
  73. expect(processed).toBe(expected);
  74. });
  75. it('should convert only values described in options', function () {
  76. var rules = '.rule { font-size: 5em; line-height: 2px }';
  77. var expected = '.rule { font-size: 1.5625vw; line-height: 2px }';
  78. var options = {
  79. unitToConvert: 'em'
  80. };
  81. var processed = postcss(pxToViewport(options)).process(rules).css;
  82. expect(processed).toBe(expected);
  83. });
  84. });
  85. describe('viewportWidth', function() {
  86. it('should should replace using 320px by default', function() {
  87. var expected = '.rule { font-size: 4.6875vw }';
  88. var processed = postcss(pxToViewport()).process(basicCSS).css;
  89. expect(processed).toBe(expected);
  90. });
  91. it('should replace using viewportWidth from options', function() {
  92. var expected = '.rule { font-size: 3.125vw }';
  93. var options = {
  94. viewportWidth: 480
  95. };
  96. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  97. expect(processed).toBe(expected);
  98. })
  99. });
  100. describe('unitPrecision', function () {
  101. it('should replace using a decimal of 2 places', function () {
  102. var expected = '.rule { font-size: 4.69vw }';
  103. var options = {
  104. unitPrecision: 2
  105. };
  106. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  107. expect(processed).toBe(expected);
  108. });
  109. });
  110. describe('viewportUnit', function() {
  111. it('should replace using unit from options', function() {
  112. var rules = '.rule { margin-top: 15px }';
  113. var expected = '.rule { margin-top: 4.6875vh }';
  114. var options = {
  115. viewportUnit: 'vh'
  116. };
  117. var processed = postcss(pxToViewport(options)).process(rules).css;
  118. expect(processed).toBe(expected);
  119. });
  120. });
  121. describe('fontViewportUnit', function() {
  122. it('should replace only font-size using unit from options', function() {
  123. var rules = '.rule { margin-top: 15px; font-size: 8px; }';
  124. var expected = '.rule { margin-top: 4.6875vw; font-size: 2.5vmax; }';
  125. var options = {
  126. fontViewportUnit: 'vmax'
  127. };
  128. var processed = postcss(pxToViewport(options)).process(rules).css;
  129. expect(processed).toBe(expected);
  130. });
  131. });
  132. describe('selectorBlackList', function () {
  133. it('should ignore selectors in the selector black list', function () {
  134. var rules = '.rule { font-size: 15px } .rule2 { font-size: 15px }';
  135. var expected = '.rule { font-size: 4.6875vw } .rule2 { font-size: 15px }';
  136. var options = {
  137. selectorBlackList: ['.rule2']
  138. };
  139. var processed = postcss(pxToViewport(options)).process(rules).css;
  140. expect(processed).toBe(expected);
  141. });
  142. it('should ignore every selector with `body$`', function () {
  143. var rules = 'body { font-size: 16px; } .class-body$ { font-size: 16px; } .simple-class { font-size: 16px; }';
  144. var expected = 'body { font-size: 5vw; } .class-body$ { font-size: 16px; } .simple-class { font-size: 5vw; }';
  145. var options = {
  146. selectorBlackList: ['body$']
  147. };
  148. var processed = postcss(pxToViewport(options)).process(rules).css;
  149. expect(processed).toBe(expected);
  150. });
  151. it('should only ignore exactly `body`', function () {
  152. var rules = 'body { font-size: 16px; } .class-body { font-size: 16px; } .simple-class { font-size: 16px; }';
  153. var expected = 'body { font-size: 16px; } .class-body { font-size: 5vw; } .simple-class { font-size: 5vw; }';
  154. var options = {
  155. selectorBlackList: [/^body$/]
  156. };
  157. var processed = postcss(pxToViewport(options)).process(rules).css;
  158. expect(processed).toBe(expected);
  159. });
  160. });
  161. describe('mediaQuery', function () {
  162. it('should replace px inside media queries if opts.mediaQuery', function() {
  163. var options = {
  164. mediaQuery: true
  165. };
  166. var processed = postcss(pxToViewport(options)).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
  167. var expected = '@media (min-width: 500px) { .rule { font-size: 5vw } }';
  168. expect(processed).toBe(expected);
  169. });
  170. it('should not replace px inside media queries if not opts.mediaQuery', function() {
  171. var options = {
  172. mediaQuery: false
  173. };
  174. var processed = postcss(pxToViewport(options)).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
  175. var expected = '@media (min-width: 500px) { .rule { font-size: 16px } }';
  176. expect(processed).toBe(expected);
  177. });
  178. it('should replace px inside media queries if it has params orientation landscape and landscape option', function() {
  179. var options = {
  180. mediaQuery: true,
  181. landscape: true
  182. };
  183. var processed = postcss(pxToViewport(options)).process('@media (orientation-landscape) and (min-width: 500px) { .rule { font-size: 16px } }').css;
  184. var expected = '@media (orientation-landscape) and (min-width: 500px) { .rule { font-size: 2.8169vw } }';
  185. expect(processed).toBe(expected);
  186. });
  187. });
  188. describe('propList', function () {
  189. it('should only replace properties in the prop list', function () {
  190. var css = '.rule { font-size: 16px; margin: 16px; margin-left: 5px; padding: 5px; padding-right: 16px }';
  191. var expected = '.rule { font-size: 5vw; margin: 5vw; margin-left: 5px; padding: 5px; padding-right: 5vw }';
  192. var options = {
  193. propList: ['*font*', 'margin*', '!margin-left', '*-right', 'pad']
  194. };
  195. var processed = postcss(pxToViewport(options)).process(css).css;
  196. expect(processed).toBe(expected);
  197. });
  198. it('should only replace properties in the prop list with wildcard', function () {
  199. var css = '.rule { font-size: 16px; margin: 16px; margin-left: 5px; padding: 5px; padding-right: 16px }';
  200. var expected = '.rule { font-size: 16px; margin: 5vw; margin-left: 5px; padding: 5px; padding-right: 16px }';
  201. var options = {
  202. propList: ['*', '!margin-left', '!*padding*', '!font*']
  203. };
  204. var processed = postcss(pxToViewport(options)).process(css).css;
  205. expect(processed).toBe(expected);
  206. });
  207. it('should replace all properties when prop list is not given', function () {
  208. var rules = '.rule { margin: 16px; font-size: 15px }';
  209. var expected = '.rule { margin: 5vw; font-size: 4.6875vw }';
  210. var processed = postcss(pxToViewport()).process(rules).css;
  211. expect(processed).toBe(expected);
  212. });
  213. });
  214. describe('minPixelValue', function () {
  215. it('should not replace values below minPixelValue', function () {
  216. var options = {
  217. propWhiteList: [],
  218. minPixelValue: 2
  219. };
  220. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  221. var expected = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  222. var processed = postcss(pxToViewport(options)).process(rules).css;
  223. expect(processed).toBe(expected);
  224. });
  225. });
  226. describe('exclude', function () {
  227. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  228. var covered = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  229. it('when using regex at the time, the style should not be overwritten.', function () {
  230. var options = {
  231. exclude: /\/node_modules\//
  232. };
  233. var processed = postcss(pxToViewport(options)).process(rules, {
  234. from: '/node_modules/main.css'
  235. }).css;
  236. expect(processed).toBe(rules);
  237. });
  238. it('when using regex at the time, the style should be overwritten.', function () {
  239. var options = {
  240. exclude: /\/node_modules\//
  241. };
  242. var processed = postcss(pxToViewport(options)).process(rules, {
  243. from: '/example/main.css'
  244. }).css;
  245. expect(processed).toBe(covered);
  246. });
  247. it('when using array at the time, the style should not be overwritten.', function () {
  248. var options = {
  249. exclude: [/\/node_modules\//, /\/exclude\//]
  250. };
  251. var processed = postcss(pxToViewport(options)).process(rules, {
  252. from: '/exclude/main.css'
  253. }).css;
  254. expect(processed).toBe(rules);
  255. });
  256. it('when using array at the time, the style should be overwritten.', function () {
  257. var options = {
  258. exclude: [/\/node_modules\//, /\/exclude\//]
  259. };
  260. var processed = postcss(pxToViewport(options)).process(rules, {
  261. from: '/example/main.css'
  262. }).css;
  263. expect(processed).toBe(covered);
  264. });
  265. });
  266. describe('include', function () {
  267. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  268. var covered = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  269. it('when using regex at the time, the style should not be overwritten.', function () {
  270. var options = {
  271. include: /\/mobile\//
  272. };
  273. var processed = postcss(pxToViewport(options)).process(rules, {
  274. from: '/pc/main.css'
  275. }).css;
  276. expect(processed).toBe(rules);
  277. });
  278. it('when using regex at the time, the style should be overwritten.', function () {
  279. var options = {
  280. include: /\/mobile\//
  281. };
  282. var processed = postcss(pxToViewport(options)).process(rules, {
  283. from: '/mobile/main.css'
  284. }).css;
  285. expect(processed).toBe(covered);
  286. });
  287. it('when using array at the time, the style should not be overwritten.', function () {
  288. var options = {
  289. include: [/\/flexible\//, /\/mobile\//]
  290. };
  291. var processed = postcss(pxToViewport(options)).process(rules, {
  292. from: '/pc/main.css'
  293. }).css;
  294. expect(processed).toBe(rules);
  295. });
  296. it('when using array at the time, the style should be overwritten.', function () {
  297. var options = {
  298. include: [/\/flexible\//, /\/mobile\//]
  299. };
  300. var processed = postcss(pxToViewport(options)).process(rules, {
  301. from: '/flexible/main.css'
  302. }).css;
  303. expect(processed).toBe(covered);
  304. });
  305. });
  306. describe('include-and-exclude', function () {
  307. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  308. var covered = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  309. it('when using regex at the time, the style should not be overwritten.', function () {
  310. var options = {
  311. include: /\/mobile\//,
  312. exclude: /\/not-transform\//
  313. };
  314. var processed = postcss(pxToViewport(options)).process(rules, {
  315. from: '/mobile/not-transform/main.css'
  316. }).css;
  317. expect(processed).toBe(rules);
  318. });
  319. it('when using regex at the time, the style should be overwritten.', function () {
  320. var options = {
  321. include: /\/mobile\//,
  322. exclude: /\/not-transform\//
  323. };
  324. var processed = postcss(pxToViewport(options)).process(rules, {
  325. from: '/mobile/style/main.css'
  326. }).css;
  327. expect(processed).toBe(covered);
  328. });
  329. it('when using array at the time, the style should not be overwritten.', function () {
  330. var options = {
  331. include: [/\/flexible\//, /\/mobile\//],
  332. exclude: [/\/not-transform\//, /pc/]
  333. };
  334. var processed = postcss(pxToViewport(options)).process(rules, {
  335. from: '/flexible/not-transform/main.css'
  336. }).css;
  337. expect(processed).toBe(rules);
  338. });
  339. it('when using regex at the time, the style should be overwritten.', function () {
  340. var options = {
  341. include: [/\/flexible\//, /\/mobile\//],
  342. exclude: [/\/not-transform\//, /pc/]
  343. };
  344. var processed = postcss(pxToViewport(options)).process(rules, {
  345. from: '/mobile/style/main.css'
  346. }).css;
  347. expect(processed).toBe(covered);
  348. });
  349. });
  350. describe('regex', function () {
  351. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  352. var covered = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  353. it('when using regex at the time, the style should not be overwritten.', function () {
  354. var options = {
  355. exclude: /pc/
  356. };
  357. var processed = postcss(pxToViewport(options)).process(rules, {
  358. from: '/pc-project/main.css'
  359. }).css;
  360. expect(processed).toBe(rules);
  361. });
  362. it('when using regex at the time, the style should be overwritten.', function () {
  363. var options = {
  364. exclude: /\/pc\//
  365. };
  366. var processed = postcss(pxToViewport(options)).process(rules, {
  367. from: '/pc-project/main.css'
  368. }).css;
  369. expect(processed).toBe(covered);
  370. });
  371. it('when using regex at the time, the style should not be overwritten.', function () {
  372. var options = {
  373. include: /\/pc\//
  374. };
  375. var processed = postcss(pxToViewport(options)).process(rules, {
  376. from: '/pc-project/main.css'
  377. }).css;
  378. expect(processed).toBe(rules);
  379. });
  380. it('when using regex at the time, the style should be overwritten.', function () {
  381. var options = {
  382. include: /pc/
  383. };
  384. var processed = postcss(pxToViewport(options)).process(rules, {
  385. from: '/pc-project/main.css'
  386. }).css;
  387. expect(processed).toBe(covered);
  388. });
  389. });
  390. describe('replace', function () {
  391. it('should leave fallback pixel unit with root em value', function () {
  392. var options = {
  393. replace: false
  394. };
  395. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  396. var expected = '.rule { font-size: 15px; font-size: 4.6875vw }';
  397. expect(processed).toBe(expected);
  398. });
  399. });
  400. describe('filter-prop-list', function () {
  401. it('should find "exact" matches from propList', function () {
  402. var propList = ['font-size', 'margin', '!padding', '*border*', '*', '*y', '!*font*'];
  403. var expected = 'font-size,margin';
  404. expect(filterPropList.exact(propList).join()).toBe(expected);
  405. });
  406. it('should find "contain" matches from propList and reduce to string', function () {
  407. var propList = ['font-size', '*margin*', '!padding', '*border*', '*', '*y', '!*font*'];
  408. var expected = 'margin,border';
  409. expect(filterPropList.contain(propList).join()).toBe(expected);
  410. });
  411. it('should find "start" matches from propList and reduce to string', function () {
  412. var propList = ['font-size', '*margin*', '!padding', 'border*', '*', '*y', '!*font*'];
  413. var expected = 'border';
  414. expect(filterPropList.startWith(propList).join()).toBe(expected);
  415. });
  416. it('should find "end" matches from propList and reduce to string', function () {
  417. var propList = ['font-size', '*margin*', '!padding', 'border*', '*', '*y', '!*font*'];
  418. var expected = 'y';
  419. expect(filterPropList.endWith(propList).join()).toBe(expected);
  420. });
  421. it('should find "not" matches from propList and reduce to string', function () {
  422. var propList = ['font-size', '*margin*', '!padding', 'border*', '*', '*y', '!*font*'];
  423. var expected = 'padding';
  424. expect(filterPropList.notExact(propList).join()).toBe(expected);
  425. });
  426. it('should find "not contain" matches from propList and reduce to string', function () {
  427. var propList = ['font-size', '*margin*', '!padding', '!border*', '*', '*y', '!*font*'];
  428. var expected = 'font';
  429. expect(filterPropList.notContain(propList).join()).toBe(expected);
  430. });
  431. it('should find "not start" matches from propList and reduce to string', function () {
  432. var propList = ['font-size', '*margin*', '!padding', '!border*', '*', '*y', '!*font*'];
  433. var expected = 'border';
  434. expect(filterPropList.notStartWith(propList).join()).toBe(expected);
  435. });
  436. it('should find "not end" matches from propList and reduce to string', function () {
  437. var propList = ['font-size', '*margin*', '!padding', '!border*', '*', '!*y', '!*font*'];
  438. var expected = 'y';
  439. expect(filterPropList.notEndWith(propList).join()).toBe(expected);
  440. });
  441. });
  442. describe('landscape', function() {
  443. it('should add landscape atRule', function() {
  444. var css = '.rule { font-size: 16px; margin: 16px; margin-left: 5px; padding: 5px; padding-right: 16px }';
  445. var expected = '.rule { font-size: 5vw; margin: 5vw; margin-left: 1.5625vw; padding: 1.5625vw; padding-right: 5vw }@media (orientation: landscape) {.rule { font-size: 2.8169vw; margin: 2.8169vw; margin-left: 0.88028vw; padding: 0.88028vw; padding-right: 2.8169vw } }';
  446. var options = {
  447. landscape: true
  448. };
  449. var processed = postcss(pxToViewport(options)).process(css).css;
  450. expect(processed).toBe(expected);
  451. });
  452. it('should add landscape atRule with specified landscapeUnits', function() {
  453. var css = '.rule { font-size: 16px; margin: 16px; margin-left: 5px; padding: 5px; padding-right: 16px }';
  454. var expected = '.rule { font-size: 5vw; margin: 5vw; margin-left: 1.5625vw; padding: 1.5625vw; padding-right: 5vw }@media (orientation: landscape) {.rule { font-size: 2.8169vh; margin: 2.8169vh; margin-left: 0.88028vh; padding: 0.88028vh; padding-right: 2.8169vh } }';
  455. var options = {
  456. landscape: true,
  457. landscapeUnit: 'vh'
  458. };
  459. var processed = postcss(pxToViewport(options)).process(css).css;
  460. expect(processed).toBe(expected);
  461. });
  462. it('should not add landscape atRule in mediaQueries', function() {
  463. var css = '@media (min-width: 500px) { .rule { font-size: 16px } }';
  464. var expected = '@media (min-width: 500px) { .rule { font-size: 5vw } }';
  465. var options = {
  466. landscape: true,
  467. mediaQuery: true
  468. };
  469. var processed = postcss(pxToViewport(options)).process(css).css;
  470. expect(processed).toBe(expected);
  471. });
  472. it('should not replace values inside landscape atRule', function() {
  473. var options = {
  474. replace: false,
  475. landscape: true
  476. };
  477. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  478. var expected = '.rule { font-size: 15px; font-size: 4.6875vw }@media (orientation: landscape) {.rule { font-size: 2.64085vw } }';
  479. expect(processed).toBe(expected);
  480. });
  481. it('should add landscape atRule with specified landscapeWidth', function() {
  482. var options = {
  483. landscape: true,
  484. landscapeWidth: 768
  485. };
  486. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  487. var expected = '.rule { font-size: 4.6875vw }@media (orientation: landscape) {.rule { font-size: 1.95313vw } }';
  488. expect(processed).toBe(expected);
  489. });
  490. it('should not add landscape atRule if it has no nodes', function() {
  491. var css = '.rule { font-size: 15vw }';
  492. var options = {
  493. landscape: true
  494. };
  495. var processed = postcss(pxToViewport(options)).process(css).css;
  496. var expected = '.rule { font-size: 15vw }';
  497. expect(processed).toBe(expected);
  498. });
  499. });
  500. describe('/* px-to-viewport-ignore */ & /* px-to-viewport-ignore-next */', function() {
  501. it('should ignore right-commented', function() {
  502. var css = '.rule { font-size: 15px; /* simple comment */ width: 100px; /* px-to-viewport-ignore */ height: 50px; }';
  503. var expected = '.rule { font-size: 4.6875vw; /* simple comment */ width: 100px; height: 15.625vw; }';
  504. var processed = postcss(pxToViewport()).process(css).css;
  505. expect(processed).toBe(expected);
  506. });
  507. it('should ignore right-commented in multiline-css', function() {
  508. var css = '.rule {\n font-size: 15px;\n width: 100px; /*px-to-viewport-ignore*/\n height: 50px;\n}';
  509. var expected = '.rule {\n font-size: 4.6875vw;\n width: 100px;\n height: 15.625vw;\n}';
  510. var processed = postcss(pxToViewport()).process(css).css;
  511. expect(processed).toBe(expected);
  512. });
  513. it('should ignore before-commented in multiline-css', function() {
  514. var css = '.rule {\n font-size: 15px;\n /*px-to-viewport-ignore-next*/\n width: 100px;\n /*px-to-viewport-ignore*/\n height: 50px;\n}';
  515. var expected = '.rule {\n font-size: 4.6875vw;\n width: 100px;\n /*px-to-viewport-ignore*/\n height: 15.625vw;\n}';
  516. var processed = postcss(pxToViewport()).process(css).css;
  517. expect(processed).toBe(expected);
  518. });
  519. });