-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathreconcile.js
145 lines (134 loc) · 4.41 KB
/
reconcile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
var expect = chai.expect
function heredoc(fn) {
return fn.toString().replace(/^[^\/]+\/\*!?\s?/, '').
replace(/\*\/[^\/]+$/, '').trim().replace(/>\s*</g, '><')
}
describe('节点对齐算法', function () {
var body = document.body, div, vm
beforeEach(function () {
div = document.createElement('div')
body.appendChild(div)
})
afterEach(function () {
body.removeChild(div)
delete avalon.vmodels[vm.$id]
})
it('在chrome与firefox下删掉select中的空白节点,会影响到selectedIndex', function (done) {
div.innerHTML = heredoc(function () {
/*
<!--""-->
<select ms-controller="reconcile1">
<option selected="true">111</option>
<option>222</option>
<option>333</option>
<option>444</option>
</select>
*/
})
vm = avalon.define({
$id: 'reconcile1',
a: true
})
avalon.scan(div)
setTimeout(function () {
var el = div.getElementsByTagName('select')[0]
expect(el.selectedIndex).to.equal(0)
done()
}, 100)
})
it('当注释节里面包含HTML,HTML里面有属性,就会崩溃BUG', function (done) {
div.innerHTML = heredoc(function () {
/*
<div ms-controller="reconcile2">
<!--<div class="xxx"></div>-->
<span ms-for="el in @arr">
{{el}}
</span>
</div>
*/
})
vm = avalon.define({
$id: 'reconcile2',
arr: [1, 2, 3]
})
avalon.scan(div)
setTimeout(function () {
expect(div.getElementsByTagName('span').length).to.equal(3)
done()
}, 100)
})
it('<> BUG', function (done) {
div.innerHTML = heredoc(function () {
/*
<div ms-controller="reconcile3">
<style>
kbd {
padding: 2px 4px;
font-size: 90%;
color: #fff;
background-color: #333;
border-radius: 3px;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
}
</style>
<code><a></code><br/>
<b ms-html="@wenti1"></b>
<p ms-for="item in @wenti2">问题{{item+1}}:{{ item < 1 ? '小于1' : item > 1 ? '大于1' : item }}</p>
</div>
*/
})
vm = avalon.define({
$id: 'reconcile3',
wenti1: '它使用了不同于传统 <kbd><script></kbd> 标签的脚本加载步骤',
wenti2: [0, 1, 2]
})
avalon.scan(div)
setTimeout(function () {
var code = div.getElementsByTagName('code')[0]
expect(code && code.innerHTML).to.equal('<a>')
var kbd = div.getElementsByTagName('kbd')[0]
expect(kbd && kbd.innerHTML).to.equal('<script>')
var ps = div.getElementsByTagName('p')
expect(ps.length).to.equal(3)
expect(ps[0].innerHTML).to.equal('问题1:小于1')
expect(ps[1].innerHTML).to.equal('问题2:1')
expect(ps[2].innerHTML).to.equal('问题3:大于1')
done()
}, 100)
})
it('多个 BUG', function (done) {
div.innerHTML = heredoc(function () {
/*
<div ms-controller="reconcile4">
<xmp cached='true' ms-widget="{is:'ms-pager2',$id:'xxx'}"></xmp>
</div>
*/
})
var tpl = heredoc(function () {
/*
<div class="pageNum dib">页,共 {{@totalPages}} 页</div>
*/
})
vm = avalon.define({
$id: 'reconcile4'
});
avalon.component('ms-pager2', {
template: tpl,
defaults: {
totalPages: 0,
onReady: function(){
delete avalon.components['ms-pager2']
}
}
});
avalon.scan(div)
setTimeout(function () {
var a = div.innerText || div.textContent
expect(a.indexOf(' ')).to.equal(-1)
delete avalon.scopes.xxx
delete avalon.vmodels.xxx
done()
}, 100)
})
})