component.spec.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import {
  2. type ComponentInternalInstance,
  3. getCurrentInstance,
  4. h,
  5. nodeOps,
  6. render,
  7. } from '@vue/runtime-test'
  8. import { formatComponentName } from '../src/component'
  9. describe('formatComponentName', () => {
  10. test('default name', () => {
  11. let instance: ComponentInternalInstance | null = null
  12. const Comp = {
  13. setup() {
  14. instance = getCurrentInstance()
  15. return () => null
  16. },
  17. }
  18. render(h(Comp), nodeOps.createElement('div'))
  19. expect(formatComponentName(null, Comp)).toBe('Anonymous')
  20. expect(formatComponentName(null, Comp, true)).toBe('App')
  21. expect(formatComponentName(instance, Comp)).toBe('Anonymous')
  22. expect(formatComponentName(instance, Comp, true)).toBe('App')
  23. })
  24. test('name option', () => {
  25. let instance: ComponentInternalInstance | null = null
  26. const Comp = {
  27. name: 'number-input',
  28. setup() {
  29. instance = getCurrentInstance()
  30. return () => null
  31. },
  32. }
  33. render(h(Comp), nodeOps.createElement('div'))
  34. expect(formatComponentName(null, Comp)).toBe('NumberInput')
  35. expect(formatComponentName(instance, Comp, true)).toBe('NumberInput')
  36. })
  37. test('self recursive name', () => {
  38. let instance: ComponentInternalInstance | null = null
  39. const Comp = {
  40. components: {} as any,
  41. setup() {
  42. instance = getCurrentInstance()
  43. return () => null
  44. },
  45. }
  46. Comp.components.ToggleButton = Comp
  47. render(h(Comp), nodeOps.createElement('div'))
  48. expect(formatComponentName(instance, Comp)).toBe('ToggleButton')
  49. })
  50. test('name from parent', () => {
  51. let instance: ComponentInternalInstance | null = null
  52. const Comp = {
  53. setup() {
  54. instance = getCurrentInstance()
  55. return () => null
  56. },
  57. }
  58. const Parent = {
  59. components: {
  60. list_item: Comp,
  61. },
  62. render() {
  63. return h(Comp)
  64. },
  65. }
  66. render(h(Parent), nodeOps.createElement('div'))
  67. expect(formatComponentName(instance, Comp)).toBe('ListItem')
  68. })
  69. test('functional components', () => {
  70. const UserAvatar = () => null
  71. expect(formatComponentName(null, UserAvatar)).toBe('UserAvatar')
  72. UserAvatar.displayName = 'UserPicture'
  73. expect(formatComponentName(null, UserAvatar)).toBe('UserPicture')
  74. expect(formatComponentName(null, () => null)).toBe('Anonymous')
  75. })
  76. test('Name from file', () => {
  77. const Comp = {
  78. __file: './src/locale-dropdown.vue',
  79. }
  80. expect(formatComponentName(null, Comp)).toBe('LocaleDropdown')
  81. })
  82. test('inferred name', () => {
  83. const Comp = {
  84. __name: 'MainSidebar',
  85. }
  86. expect(formatComponentName(null, Comp)).toBe('MainSidebar')
  87. })
  88. test('global component', () => {
  89. let instance: ComponentInternalInstance | null = null
  90. const Comp = {
  91. setup() {
  92. instance = getCurrentInstance()
  93. return () => null
  94. },
  95. }
  96. render(h(Comp), nodeOps.createElement('div'))
  97. instance!.appContext.components.FieldLabel = Comp
  98. expect(formatComponentName(instance, Comp)).toBe('FieldLabel')
  99. })
  100. test('name precedence', () => {
  101. let instance: ComponentInternalInstance | null = null
  102. const Dummy = () => null
  103. const Comp: Record<string, any> = {
  104. components: { Dummy },
  105. setup() {
  106. instance = getCurrentInstance()
  107. return () => null
  108. },
  109. }
  110. const Parent = {
  111. components: { Dummy } as any,
  112. render() {
  113. return h(Comp)
  114. },
  115. }
  116. render(h(Parent), nodeOps.createElement('div'))
  117. expect(formatComponentName(instance, Comp)).toBe('Anonymous')
  118. expect(formatComponentName(instance, Comp, true)).toBe('App')
  119. instance!.appContext.components.CompA = Comp
  120. expect(formatComponentName(instance, Comp)).toBe('CompA')
  121. expect(formatComponentName(instance, Comp, true)).toBe('CompA')
  122. Parent.components.CompB = Comp
  123. expect(formatComponentName(instance, Comp)).toBe('CompB')
  124. Comp.components.CompC = Comp
  125. expect(formatComponentName(instance, Comp)).toBe('CompC')
  126. Comp.__file = './CompD.js'
  127. expect(formatComponentName(instance, Comp)).toBe('CompD')
  128. Comp.__name = 'CompE'
  129. expect(formatComponentName(instance, Comp)).toBe('CompE')
  130. Comp.name = 'CompF'
  131. expect(formatComponentName(instance, Comp)).toBe('CompF')
  132. })
  133. })