glass-easel 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +40 -0
  2. package/dist/glass_easel.all.d.ts +1 -0
  3. package/dist/glass_easel.all.js +2 -0
  4. package/dist/glass_easel.all.js.map +1 -0
  5. package/dist/glass_easel.domlike.global.d.ts +1 -0
  6. package/dist/glass_easel.domlike.global.js +2 -0
  7. package/dist/glass_easel.domlike.global.js.map +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/types/src/backend/backend_protocol.d.ts +119 -0
  11. package/dist/types/src/backend/backend_protocol.d.ts.map +1 -0
  12. package/dist/types/src/backend/composed_backend_protocol.d.ts +90 -0
  13. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +1 -0
  14. package/dist/types/src/backend/domlike_backend_protocol.d.ts +76 -0
  15. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +1 -0
  16. package/dist/types/src/backend/mode.d.ts +46 -0
  17. package/dist/types/src/backend/mode.d.ts.map +1 -0
  18. package/dist/types/src/backend/suggested_backend_protocol.d.ts +30 -0
  19. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +1 -0
  20. package/dist/types/src/behavior.d.ts +428 -0
  21. package/dist/types/src/behavior.d.ts.map +1 -0
  22. package/dist/types/src/class_list.d.ts +79 -0
  23. package/dist/types/src/class_list.d.ts.map +1 -0
  24. package/dist/types/src/component.d.ts +291 -0
  25. package/dist/types/src/component.d.ts.map +1 -0
  26. package/dist/types/src/component_params.d.ts +239 -0
  27. package/dist/types/src/component_params.d.ts.map +1 -0
  28. package/dist/types/src/component_space.d.ts +164 -0
  29. package/dist/types/src/component_space.d.ts.map +1 -0
  30. package/dist/types/src/data_path.d.ts +5 -0
  31. package/dist/types/src/data_path.d.ts.map +1 -0
  32. package/dist/types/src/data_proxy.d.ts +107 -0
  33. package/dist/types/src/data_proxy.d.ts.map +1 -0
  34. package/dist/types/src/data_utils.d.ts +3 -0
  35. package/dist/types/src/data_utils.d.ts.map +1 -0
  36. package/dist/types/src/element.d.ts +275 -0
  37. package/dist/types/src/element.d.ts.map +1 -0
  38. package/dist/types/src/element_iterator.d.ts +43 -0
  39. package/dist/types/src/element_iterator.d.ts.map +1 -0
  40. package/dist/types/src/event.d.ts +104 -0
  41. package/dist/types/src/event.d.ts.map +1 -0
  42. package/dist/types/src/external_shadow_tree.d.ts +20 -0
  43. package/dist/types/src/external_shadow_tree.d.ts.map +1 -0
  44. package/dist/types/src/func_arr.d.ts +39 -0
  45. package/dist/types/src/func_arr.d.ts.map +1 -0
  46. package/dist/types/src/global_options.d.ts +111 -0
  47. package/dist/types/src/global_options.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +43 -0
  49. package/dist/types/src/index.d.ts.map +1 -0
  50. package/dist/types/src/mutation_observer.d.ts +79 -0
  51. package/dist/types/src/mutation_observer.d.ts.map +1 -0
  52. package/dist/types/src/native_node.d.ts +8 -0
  53. package/dist/types/src/native_node.d.ts.map +1 -0
  54. package/dist/types/src/node.d.ts +49 -0
  55. package/dist/types/src/node.d.ts.map +1 -0
  56. package/dist/types/src/relation.d.ts +47 -0
  57. package/dist/types/src/relation.d.ts.map +1 -0
  58. package/dist/types/src/render.d.ts +3 -0
  59. package/dist/types/src/render.d.ts.map +1 -0
  60. package/dist/types/src/selector.d.ts +32 -0
  61. package/dist/types/src/selector.d.ts.map +1 -0
  62. package/dist/types/src/shadow_root.d.ts +136 -0
  63. package/dist/types/src/shadow_root.d.ts.map +1 -0
  64. package/dist/types/src/template_engine.d.ts +18 -0
  65. package/dist/types/src/template_engine.d.ts.map +1 -0
  66. package/dist/types/src/text_node.d.ts +32 -0
  67. package/dist/types/src/text_node.d.ts.map +1 -0
  68. package/dist/types/src/tmpl/index.d.ts +18 -0
  69. package/dist/types/src/tmpl/index.d.ts.map +1 -0
  70. package/dist/types/src/tmpl/native_rendering.d.ts +45 -0
  71. package/dist/types/src/tmpl/native_rendering.d.ts.map +1 -0
  72. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +80 -0
  73. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +1 -0
  74. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +50 -0
  75. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +1 -0
  76. package/dist/types/src/tmpl/range_list_diff.d.ts +19 -0
  77. package/dist/types/src/tmpl/range_list_diff.d.ts.map +1 -0
  78. package/dist/types/src/trait_behaviors.d.ts +38 -0
  79. package/dist/types/src/trait_behaviors.d.ts.map +1 -0
  80. package/dist/types/src/virtual_node.d.ts +10 -0
  81. package/dist/types/src/virtual_node.d.ts.map +1 -0
  82. package/dist/types/tests/backend/domlike.test.d.ts +2 -0
  83. package/dist/types/tests/backend/domlike.test.d.ts.map +1 -0
  84. package/dist/types/tests/base/env.d.ts +29 -0
  85. package/dist/types/tests/base/env.d.ts.map +1 -0
  86. package/dist/types/tests/base/match.d.ts +9 -0
  87. package/dist/types/tests/base/match.d.ts.map +1 -0
  88. package/dist/types/tests/core/backend.test.d.ts +2 -0
  89. package/dist/types/tests/core/backend.test.d.ts.map +1 -0
  90. package/dist/types/tests/core/behavior.test.d.ts +2 -0
  91. package/dist/types/tests/core/behavior.test.d.ts.map +1 -0
  92. package/dist/types/tests/core/component_space.test.d.ts +2 -0
  93. package/dist/types/tests/core/component_space.test.d.ts.map +1 -0
  94. package/dist/types/tests/core/data_update.test.d.ts +2 -0
  95. package/dist/types/tests/core/data_update.test.d.ts.map +1 -0
  96. package/dist/types/tests/core/misc.test.d.ts +2 -0
  97. package/dist/types/tests/core/misc.test.d.ts.map +1 -0
  98. package/dist/types/tests/core/placeholder.test.d.ts +2 -0
  99. package/dist/types/tests/core/placeholder.test.d.ts.map +1 -0
  100. package/dist/types/tests/core/slot.test.d.ts +2 -0
  101. package/dist/types/tests/core/slot.test.d.ts.map +1 -0
  102. package/dist/types/tests/core/trait_behaviors.test.d.ts +2 -0
  103. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +1 -0
  104. package/dist/types/tests/tmpl/binding_map.test.d.ts +2 -0
  105. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +1 -0
  106. package/dist/types/tests/tmpl/event.test.d.ts +2 -0
  107. package/dist/types/tests/tmpl/event.test.d.ts.map +1 -0
  108. package/dist/types/tests/tmpl/expression.test.d.ts +2 -0
  109. package/dist/types/tests/tmpl/expression.test.d.ts.map +1 -0
  110. package/dist/types/tests/tmpl/lvalue.test.d.ts +2 -0
  111. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +1 -0
  112. package/dist/types/tests/tmpl/native_rendering.test.d.ts +2 -0
  113. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +1 -0
  114. package/dist/types/tests/tmpl/structure.test.d.ts +2 -0
  115. package/dist/types/tests/tmpl/structure.test.d.ts.map +1 -0
  116. package/dist/types/tests/types/chaining.test.d.ts +2 -0
  117. package/dist/types/tests/types/chaining.test.d.ts.map +1 -0
  118. package/dist/types/tests/types/createElement.test.d.ts +2 -0
  119. package/dist/types/tests/types/createElement.test.d.ts.map +1 -0
  120. package/dist/types/tests/types/definition.test.d.ts +2 -0
  121. package/dist/types/tests/types/definition.test.d.ts.map +1 -0
  122. package/guide/zh_CN/advanced/binding_map_update.md +32 -0
  123. package/guide/zh_CN/advanced/build_args.md +28 -0
  124. package/guide/zh_CN/advanced/component_filter.md +70 -0
  125. package/guide/zh_CN/advanced/component_space.md +124 -0
  126. package/guide/zh_CN/advanced/custom_backend.md +53 -0
  127. package/guide/zh_CN/advanced/error_listener.md +32 -0
  128. package/guide/zh_CN/advanced/external_component.md +73 -0
  129. package/guide/zh_CN/advanced/template_engine.md +61 -0
  130. package/guide/zh_CN/appendix/backend_protocol.md +501 -0
  131. package/guide/zh_CN/appendix/list_diff_algorithm.md +406 -0
  132. package/guide/zh_CN/basic/beginning.md +94 -0
  133. package/guide/zh_CN/basic/component.md +156 -0
  134. package/guide/zh_CN/basic/event.md +169 -0
  135. package/guide/zh_CN/basic/lifetime.md +66 -0
  136. package/guide/zh_CN/basic/method.md +62 -0
  137. package/guide/zh_CN/basic/template.md +135 -0
  138. package/guide/zh_CN/data_management/advanced_update.md +170 -0
  139. package/guide/zh_CN/data_management/data_deep_copy.md +157 -0
  140. package/guide/zh_CN/data_management/data_observer.md +154 -0
  141. package/guide/zh_CN/data_management/property_early_init.md +31 -0
  142. package/guide/zh_CN/data_management/pure_data_pattern.md +21 -0
  143. package/guide/zh_CN/index.md +93 -0
  144. package/guide/zh_CN/interaction/behavior.md +52 -0
  145. package/guide/zh_CN/interaction/component_path.md +37 -0
  146. package/guide/zh_CN/interaction/generic.md +73 -0
  147. package/guide/zh_CN/interaction/placeholder.md +40 -0
  148. package/guide/zh_CN/interaction/relation.md +151 -0
  149. package/guide/zh_CN/interaction/slot.md +137 -0
  150. package/guide/zh_CN/interaction/template_import.md +94 -0
  151. package/guide/zh_CN/interaction/trait_behavior.md +117 -0
  152. package/guide/zh_CN/styling/external_class.md +46 -0
  153. package/guide/zh_CN/styling/style_isolation.md +54 -0
  154. package/guide/zh_CN/styling/virtual_host.md +52 -0
  155. package/guide/zh_CN/tree/element_iterator.md +54 -0
  156. package/guide/zh_CN/tree/mutation_observer.md +52 -0
  157. package/guide/zh_CN/tree/node_tree.md +142 -0
  158. package/guide/zh_CN/tree/node_tree_modification.md +78 -0
  159. package/guide/zh_CN/tree/selector.md +66 -0
  160. package/jest.config.js +6 -0
  161. package/jest.dts.config.js +9 -0
  162. package/jest.unit.config.js +14 -0
  163. package/package.json +28 -0
  164. package/src/backend/backend_protocol.ts +313 -0
  165. package/src/backend/composed_backend_protocol.ts +252 -0
  166. package/src/backend/domlike_backend_protocol.ts +370 -0
  167. package/src/backend/mode.ts +51 -0
  168. package/src/backend/suggested_backend_protocol.ts +83 -0
  169. package/src/behavior.ts +1655 -0
  170. package/src/bootstrap_dom_dev.js +22 -0
  171. package/src/class_list.ts +376 -0
  172. package/src/component.ts +1309 -0
  173. package/src/component_params.ts +461 -0
  174. package/src/component_space.ts +547 -0
  175. package/src/data_path.ts +225 -0
  176. package/src/data_proxy.ts +670 -0
  177. package/src/data_utils.ts +50 -0
  178. package/src/element.ts +1966 -0
  179. package/src/element_iterator.ts +158 -0
  180. package/src/event.ts +401 -0
  181. package/src/external_shadow_tree.ts +27 -0
  182. package/src/func_arr.ts +198 -0
  183. package/src/global_options.ts +242 -0
  184. package/src/index.ts +187 -0
  185. package/src/mutation_observer.ts +252 -0
  186. package/src/native_node.ts +74 -0
  187. package/src/node.ts +174 -0
  188. package/src/relation.ts +380 -0
  189. package/src/render.ts +25 -0
  190. package/src/selector.ts +218 -0
  191. package/src/shadow_root.ts +766 -0
  192. package/src/template_engine.ts +45 -0
  193. package/src/text_node.ts +149 -0
  194. package/src/tmpl/index.ts +199 -0
  195. package/src/tmpl/native_rendering.ts +175 -0
  196. package/src/tmpl/proc_gen_wrapper.ts +954 -0
  197. package/src/tmpl/proc_gen_wrapper_dom.ts +230 -0
  198. package/src/tmpl/range_list_diff.ts +443 -0
  199. package/src/trait_behaviors.ts +51 -0
  200. package/src/virtual_node.ts +51 -0
  201. package/tests/backend/domlike.test.ts +254 -0
  202. package/tests/base/env.ts +78 -0
  203. package/tests/base/match.ts +185 -0
  204. package/tests/core/backend.test.ts +144 -0
  205. package/tests/core/behavior.test.ts +546 -0
  206. package/tests/core/component_space.test.ts +212 -0
  207. package/tests/core/data_update.test.ts +461 -0
  208. package/tests/core/misc.test.ts +339 -0
  209. package/tests/core/placeholder.test.ts +180 -0
  210. package/tests/core/slot.test.ts +1495 -0
  211. package/tests/core/trait_behaviors.test.ts +153 -0
  212. package/tests/legacy/README.md +3 -0
  213. package/tests/legacy/behavior.test.js +293 -0
  214. package/tests/legacy/component.test.js +1247 -0
  215. package/tests/legacy/data_path.test.js +149 -0
  216. package/tests/legacy/data_proxy.test.js +759 -0
  217. package/tests/legacy/element_iterator.test.js +148 -0
  218. package/tests/legacy/event.test.js +849 -0
  219. package/tests/legacy/external.test.js +510 -0
  220. package/tests/legacy/extra_info.test.js +109 -0
  221. package/tests/legacy/generics.test.js +176 -0
  222. package/tests/legacy/mutation_observer.test.js +210 -0
  223. package/tests/legacy/relation.test.js +517 -0
  224. package/tests/legacy/selector.test.js +263 -0
  225. package/tests/legacy/slot.test.js +915 -0
  226. package/tests/legacy/virtual.test.js +394 -0
  227. package/tests/tmpl/binding_map.test.ts +208 -0
  228. package/tests/tmpl/event.test.ts +206 -0
  229. package/tests/tmpl/expression.test.ts +429 -0
  230. package/tests/tmpl/lvalue.test.ts +160 -0
  231. package/tests/tmpl/native_rendering.test.ts +155 -0
  232. package/tests/tmpl/structure.test.ts +998 -0
  233. package/tests/types/chaining.test.ts +614 -0
  234. package/tests/types/createElement.test.ts +82 -0
  235. package/tests/types/definition.test.ts +442 -0
  236. package/tsconfig.json +11 -0
  237. package/webpack.config.js +270 -0
