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.

261 lines
8.7 KiB

7 years ago
7 years ago
7 years ago
  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. /* global describe, it, expect */
  6. 'use strict';
  7. var postcss = require('postcss');
  8. var pxToViewport = require('..');
  9. var basicCSS = '.rule { font-size: 15px }';
  10. describe('px-to-viewport', function() {
  11. it('should work on the readme example', function () {
  12. var input = 'h1 { margin: 0 0 20px; font-size: 32px; line-height: 2; letter-spacing: 1px; }';
  13. var output = 'h1 { margin: 0 0 6.25vw; font-size: 10vw; line-height: 2; letter-spacing: 1px; }';
  14. var processed = postcss(pxToViewport()).process(input).css;
  15. expect(processed).toBe(output);
  16. });
  17. it('should replace the px unit with vw', function () {
  18. var processed = postcss(pxToViewport()).process(basicCSS).css;
  19. var expected = '.rule { font-size: 4.6875vw }';
  20. expect(processed).toBe(expected);
  21. });
  22. it('should handle < 1 values and values without a leading 0', function () {
  23. var rules = '.rule { margin: 0.5rem .5px -0.2px -.2em }';
  24. var expected = '.rule { margin: 0.5rem 0.15625vw -0.0625vw -.2em }';
  25. var options = {
  26. minPixelValue: 0
  27. };
  28. var processed = postcss(pxToViewport(options)).process(rules).css;
  29. expect(processed).toBe(expected);
  30. });
  31. it('should remain unitless if 0', function () {
  32. var expected = '.rule { font-size: 0px; font-size: 0; }';
  33. var processed = postcss(pxToViewport()).process(expected).css;
  34. expect(processed).toBe(expected);
  35. });
  36. });
  37. describe('value parsing', function() {
  38. it('should not replace values in double quotes or single quotes', function () {
  39. var options = {
  40. propList: ['*']
  41. };
  42. var rules = '.rule { content: \'16px\'; font-family: "16px"; font-size: 16px; }';
  43. var expected = '.rule { content: \'16px\'; font-family: "16px"; font-size: 5vw; }';
  44. var processed = postcss(pxToViewport(options)).process(rules).css;
  45. expect(processed).toBe(expected);
  46. });
  47. it('should not replace values in `url()`', function () {
  48. var rules = '.rule { background: url(16px.jpg); font-size: 16px; }';
  49. var expected = '.rule { background: url(16px.jpg); font-size: 5vw; }';
  50. var processed = postcss(pxToViewport()).process(rules).css;
  51. expect(processed).toBe(expected);
  52. });
  53. it('should not replace values with an uppercase P or X', function () {
  54. var rules = '.rule { margin: 12px calc(100% - 14PX); height: calc(100% - 20px); font-size: 12Px; line-height: 16px; }';
  55. var expected = '.rule { margin: 3.75vw calc(100% - 14PX); height: calc(100% - 6.25vw); font-size: 12Px; line-height: 5vw; }';
  56. var processed = postcss(pxToViewport()).process(rules).css;
  57. expect(processed).toBe(expected);
  58. });
  59. });
  60. describe('unitToConvert', function() {
  61. it('should ignore non px values by default', function () {
  62. var expected = '.rule { font-size: 2em }';
  63. var processed = postcss(pxToViewport()).process(expected).css;
  64. expect(processed).toBe(expected);
  65. });
  66. it('should convert only values described in options', function () {
  67. var rules = '.rule { font-size: 5em; line-height: 2px }';
  68. var expected = '.rule { font-size: 1.5625vw; line-height: 2px }';
  69. var options = {
  70. unitToConvert: 'em'
  71. };
  72. var processed = postcss(pxToViewport(options)).process(rules).css;
  73. expect(processed).toBe(expected);
  74. });
  75. });
  76. describe('viewportWidth', function() {
  77. it('should should replace using 320px by default', function() {
  78. var expected = '.rule { font-size: 4.6875vw }';
  79. var processed = postcss(pxToViewport()).process(basicCSS).css;
  80. expect(processed).toBe(expected);
  81. });
  82. it('should replace using viewportWidth from options', function() {
  83. var expected = '.rule { font-size: 3.125vw }';
  84. var options = {
  85. viewportWidth: 480
  86. }
  87. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  88. expect(processed).toBe(expected);
  89. })
  90. });
  91. describe('unitPrecision', function () {
  92. it('should replace using a decimal of 2 places', function () {
  93. var expected = '.rule { font-size: 4.69vw }';
  94. var options = {
  95. unitPrecision: 2
  96. };
  97. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  98. expect(processed).toBe(expected);
  99. });
  100. });
  101. describe('viewportUnit', function() {
  102. it('should replace using unit from options', function() {
  103. var rules = '.rule { margin-top: 15px }';
  104. var expected = '.rule { margin-top: 4.6875vh }';
  105. var options = {
  106. viewportUnit: 'vh'
  107. };
  108. var processed = postcss(pxToViewport(options)).process(rules).css;
  109. expect(processed).toBe(expected);
  110. });
  111. });
  112. describe('fontViewportUnit', function() {
  113. it('should replace only font-size using unit from options', function() {
  114. var rules = '.rule { margin-top: 15px; font-size: 8px; }';
  115. var expected = '.rule { margin-top: 4.6875vw; font-size: 2.5vmax; }';
  116. var options = {
  117. fontViewportUnit: 'vmax'
  118. };
  119. var processed = postcss(pxToViewport(options)).process(rules).css;
  120. expect(processed).toBe(expected);
  121. });
  122. });
  123. describe('selectorBlackList', function () {
  124. it('should ignore selectors in the selector black list', function () {
  125. var rules = '.rule { font-size: 15px } .rule2 { font-size: 15px }';
  126. var expected = '.rule { font-size: 4.6875vw } .rule2 { font-size: 15px }';
  127. var options = {
  128. selectorBlackList: ['.rule2']
  129. };
  130. var processed = postcss(pxToViewport(options)).process(rules).css;
  131. expect(processed).toBe(expected);
  132. });
  133. it('should ignore every selector with `body$`', function () {
  134. var rules = 'body { font-size: 16px; } .class-body$ { font-size: 16px; } .simple-class { font-size: 16px; }';
  135. var expected = 'body { font-size: 5vw; } .class-body$ { font-size: 16px; } .simple-class { font-size: 5vw; }';
  136. var options = {
  137. selectorBlackList: ['body$']
  138. };
  139. var processed = postcss(pxToViewport(options)).process(rules).css;
  140. expect(processed).toBe(expected);
  141. });
  142. it('should only ignore exactly `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: 16px; } .class-body { font-size: 5vw; } .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. });
  152. describe('mediaQuery', function () {
  153. it('should replace px in media queries', function () {
  154. var options = {
  155. mediaQuery: true
  156. };
  157. var processed = postcss(pxToViewport(options)).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
  158. var expected = '@media (min-width: 156.25vw) { .rule { font-size: 5vw } }';
  159. expect(processed).toBe(expected);
  160. });
  161. });
  162. describe('minPixelValue', function () {
  163. it('should not replace values below minPixelValue', function () {
  164. var options = {
  165. propWhiteList: [],
  166. minPixelValue: 2
  167. };
  168. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  169. var expected = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  170. var processed = postcss(pxToViewport(options)).process(rules).css;
  171. expect(processed).toBe(expected);
  172. });
  173. });
  174. describe('exclude', function () {
  175. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  176. var covered = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }'
  177. it('when using regex at the time, the style should not be overwritten.', function () {
  178. var options = {
  179. exclude: /node_modules/
  180. }
  181. var processed = postcss(pxToViewport(options)).process(rules, {
  182. from: '/node_modules/main.css'
  183. }).css;
  184. expect(processed).toBe(rules);
  185. });
  186. it('when using regex at the time, the style should be overwritten.', function () {
  187. var options = {
  188. exclude: /node_modules/
  189. }
  190. var processed = postcss(pxToViewport(options)).process(rules, {
  191. from: '/example/main.css'
  192. }).css;
  193. expect(processed).toBe(covered);
  194. });
  195. it('when using array at the time, the style should not be overwritten.', function () {
  196. var options = {
  197. exclude: [/node_modules/, /exclude/]
  198. }
  199. var processed = postcss(pxToViewport(options)).process(rules, {
  200. from: '/exclude/main.css'
  201. }).css;
  202. expect(processed).toBe(rules);
  203. });
  204. it('when using array at the time, the style should be overwritten.', function () {
  205. var options = {
  206. exclude: [/node_modules/, /exclude/]
  207. }
  208. var processed = postcss(pxToViewport(options)).process(rules, {
  209. from: '/example/main.css'
  210. }).css;
  211. expect(processed).toBe(covered);
  212. });
  213. });