parse.spec.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { parse } from '../src'
  2. import { mockWarn } from '@vue/runtime-test'
  3. describe('compiler:sfc', () => {
  4. mockWarn()
  5. describe('source map', () => {
  6. test('style block', () => {
  7. const style = parse(`<style>\n.color {\n color: red;\n }\n</style>\n`)
  8. .styles[0]
  9. // TODO need to actually test this with SourceMapConsumer
  10. expect(style.map).not.toBeUndefined()
  11. })
  12. test('script block', () => {
  13. const script = parse(`<script>\nconsole.log(1)\n }\n</script>\n`).script
  14. // TODO need to actually test this with SourceMapConsumer
  15. expect(script!.map).not.toBeUndefined()
  16. })
  17. })
  18. test('pad content', () => {
  19. const content = `
  20. <template>
  21. <div></div>
  22. </template>
  23. <script>
  24. export default {}
  25. </script>
  26. <style>
  27. h1 { color: red }
  28. </style>`
  29. const padFalse = parse(content.trim(), { pad: false })
  30. expect(padFalse.template!.content).toBe('\n<div></div>\n')
  31. expect(padFalse.script!.content).toBe('\nexport default {}\n')
  32. expect(padFalse.styles[0].content).toBe('\nh1 { color: red }\n')
  33. const padTrue = parse(content.trim(), { pad: true })
  34. expect(padTrue.script!.content).toBe(
  35. Array(3 + 1).join('//\n') + '\nexport default {}\n'
  36. )
  37. expect(padTrue.styles[0].content).toBe(
  38. Array(6 + 1).join('\n') + '\nh1 { color: red }\n'
  39. )
  40. const padLine = parse(content.trim(), { pad: 'line' })
  41. expect(padLine.script!.content).toBe(
  42. Array(3 + 1).join('//\n') + '\nexport default {}\n'
  43. )
  44. expect(padLine.styles[0].content).toBe(
  45. Array(6 + 1).join('\n') + '\nh1 { color: red }\n'
  46. )
  47. const padSpace = parse(content.trim(), { pad: 'space' })
  48. expect(padSpace.script!.content).toBe(
  49. `<template>\n<div></div>\n</template>\n<script>`.replace(/./g, ' ') +
  50. '\nexport default {}\n'
  51. )
  52. expect(padSpace.styles[0].content).toBe(
  53. `<template>\n<div></div>\n</template>\n<script>\nexport default {}\n</script>\n<style>`.replace(
  54. /./g,
  55. ' '
  56. ) + '\nh1 { color: red }\n'
  57. )
  58. })
  59. test('should ignore nodes with no content', () => {
  60. expect(parse(`<template/>`).template).toBe(null)
  61. expect(parse(`<script/>`).script).toBe(null)
  62. expect(parse(`<style/>`).styles.length).toBe(0)
  63. expect(parse(`<custom/>`).customBlocks.length).toBe(0)
  64. })
  65. describe('error', () => {
  66. test('should only allow single template element', () => {
  67. parse(`<template><div/></template><template><div/></template>`)
  68. expect(
  69. `Single file component can contain only one template element`
  70. ).toHaveBeenWarned()
  71. })
  72. test('should only allow single script element', () => {
  73. parse(`<script>console.log(1)</script><script>console.log(1)</script>`)
  74. expect(
  75. `Single file component can contain only one script element`
  76. ).toHaveBeenWarned()
  77. })
  78. })
  79. })