@@ -0,0 +1,517 @@
1
+ /* eslint-disable */
2
+
3
+ const { tmpl, domBackend } = require('../base/env')
4
+ const glassEasel = require('../../src')
5
+
6
+ const componentSpace = new glassEasel.ComponentSpace()
7
+ componentSpace.updateComponentOptions({
8
+ writeFieldsToNode: true,
9
+ })
10
+ componentSpace.defineComponent({
11
+ is: '',
12
+ })
13
+
14
+ const regBeh = (config) => {
15
+ return componentSpace.defineBehavior(config)
16
+ }
17
+
18
+ const regElem = (config) => {
19
+ const { template, ...c } = config
20
+ if (template) c.template = tmpl(template)
21
+ return componentSpace.defineComponent(c)
22
+ }
23
+
24
+ const createElem = (is, backend) => {
25
+ const def = componentSpace.getComponent(is)
26
+ return glassEasel.Component.createWithContext(is || 'test', def, backend || domBackend)
27
+ }
28
+
29
+ describe('Component Relations', function(){
30
+
31
+ describe('#relations', function(){
32
+
33
+ beforeAll(function(){
34
+ regElem({
35
+ is: 'relation-empty'
36
+ })
37
+ })
38
+
39
+ it('should link immediate parent and children', function(){
40
+ regElem({
41
+ is: 'relation-parent-common-node-a',
42
+ relations: {
43
+ 'relation-child-common-node-a': {
44
+ type: 'child-common-node',
45
+ linked: function(target){
46
+ expect(expectStatus).toBe('linked')
47
+ expect(this).toBe(expectCallerOrder.shift())
48
+ expect(target).toBe(expectTargetOrder.shift())
49
+ },
50
+ linkChanged: function(target){
51
+ expect(expectStatus).toBe('linkChanged')
52
+ expect(this).toBe(expectCallerOrder.shift())
53
+ expect(target).toBe(expectTargetOrder.shift())
54
+ },
55
+ unlinked: function(target){
56
+ expect(expectStatus).toBe('unlinked')
57
+ expect(this).toBe(expectCallerOrder.shift())
58
+ expect(target).toBe(expectTargetOrder.shift())
59
+ }
60
+ }
61
+ }
62
+ })
63
+ regElem({
64
+ is: 'relation-child-common-node-a',
65
+ relations: {
66
+ 'relation-parent-common-node-a': {
67
+ type: 'parent-common-node',
68
+ linked: function(target){
69
+ expect(expectStatus).toBe('linked')
70
+ expect(this).toBe(expectCallerOrder.shift())
71
+ expect(target).toBe(expectTargetOrder.shift())
72
+ },
73
+ linkChanged: function(target){
74
+ expect(expectStatus).toBe('linkChanged')
75
+ expect(this).toBe(expectCallerOrder.shift())
76
+ expect(target).toBe(expectTargetOrder.shift())
77
+ },
78
+ unlinked: function(target){
79
+ expect(expectStatus).toBe('unlinked')
80
+ expect(this).toBe(expectCallerOrder.shift())
81
+ expect(target).toBe(expectTargetOrder.shift())
82
+ }
83
+ }
84
+ }
85
+ })
86
+ regElem({
87
+ is: 'relation-parent-child-common-node',
88
+ template: '<relation-parent-common-node-a id="p"> <relation-child-common-node-a id="c1"> <relation-child-common-node-a id="c2"></relation-child-common-node-a> </relation-child-common-node-a> <block wx:if="1"> <relation-child-common-node-a id="c3"></relation-child-common-node-a> <relation-child-common-node-a id="c4"></relation-child-common-node-a> </block> </relation-parent-common-node-a>'
89
+ })
90
+ var elem = createElem('relation-parent-child-common-node')
91
+ var p = elem.$.p
92
+ var c1 = elem.$.c1
93
+ var c2 = elem.$.c2
94
+ var c3 = elem.$.c3
95
+ var c4 = elem.$.c4
96
+
97
+ var expectStatus = 'linked'
98
+ var expectCallerOrder = [p, c1, p, c3, p, c4]
99
+ var expectTargetOrder = [c1, p, c3, p, c4, p]
100
+ glassEasel.Element.pretendAttached(elem)
101
+ expect(expectCallerOrder.length).toBe(0)
102
+ expect(expectTargetOrder.length).toBe(0)
103
+ expect(p.getRelationNodes('relation-child-common-node-a')).toStrictEqual([c1, c3, c4])
104
+ expect(c1.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
105
+ expect(c3.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
106
+ expect(c4.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
107
+ expect(c2.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([])
108
+
109
+ expectStatus = 'linkChanged'
110
+ expectCallerOrder = [p, c3, p, c4]
111
+ expectTargetOrder = [c3, p, c4, p]
112
+ p.insertBefore(c3.parentNode, c1)
113
+ expect(expectCallerOrder.length).toBe(0)
114
+ expect(expectTargetOrder.length).toBe(0)
115
+ expect(p.getRelationNodes('relation-child-common-node-a')).toStrictEqual([c3, c4, c1])
116
+ expect(c1.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
117
+ expect(c3.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
118
+ expect(c4.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
119
+ expect(c2.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([])
120
+
121
+ expectStatus = 'unlinked'
122
+ expectCallerOrder = [p, c3, p, c4]
123
+ expectTargetOrder = [c3, p, c4, p]
124
+ c1.appendChild(c3.parentNode)
125
+ expect(expectCallerOrder.length).toBe(0)
126
+ expect(expectTargetOrder.length).toBe(0)
127
+ expect(p.getRelationNodes('relation-child-common-node-a')).toStrictEqual([c1])
128
+ expect(c3.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([])
129
+ expect(c4.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([])
130
+
131
+ expectStatus = 'linked'
132
+ expectCallerOrder = [p, c2]
133
+ expectTargetOrder = [c2, p]
134
+ p.insertBefore(c2, c1)
135
+ expect(expectCallerOrder.length).toBe(0)
136
+ expect(expectTargetOrder.length).toBe(0)
137
+ expect(p.getRelationNodes('relation-child-common-node-a')).toStrictEqual([c2, c1])
138
+ expect(c2.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([p])
139
+
140
+ expectStatus = 'unlinked'
141
+ expectCallerOrder = [p, c2, p, c1]
142
+ expectTargetOrder = [c2, p, c1, p]
143
+ glassEasel.Element.pretendDetached(elem)
144
+ expect(expectCallerOrder.length).toBe(0)
145
+ expect(expectTargetOrder.length).toBe(0)
146
+ expect(p.getRelationNodes('relation-child-common-node-a')).toStrictEqual([])
147
+ expect(c1.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([])
148
+ expect(c2.getRelationNodes('relation-parent-common-node-a')).toStrictEqual([])
149
+ })
150
+
151
+ it('should link parent and children component', function(){
152
+ regElem({
153
+ is: 'relation-parent-a',
154
+ relations: {
155
+ 'relation-child-a': {
156
+ type: 'child',
157
+ linked: function(target){
158
+ expect(expectStatus).toBe('linked')
159
+ expect(this).toBe(expectCallerOrder.shift())
160
+ expect(target).toBe(expectTargetOrder.shift())
161
+ },
162
+ linkChanged: function(target){
163
+ expect(expectStatus).toBe('linkChanged')
164
+ expect(this).toBe(expectCallerOrder.shift())
165
+ expect(target).toBe(expectTargetOrder.shift())
166
+ },
167
+ unlinked: function(target){
168
+ expect(expectStatus).toBe('unlinked')
169
+ expect(this).toBe(expectCallerOrder.shift())
170
+ expect(target).toBe(expectTargetOrder.shift())
171
+ }
172
+ }
173
+ }
174
+ })
175
+ regElem({
176
+ is: 'relation-child-a',
177
+ relations: {
178
+ 'relation-parent-a': {
179
+ type: 'parent',
180
+ linked: function(target){
181
+ expect(expectStatus).toBe('linked')
182
+ expect(this).toBe(expectCallerOrder.shift())
183
+ expect(target).toBe(expectTargetOrder.shift())
184
+ },
185
+ linkChanged: function(target){
186
+ expect(expectStatus).toBe('linkChanged')
187
+ expect(this).toBe(expectCallerOrder.shift())
188
+ expect(target).toBe(expectTargetOrder.shift())
189
+ },
190
+ unlinked: function(target){
191
+ expect(expectStatus).toBe('unlinked')
192
+ expect(this).toBe(expectCallerOrder.shift())
193
+ expect(target).toBe(expectTargetOrder.shift())
194
+ }
195
+ }
196
+ }
197
+ })
198
+ regElem({
199
+ is: 'relation-parent-child',
200
+ template: '<relation-parent-a id="p"> <div> <relation-child-a id="c1"> <relation-child-a id="c2"></relation-child-a> </relation-child-a> <block wx:if="1"> <relation-child-a id="c3"></relation-child-a> <relation-child-a id="c4"></relation-child-a> </block> </div> </relation-parent-a>'
201
+ })
202
+ var elem = createElem('relation-parent-child')
203
+ var p = elem.$.p
204
+ var c1 = elem.$.c1
205
+ var c2 = elem.$.c2
206
+ var c3 = elem.$.c3
207
+ var c4 = elem.$.c4
208
+
209
+ var expectStatus = 'linked'
210
+ var expectCallerOrder = [p, c1, p, c3, p, c4]
211
+ var expectTargetOrder = [c1, p, c3, p, c4, p]
212
+ glassEasel.Element.pretendAttached(elem)
213
+ expect(expectCallerOrder.length).toBe(0)
214
+ expect(expectTargetOrder.length).toBe(0)
215
+ expect(p.getRelationNodes('relation-child-a')).toStrictEqual([c1, c3, c4])
216
+ expect(c1.getRelationNodes('relation-parent-a')).toStrictEqual([p])
217
+ expect(c3.getRelationNodes('relation-parent-a')).toStrictEqual([p])
218
+ expect(c4.getRelationNodes('relation-parent-a')).toStrictEqual([p])
219
+ expect(c2.getRelationNodes('relation-parent-a')).toStrictEqual([])
220
+
221
+ expectStatus = 'linkChanged'
222
+ expectCallerOrder = [p, c3, p, c4]
223
+ expectTargetOrder = [c3, p, c4, p]
224
+ p.insertBefore(c3.parentNode, c1.parentNode)
225
+ expect(expectCallerOrder.length).toBe(0)
226
+ expect(expectTargetOrder.length).toBe(0)
227
+ expect(p.getRelationNodes('relation-child-a')).toStrictEqual([c3, c4, c1])
228
+ expect(c1.getRelationNodes('relation-parent-a')).toStrictEqual([p])
229
+ expect(c3.getRelationNodes('relation-parent-a')).toStrictEqual([p])
230
+ expect(c4.getRelationNodes('relation-parent-a')).toStrictEqual([p])
231
+ expect(c2.getRelationNodes('relation-parent-a')).toStrictEqual([])
232
+
233
+ expectStatus = 'unlinked'
234
+ expectCallerOrder = [p, c3, p, c4]
235
+ expectTargetOrder = [c3, p, c4, p]
236
+ c1.appendChild(c3.parentNode)
237
+ expect(expectCallerOrder.length).toBe(0)
238
+ expect(expectTargetOrder.length).toBe(0)
239
+ expect(p.getRelationNodes('relation-child-a')).toStrictEqual([c1])
240
+ expect(c3.getRelationNodes('relation-parent-a')).toStrictEqual([])
241
+ expect(c4.getRelationNodes('relation-parent-a')).toStrictEqual([])
242
+
243
+ expectStatus = 'linked'
244
+ expectCallerOrder = [p, c2]
245
+ expectTargetOrder = [c2, p]
246
+ p.insertBefore(c2, c1.parentNode)
247
+ expect(expectCallerOrder.length).toBe(0)
248
+ expect(expectTargetOrder.length).toBe(0)
249
+ expect(p.getRelationNodes('relation-child-a')).toStrictEqual([c2, c1])
250
+ expect(c2.getRelationNodes('relation-parent-a')).toStrictEqual([p])
251
+
252
+ expectStatus = 'unlinked'
253
+ expectCallerOrder = [p, c2, p, c1]
254
+ expectTargetOrder = [c2, p, c1, p]
255
+ glassEasel.Element.pretendDetached(elem)
256
+ expect(expectCallerOrder.length).toBe(0)
257
+ expect(expectTargetOrder.length).toBe(0)
258
+ expect(p.getRelationNodes('relation-child-a')).toStrictEqual([])
259
+ expect(c1.getRelationNodes('relation-parent-a')).toStrictEqual([])
260
+ expect(c2.getRelationNodes('relation-parent-a')).toStrictEqual([])
261
+ })
262
+
263
+ it('should link ancestors and descendants', function(){
264
+ var commonBeh = regBeh({})
265
+ var ancestorBeh = regBeh({})
266
+ var descendantBeh = regBeh({})
267
+ regElem({
268
+ is: 'relation-ancestor-a',
269
+ behaviors: [commonBeh, ancestorBeh],
270
+ relations: {
271
+ 'relation-descendant-a': {
272
+ target: descendantBeh,
273
+ type: 'descendant',
274
+ linked: function(target){
275
+ expect(expectStatus).toBe('linked')
276
+ expect(this).toBe(expectCallerOrder.shift())
277
+ expect(target).toBe(expectTargetOrder.shift())
278
+ },
279
+ linkChanged: function(target){
280
+ expect(expectStatus).toBe('linkChanged')
281
+ expect(this).toBe(expectCallerOrder.shift())
282
+ expect(target).toBe(expectTargetOrder.shift())
283
+ },
284
+ unlinked: function(target){
285
+ expect(expectStatus).toBe('unlinked')
286
+ expect(this).toBe(expectCallerOrder.shift())
287
+ expect(target).toBe(expectTargetOrder.shift())
288
+ }
289
+ }
290
+ }
291
+ })
292
+ regElem({
293
+ is: 'relation-descendant-a',
294
+ behaviors: [descendantBeh, commonBeh],
295
+ relations: {
296
+ '': {
297
+ target: ancestorBeh,
298
+ type: 'ancestor',
299
+ linked: function(target){
300
+ expect(expectStatus).toBe('linked')
301
+ expect(this).toBe(expectCallerOrder.shift())
302
+ expect(target).toBe(expectTargetOrder.shift())
303
+ },
304
+ linkChanged: function(target){
305
+ expect(expectStatus).toBe('linkChanged')
306
+ expect(this).toBe(expectCallerOrder.shift())
307
+ expect(target).toBe(expectTargetOrder.shift())
308
+ },
309
+ unlinked: function(target){
310
+ expect(expectStatus).toBe('unlinked')
311
+ expect(this).toBe(expectCallerOrder.shift())
312
+ expect(target).toBe(expectTargetOrder.shift())
313
+ }
314
+ }
315
+ }
316
+ })
317
+ regElem({
318
+ is: 'relation-ancestor-descendant',
319
+ template: '<relation-ancestor-a id="p"> <virtual> <relation-descendant-a id="c1"></relation-descendant-a> <relation-descendant-a id="c2"></relation-descendant-a> </virtual> <relation-descendant-a id="c3"> <relation-descendant-a id="c4"></relation-descendant-a> </relation-descendant-a> </relation-ancestor-a>'
320
+ })
321
+ var elem = createElem('relation-ancestor-descendant')
322
+ var elem2 = createElem('relation-ancestor-descendant')
323
+ var p = elem.$.p
324
+ var c1 = elem.$.c1
325
+ var c2 = elem.$.c2
326
+ var c3 = elem.$.c3
327
+ var c4 = elem.$.c4
328
+ var p2 = elem2.$.p
329
+ var c21 = elem2.$.c1
330
+ var c22 = elem2.$.c2
331
+ var c23 = elem2.$.c3
332
+ var c24 = elem2.$.c4
333
+
334
+ var expectStatus = 'linked'
335
+ var nextExpectStatus = ''
336
+ var expectCallerOrder = [p, c1, p, c2, p, c3, p, c4]
337
+ var expectTargetOrder = [c1, p, c2, p, c3, p, c4, p]
338
+ glassEasel.Element.pretendAttached(elem)
339
+ expect(expectCallerOrder.length).toBe(0)
340
+ expect(expectTargetOrder.length).toBe(0)
341
+ expect(p.getRelationNodes('relation-descendant-a')).toStrictEqual([c1, c2, c3, c4])
342
+ expect(c1.getRelationNodes('')).toStrictEqual([p])
343
+ expect(c2.getRelationNodes('')).toStrictEqual([p])
344
+ expect(c3.getRelationNodes('')).toStrictEqual([p])
345
+ expect(c4.getRelationNodes('')).toStrictEqual([p])
346
+
347
+ expectStatus = 'linkChanged'
348
+ expectCallerOrder = [p, c4, p, c3]
349
+ expectTargetOrder = [c4, p, c3, p]
350
+ c1.appendChild(c3)
351
+ expect(expectCallerOrder.length).toBe(0)
352
+ expect(expectTargetOrder.length).toBe(0)
353
+ expect(p.getRelationNodes('relation-descendant-a')).toStrictEqual([c1, c3, c4, c2])
354
+ expect(c1.getRelationNodes('')).toStrictEqual([p])
355
+ expect(c2.getRelationNodes('')).toStrictEqual([p])
356
+ expect(c3.getRelationNodes('')).toStrictEqual([p])
357
+ expect(c4.getRelationNodes('')).toStrictEqual([p])
358
+
359
+ expectStatus = 'linked'
360
+ expectCallerOrder = [p2, c21, p2, c22, p2, c23, p2, c24]
361
+ expectTargetOrder = [c21, p2, c22, p2, c23, p2, c24, p2]
362
+ glassEasel.Element.pretendAttached(elem2)
363
+ expect(expectCallerOrder.length).toBe(0)
364
+ expect(expectTargetOrder.length).toBe(0)
365
+ expect(p2.getRelationNodes('relation-descendant-a')).toStrictEqual([c21, c22, c23, c24])
366
+ expect(c21.getRelationNodes('')).toStrictEqual([p2])
367
+ expect(c22.getRelationNodes('')).toStrictEqual([p2])
368
+ expect(c23.getRelationNodes('')).toStrictEqual([p2])
369
+ expect(c24.getRelationNodes('')).toStrictEqual([p2])
370
+
371
+ expectStatus = 'unlinked'
372
+ expectCallerOrder = [p2, c24]
373
+ expectTargetOrder = [c24, p2]
374
+ c23.removeChild(c24)
375
+ expect(expectCallerOrder.length).toBe(0)
376
+ expect(expectTargetOrder.length).toBe(0)
377
+ expect(p2.getRelationNodes('relation-descendant-a')).toStrictEqual([c21, c22, c23])
378
+ expect(c24.getRelationNodes('')).toStrictEqual([])
379
+
380
+ expectStatus = 'unlinked'
381
+ expectCallerOrder = [p, c4, p, c3, p, c1, p, c2]
382
+ expectTargetOrder = [c4, p, c3, p, c1, p, c2, p]
383
+ glassEasel.Element.pretendDetached(elem)
384
+ expect(expectCallerOrder.length).toBe(0)
385
+ expect(expectTargetOrder.length).toBe(0)
386
+ expect(p.getRelationNodes('relation-descendant-a')).toStrictEqual([])
387
+ expect(c4.getRelationNodes('')).toStrictEqual([])
388
+ expect(c1.getRelationNodes('')).toStrictEqual([])
389
+ expect(c2.getRelationNodes('')).toStrictEqual([])
390
+ expect(c3.getRelationNodes('')).toStrictEqual([])
391
+ })
392
+
393
+ it('should trigger linkFailed handler when cannot link two nodes', function(){
394
+ regElem({
395
+ is: 'relation-cnt-failed',
396
+ template: '<div><slot></slot></div>'
397
+ })
398
+
399
+ regElem({
400
+ is: 'relation-child-failed',
401
+ template: '<div><slot></slot></div>',
402
+ relations: {
403
+ 'relation-parent-failed': {
404
+ type: 'parent',
405
+ linkFailed: function(){
406
+ expect(expectStatus).toBe('linkFailed')
407
+ expect(this).toBe(expectCallerOrder.shift())
408
+ },
409
+ }
410
+ }
411
+ })
412
+ regElem({
413
+ is: 'relation-parent-failed',
414
+ relations: {
415
+ 'relation-child-failed': {
416
+ type: 'child'
417
+ }
418
+ },
419
+ template: '<div><slot></slot></div>'
420
+ })
421
+
422
+ regElem({
423
+ is: 'relation-descendant-failed',
424
+ template: '<div><slot></slot></div>',
425
+ relations: {
426
+ 'relation-ancestor-failed': {
427
+ type: 'ancestor',
428
+ linkFailed: function(){
429
+ expect(expectStatus).toBe('linkFailed')
430
+ expect(this).toBe(expectCallerOrder.shift())
431
+ },
432
+ }
433
+ }
434
+ })
435
+ regElem({
436
+ is: 'relation-ancestor-failed',
437
+ relations: {
438
+ 'relation-descendant-failed': {
439
+ type: 'descendant'
440
+ }
441
+ },
442
+ template: '<div><slot></slot></div>'
443
+ })
444
+
445
+ regElem({
446
+ is: 'relation-parent-child-failed-a',
447
+ template: '<relation-parent-failed><relation-child-failed id="q"></relation-child-failed><relation-child-failed id="z"></relation-child-failed></relation-parent-failed><relation-cnt-failed><relation-child-failed id="p"></relation-child-failed></relation-cnt-failed>'
448
+ })
449
+ regElem({
450
+ is: 'relation-parent-child-failed-b',
451
+ template: '<relation-ancestor-failed><div><relation-descendant-failed id="q"></relation-descendant-failed></div><div><div><relation-descendant-failed id="z"></relation-descendant-failed></div></div></relation-ancestor-failed><relation-cnt-failed><div><relation-descendant-failed id="p"></relation-descendant-failed></div></relation-cnt-failed>'
452
+ })
453
+ var elem1 = createElem('relation-parent-child-failed-a')
454
+ var elem2 = createElem('relation-parent-child-failed-b')
455
+ var p1 = elem1.$.p
456
+ var p2 = elem2.$.p
457
+ var q1 = elem1.$.q
458
+ var q2 = elem2.$.q
459
+ var z1 = elem1.$.z
460
+ var z2 = elem2.$.z
461
+
462
+ var expectStatus = 'linkFailed'
463
+ var expectCallerOrder = [p1, p2, q1, q2]
464
+ glassEasel.Element.pretendAttached(elem1)
465
+ glassEasel.Element.pretendAttached(elem2)
466
+ z1.parentNode.removeChild(z1) // expected not trigger linkFialed
467
+ z2.parentNode.parentNode.removeChild(z2.parentNode) // expected not trigger linkFialed
468
+ p1.appendChild(q1)
469
+ p2.appendChild(q2)
470
+ expect(expectCallerOrder.length).toBe(0)
471
+ })
472
+
473
+ it('should link virtual-host components', function(){
474
+ var expectOrder = [1, 2]
475
+ regElem({
476
+ is: 'relation-virtual-host-a',
477
+ options: {
478
+ virtualHost: true,
479
+ },
480
+ template: '<slot />',
481
+ relations: {
482
+ 'relation-virtual-host-b': {
483
+ type: 'descendant',
484
+ linked: function(target){
485
+ expect(expectOrder.shift()).toBe(1)
486
+ },
487
+ }
488
+ }
489
+ })
490
+ regElem({
491
+ is: 'relation-virtual-host-b',
492
+ options: {
493
+ virtualHost: true,
494
+ },
495
+ relations: {
496
+ 'relation-virtual-host-a': {
497
+ type: 'ancestor',
498
+ linked: function(target){
499
+ expect(expectOrder.shift()).toBe(2)
500
+ },
501
+ }
502
+ }
503
+ })
504
+ regElem({
505
+ is: 'relation-virtual-host',
506
+ template: '<relation-virtual-host-a id="a"> <relation-virtual-host-b id="b" /> </relation-virtual-host-a>'
507
+ })
508
+ var elem = createElem('relation-virtual-host')
509
+ glassEasel.Element.pretendAttached(elem)
510
+ expect(expectOrder.length).toBe(0)
511
+ expect(elem.$.a.getRelationNodes('relation-virtual-host-b')[0]).toBe(elem.$.b)
512
+ expect(elem.$.b.getRelationNodes('relation-virtual-host-a')[0]).toBe(elem.$.a)
513
+ })
514
+
515
+ })
516
+
517
+ })