parseAnimationValue.test.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import parseAnimationValue from '../src/util/parseAnimationValue'
  2. describe('Tailwind Defaults', () => {
  3. it.each([
  4. [
  5. 'spin 1s linear infinite',
  6. {
  7. value: 'spin 1s linear infinite',
  8. name: 'spin',
  9. duration: '1s',
  10. timingFunction: 'linear',
  11. iterationCount: 'infinite',
  12. },
  13. ],
  14. [
  15. 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
  16. {
  17. value: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
  18. name: 'ping',
  19. duration: '1s',
  20. timingFunction: 'cubic-bezier(0, 0, 0.2, 1)',
  21. iterationCount: 'infinite',
  22. },
  23. ],
  24. [
  25. 'bounce 1s infinite',
  26. {
  27. value: 'bounce 1s infinite',
  28. name: 'bounce',
  29. duration: '1s',
  30. iterationCount: 'infinite',
  31. },
  32. ],
  33. ])('should be possible to parse: "%s"', (input, expected) => {
  34. const parsed = parseAnimationValue(input)
  35. expect(parsed).toHaveLength(1)
  36. expect(parsed[0]).toEqual(expected)
  37. })
  38. })
  39. describe('css variables', () => {
  40. it('should be possible to use css variables', () => {
  41. let parsed = parseAnimationValue('jump var(--animation-duration, 10s) linear infinite')
  42. expect(parsed[0]).toEqual({
  43. value: 'jump var(--animation-duration, 10s) linear infinite',
  44. name: 'jump',
  45. timingFunction: 'linear',
  46. iterationCount: 'infinite',
  47. unknown: ['var(--animation-duration, 10s)'],
  48. })
  49. })
  50. })
  51. describe('MDN Examples', () => {
  52. it.each([
  53. [
  54. '3s ease-in 1s 2 reverse both paused slidein',
  55. {
  56. value: '3s ease-in 1s 2 reverse both paused slidein',
  57. delay: '1s',
  58. direction: 'reverse',
  59. duration: '3s',
  60. fillMode: 'both',
  61. iterationCount: '2',
  62. name: 'slidein',
  63. playState: 'paused',
  64. timingFunction: 'ease-in',
  65. },
  66. ],
  67. [
  68. 'slidein 3s linear 1s',
  69. {
  70. value: 'slidein 3s linear 1s',
  71. delay: '1s',
  72. duration: '3s',
  73. name: 'slidein',
  74. timingFunction: 'linear',
  75. },
  76. ],
  77. ['slidein 3s', { value: 'slidein 3s', duration: '3s', name: 'slidein' }],
  78. ])('should be possible to parse: "%s"', (input, expected) => {
  79. const parsed = parseAnimationValue(input)
  80. expect(parsed).toHaveLength(1)
  81. expect(parsed[0]).toEqual(expected)
  82. })
  83. })
  84. describe('duration & delay', () => {
  85. it.each([
  86. // Positive seconds (integer)
  87. ['spin 2s 1s linear', { duration: '2s', delay: '1s' }],
  88. // Negative seconds (integer)
  89. ['spin -2s -1s linear', { duration: '-2s', delay: '-1s' }],
  90. // Positive seconds (float)
  91. ['spin 2.321s 1.321s linear', { duration: '2.321s', delay: '1.321s' }],
  92. // Negative seconds (float)
  93. ['spin -2.321s -1.321s linear', { duration: '-2.321s', delay: '-1.321s' }],
  94. // Positive milliseconds (integer)
  95. ['spin 200ms 100ms linear', { duration: '200ms', delay: '100ms' }],
  96. // Negative milliseconds (integer)
  97. ['spin -200ms -100ms linear', { duration: '-200ms', delay: '-100ms' }],
  98. // Positive milliseconds (float)
  99. ['spin 200.321ms 100.321ms linear', { duration: '200.321ms', delay: '100.321ms' }],
  100. // Negative milliseconds (float)
  101. ['spin -200.321ms -100.321ms linear', { duration: '-200.321ms', delay: '-100.321ms' }],
  102. ])('should be possible to parse "%s" into %o', (input, { duration, delay }) => {
  103. const parsed = parseAnimationValue(input)
  104. expect(parsed).toHaveLength(1)
  105. expect(parsed[0].duration).toEqual(duration)
  106. expect(parsed[0].delay).toEqual(delay)
  107. })
  108. })
  109. describe('iteration count', () => {
  110. it.each([
  111. // Number
  112. ['1 spin 200s 100s linear', '1'],
  113. ['spin 2 200s 100s linear', '2'],
  114. ['spin 200s 3 100s linear', '3'],
  115. ['spin 200s 100s 4 linear', '4'],
  116. ['spin 200s 100s linear 5', '5'],
  117. // Infinite
  118. ['infinite spin 200s 100s linear', 'infinite'],
  119. ['spin infinite 200s 100s linear', 'infinite'],
  120. ['spin 200s infinite 100s linear', 'infinite'],
  121. ['spin 200s 100s infinite linear', 'infinite'],
  122. ['spin 200s 100s linear infinite', 'infinite'],
  123. ])(
  124. 'should be possible to parse "%s" with an iteraction count of "%s"',
  125. (input, iterationCount) => {
  126. const parsed = parseAnimationValue(input)
  127. expect(parsed).toHaveLength(1)
  128. expect(parsed[0].iterationCount).toEqual(iterationCount)
  129. }
  130. )
  131. })
  132. describe('multiple animations', () => {
  133. it('should be possible to parse multiple applications at once', () => {
  134. const input = [
  135. 'spin 1s linear infinite',
  136. 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
  137. 'pulse 2s cubic-bezier(0.4, 0, 0.6) infinite',
  138. ].join(',')
  139. const parsed = parseAnimationValue(input)
  140. expect(parsed).toHaveLength(3)
  141. expect(parsed).toEqual([
  142. {
  143. value: 'spin 1s linear infinite',
  144. name: 'spin',
  145. duration: '1s',
  146. timingFunction: 'linear',
  147. iterationCount: 'infinite',
  148. },
  149. {
  150. value: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
  151. name: 'ping',
  152. duration: '1s',
  153. timingFunction: 'cubic-bezier(0, 0, 0.2, 1)',
  154. iterationCount: 'infinite',
  155. },
  156. {
  157. value: 'pulse 2s cubic-bezier(0.4, 0, 0.6) infinite',
  158. name: 'pulse',
  159. duration: '2s',
  160. timingFunction: 'cubic-bezier(0.4, 0, 0.6)',
  161. iterationCount: 'infinite',
  162. },
  163. ])
  164. })
  165. })
  166. it.each`
  167. input | value | direction | playState | fillMode | iterationCount | timingFunction | duration | delay | name
  168. ${'1s spin 1s infinite'} | ${'1s spin 1s infinite'} | ${undefined} | ${undefined} | ${undefined} | ${'infinite'} | ${undefined} | ${'1s'} | ${'1s'} | ${'spin'}
  169. ${'infinite infinite 1s 1s'} | ${'infinite infinite 1s 1s'} | ${undefined} | ${undefined} | ${undefined} | ${'infinite'} | ${undefined} | ${'1s'} | ${'1s'} | ${'infinite'}
  170. ${'ease 1s ease 1s'} | ${'ease 1s ease 1s'} | ${undefined} | ${undefined} | ${undefined} | ${undefined} | ${'ease'} | ${'1s'} | ${'1s'} | ${'ease'}
  171. ${'normal paused backwards infinite ease-in 1s 2s name'} | ${'normal paused backwards infinite ease-in 1s 2s name'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  172. ${'paused backwards infinite ease-in 1s 2s name normal'} | ${'paused backwards infinite ease-in 1s 2s name normal'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  173. ${'backwards infinite ease-in 1s 2s name normal paused'} | ${'backwards infinite ease-in 1s 2s name normal paused'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  174. ${'infinite ease-in 1s 2s name normal paused backwards'} | ${'infinite ease-in 1s 2s name normal paused backwards'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  175. ${'ease-in 1s 2s name normal paused backwards infinite'} | ${'ease-in 1s 2s name normal paused backwards infinite'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  176. ${'1s 2s name normal paused backwards infinite ease-in'} | ${'1s 2s name normal paused backwards infinite ease-in'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  177. ${'2s name normal paused backwards infinite ease-in 1s'} | ${'2s name normal paused backwards infinite ease-in 1s'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'2s'} | ${'1s'} | ${'name'}
  178. ${'name normal paused backwards infinite ease-in 1s 2s'} | ${'name normal paused backwards infinite ease-in 1s 2s'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  179. ${' name normal paused backwards infinite ease-in 1s 2s '} | ${'name normal paused backwards infinite ease-in 1s 2s'} | ${'normal'} | ${'paused'} | ${'backwards'} | ${'infinite'} | ${'ease-in'} | ${'1s'} | ${'2s'} | ${'name'}
  180. `('should parse "$input" correctly', ({ input, ...expected }) => {
  181. let parsed = parseAnimationValue(input)
  182. expect(parsed).toHaveLength(1)
  183. expect(parsed[0]).toEqual(expected)
  184. })