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.

209 lines
7.1 KiB

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. });
  32. describe('value parsing', function() {
  33. it('should not replace values in double quotes or single quotes', function () {
  34. var options = {
  35. propList: ['*']
  36. };
  37. var rules = '.rule { content: \'16px\'; font-family: "16px"; font-size: 16px; }';
  38. var expected = '.rule { content: \'16px\'; font-family: "16px"; font-size: 5vw; }';
  39. var processed = postcss(pxToViewport(options)).process(rules).css;
  40. expect(processed).toBe(expected);
  41. });
  42. it('should not replace values in `url()`', function () {
  43. var rules = '.rule { background: url(16px.jpg); font-size: 16px; }';
  44. var expected = '.rule { background: url(16px.jpg); font-size: 5vw; }';
  45. var processed = postcss(pxToViewport()).process(rules).css;
  46. expect(processed).toBe(expected);
  47. });
  48. it('should not replace values with an uppercase P or X', function () {
  49. var options = {
  50. propList: ['*']
  51. };
  52. var rules = '.rule { margin: 12px calc(100% - 14PX); height: calc(100% - 20px); font-size: 12Px; line-height: 16px; }';
  53. var expected = '.rule { margin: 3.75vw calc(100% - 14PX); height: calc(100% - 6.25vw); font-size: 12Px; line-height: 5vw; }';
  54. var processed = postcss(pxToViewport(options)).process(rules).css;
  55. expect(processed).toBe(expected);
  56. });
  57. });
  58. describe('unitToConvert', function() {
  59. it('should ignore non px values by default', function () {
  60. var expected = '.rule { font-size: 2em }';
  61. var processed = postcss(pxToViewport()).process(expected).css;
  62. expect(processed).toBe(expected);
  63. });
  64. it('should convert only values described in options', function () {
  65. var rules = '.rule { font-size: 5em; line-height: 2px }';
  66. var expected = '.rule { font-size: 1.5625vw; line-height: 2px }';
  67. var options = {
  68. unitToConvert: 'em'
  69. };
  70. var processed = postcss(pxToViewport(options)).process(rules).css;
  71. expect(processed).toBe(expected);
  72. });
  73. });
  74. describe('viewportWidth', function() {
  75. it('should should replace using 320px by default', function() {
  76. var expected = '.rule { font-size: 4.6875vw }';
  77. var processed = postcss(pxToViewport()).process(basicCSS).css;
  78. expect(processed).toBe(expected);
  79. });
  80. it('should replace using viewportWidth from options', function() {
  81. var expected = '.rule { font-size: 3.125vw }';
  82. var options = {
  83. viewportWidth: 480
  84. }
  85. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  86. expect(processed).toBe(expected);
  87. })
  88. });
  89. describe('unitPrecision', function () {
  90. it('should replace using a decimal of 2 places', function () {
  91. var expected = '.rule { font-size: 4.69vw }';
  92. var options = {
  93. unitPrecision: 2
  94. };
  95. var processed = postcss(pxToViewport(options)).process(basicCSS).css;
  96. expect(processed).toBe(expected);
  97. });
  98. });
  99. describe('viewportUnit', function() {
  100. it('should replace using unit from options', function() {
  101. var rules = '.rule { margin-top: 15px }';
  102. var expected = '.rule { margin-top: 4.6875vh }';
  103. var options = {
  104. viewportUnit: 'vh'
  105. };
  106. var processed = postcss(pxToViewport(options)).process(rules).css;
  107. expect(processed).toBe(expected);
  108. });
  109. });
  110. describe('fontViewportUnit', function() {
  111. it('should replace only font-size using unit from options', function() {
  112. var rules = '.rule { margin-top: 15px; font-size: 8px; }';
  113. var expected = '.rule { margin-top: 4.6875vw; font-size: 2.5vmax; }';
  114. var options = {
  115. fontViewportUnit: 'vmax'
  116. };
  117. var processed = postcss(pxToViewport(options)).process(rules).css;
  118. expect(processed).toBe(expected);
  119. });
  120. });
  121. describe('selectorBlackList', function () {
  122. it('should ignore selectors in the selector black list', function () {
  123. var rules = '.rule { font-size: 15px } .rule2 { font-size: 15px }';
  124. var expected = '.rule { font-size: 4.6875vw } .rule2 { font-size: 15px }';
  125. var options = {
  126. selectorBlackList: ['.rule2']
  127. };
  128. var processed = postcss(pxToViewport(options)).process(rules).css;
  129. expect(processed).toBe(expected);
  130. });
  131. it('should ignore every selector with `body$`', function () {
  132. var rules = 'body { font-size: 16px; } .class-body$ { font-size: 16px; } .simple-class { font-size: 16px; }';
  133. var expected = 'body { font-size: 5vw; } .class-body$ { font-size: 16px; } .simple-class { font-size: 5vw; }';
  134. var options = {
  135. selectorBlackList: ['body$']
  136. };
  137. var processed = postcss(pxToViewport(options)).process(rules).css;
  138. expect(processed).toBe(expected);
  139. });
  140. it('should only ignore exactly `body`', function () {
  141. var rules = 'body { font-size: 16px; } .class-body { font-size: 16px; } .simple-class { font-size: 16px; }';
  142. var expected = 'body { font-size: 16px; } .class-body { font-size: 5vw; } .simple-class { font-size: 5vw; }';
  143. var options = {
  144. selectorBlackList: [/^body$/]
  145. };
  146. var processed = postcss(pxToViewport(options)).process(rules).css;
  147. expect(processed).toBe(expected);
  148. });
  149. });
  150. describe('mediaQuery', function () {
  151. it('should replace px in media queries', function () {
  152. var options = {
  153. mediaQuery: true
  154. };
  155. var processed = postcss(pxToViewport(options)).process('@media (min-width: 500px) { .rule { font-size: 16px } }').css;
  156. var expected = '@media (min-width: 156.25vw) { .rule { font-size: 5vw } }';
  157. expect(processed).toBe(expected);
  158. });
  159. });
  160. describe('minPixelValue', function () {
  161. it('should not replace values below minPixelValue', function () {
  162. var options = {
  163. propWhiteList: [],
  164. minPixelValue: 2
  165. };
  166. var rules = '.rule { border: 1px solid #000; font-size: 16px; margin: 1px 10px; }';
  167. var expected = '.rule { border: 1px solid #000; font-size: 5vw; margin: 1px 3.125vw; }';
  168. var processed = postcss(pxToViewport(options)).process(rules).css;
  169. expect(processed).toBe(expected);
  170. });
  171. });