1e484b35bSopenharmony_ci/*
2e484b35bSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one
3e484b35bSopenharmony_ci * or more contributor license agreements.  See the NOTICE file
4e484b35bSopenharmony_ci * distributed with this work for additional information
5e484b35bSopenharmony_ci * regarding copyright ownership.  The ASF licenses this file
6e484b35bSopenharmony_ci * to you under the Apache License, Version 2.0 (the
7e484b35bSopenharmony_ci * "License"); you may not use this file except in compliance
8e484b35bSopenharmony_ci * with the License.  You may obtain a copy of the License at
9e484b35bSopenharmony_ci *
10e484b35bSopenharmony_ci *   http://www.apache.org/licenses/LICENSE-2.0
11e484b35bSopenharmony_ci *
12e484b35bSopenharmony_ci * Unless required by applicable law or agreed to in writing,
13e484b35bSopenharmony_ci * software distributed under the License is distributed on an
14e484b35bSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15e484b35bSopenharmony_ci * KIND, either express or implied.  See the License for the
16e484b35bSopenharmony_ci * specific language governing permissions and limitations
17e484b35bSopenharmony_ci * under the License.
18e484b35bSopenharmony_ci */
19e484b35bSopenharmony_ci
20e484b35bSopenharmony_ciimport chai from 'chai';
21e484b35bSopenharmony_ciimport sinon from 'sinon';
22e484b35bSopenharmony_ciimport {
23e484b35bSopenharmony_ci  describe,
24e484b35bSopenharmony_ci  before,
25e484b35bSopenharmony_ci  it
26e484b35bSopenharmony_ci} from 'mocha';
27e484b35bSopenharmony_ciimport {
28e484b35bSopenharmony_ci  fakeLog,
29e484b35bSopenharmony_ci  fakeLogRestore
30e484b35bSopenharmony_ci} from '../../fakeLog';
31e484b35bSopenharmony_ciimport {
32e484b35bSopenharmony_ci  bindSubVm,
33e484b35bSopenharmony_ci  bindSubVmAfterInitialized,
34e484b35bSopenharmony_ci  setAttr
35e484b35bSopenharmony_ci} from '../../../runtime/main/model/directive';
36e484b35bSopenharmony_ciimport { initState } from '../../../runtime/main/reactivity/state';
37e484b35bSopenharmony_ciimport config from '../../../runtime/main/config';
38e484b35bSopenharmony_ci
39e484b35bSopenharmony_ciconst expect = chai.expect;
40e484b35bSopenharmony_ciconst { nativeComponentMap } = config;
41e484b35bSopenharmony_ciconst directive = {};
42e484b35bSopenharmony_ci
43e484b35bSopenharmony_cifunction extendVm(vm, methodNames) {
44e484b35bSopenharmony_ci  methodNames.forEach((name) => {
45e484b35bSopenharmony_ci    vm[name] = directive[name];
46e484b35bSopenharmony_ci  });
47e484b35bSopenharmony_ci  initState(vm);
48e484b35bSopenharmony_ci}
49e484b35bSopenharmony_ci
50e484b35bSopenharmony_cifunction initElement(el) {
51e484b35bSopenharmony_ci  el.setAttr = function(k, v) {
52e484b35bSopenharmony_ci    this.attr[k] = v;
53e484b35bSopenharmony_ci  };
54e484b35bSopenharmony_ci  el.setStyle = function(k, v) {
55e484b35bSopenharmony_ci    this.style[k] = v;
56e484b35bSopenharmony_ci  };
57e484b35bSopenharmony_ci  el.setClassStyle = function(style) {
58e484b35bSopenharmony_ci    this.classStyle = style;
59e484b35bSopenharmony_ci  };
60e484b35bSopenharmony_ci  el.addEvent = function(t, h) {
61e484b35bSopenharmony_ci    this.event[t] = h;
62e484b35bSopenharmony_ci  };
63e484b35bSopenharmony_ci  el.setClassList = function(classList) {
64e484b35bSopenharmony_ci    this.classList = classList;
65e484b35bSopenharmony_ci  };
66e484b35bSopenharmony_ci}
67e484b35bSopenharmony_ci
68e484b35bSopenharmony_cidescribe('bind external infomations to sub vm', () => {
69e484b35bSopenharmony_ci  fakeLog();
70e484b35bSopenharmony_ci
71e484b35bSopenharmony_ci  let vm: any;
72e484b35bSopenharmony_ci  let subVm: any;
73e484b35bSopenharmony_ci
74e484b35bSopenharmony_ci  before(() => {
75e484b35bSopenharmony_ci    vm = {
76e484b35bSopenharmony_ci      data: { a: 1, b: 2, c: 'class-style1' },
77e484b35bSopenharmony_ci      watchers: [],
78e484b35bSopenharmony_ci      app: { eventManager: { add: () => {} }},
79e484b35bSopenharmony_ci      options: {
80e484b35bSopenharmony_ci        style: {
81e484b35bSopenharmony_ci          'class-style1': {
82e484b35bSopenharmony_ci            aaa: 1,
83e484b35bSopenharmony_ci            bbb: 2
84e484b35bSopenharmony_ci          },
85e484b35bSopenharmony_ci          'class-style2': {
86e484b35bSopenharmony_ci            aaa: 2,
87e484b35bSopenharmony_ci            ccc: 3
88e484b35bSopenharmony_ci          }
89e484b35bSopenharmony_ci        }
90e484b35bSopenharmony_ci      },
91e484b35bSopenharmony_ci      foo: function() {}
92e484b35bSopenharmony_ci    };
93e484b35bSopenharmony_ci    extendVm(vm, []);
94e484b35bSopenharmony_ci    subVm = {
95e484b35bSopenharmony_ci      options: {
96e484b35bSopenharmony_ci        props: {
97e484b35bSopenharmony_ci          a: String,
98e484b35bSopenharmony_ci          b: String
99e484b35bSopenharmony_ci        }
100e484b35bSopenharmony_ci      },
101e484b35bSopenharmony_ci      _props: []
102e484b35bSopenharmony_ci    };
103e484b35bSopenharmony_ci  });
104e484b35bSopenharmony_ci
105e484b35bSopenharmony_ci  it('bind to no-root-element sub vm', () => {
106e484b35bSopenharmony_ci    bindSubVm(vm, subVm, {
107e484b35bSopenharmony_ci      // @ts-ignore
108e484b35bSopenharmony_ci      attr: { a: 3, c: 4 },
109e484b35bSopenharmony_ci
110e484b35bSopenharmony_ci      // @ts-ignore
111e484b35bSopenharmony_ci      style: { a: 2 },
112e484b35bSopenharmony_ci      events: { click: 'foo' }
113e484b35bSopenharmony_ci    }, {});
114e484b35bSopenharmony_ci    expect(subVm.a).eql(3);
115e484b35bSopenharmony_ci    expect(subVm.b).to.be.undefined;
116e484b35bSopenharmony_ci    expect(subVm._rootEl).to.be.undefined;
117e484b35bSopenharmony_ci  });
118e484b35bSopenharmony_ci
119e484b35bSopenharmony_ci  it('bind props with external data', () => {
120e484b35bSopenharmony_ci    bindSubVm(vm, subVm, {
121e484b35bSopenharmony_ci      // @ts-ignore
122e484b35bSopenharmony_ci      attr: { a: function() {
123e484b35bSopenharmony_ci        return this.data.b;
124e484b35bSopenharmony_ci      } }
125e484b35bSopenharmony_ci    }, {});
126e484b35bSopenharmony_ci    expect(subVm.a).eql(2);
127e484b35bSopenharmony_ci  });
128e484b35bSopenharmony_ci
129e484b35bSopenharmony_ci  it('bind styles to a sub vm with root element', () => {
130e484b35bSopenharmony_ci    subVm._rootEl = {
131e484b35bSopenharmony_ci      attr: {},
132e484b35bSopenharmony_ci      style: {},
133e484b35bSopenharmony_ci      event: []
134e484b35bSopenharmony_ci    };
135e484b35bSopenharmony_ci    const template: any = {
136e484b35bSopenharmony_ci      style: { aaa: 2, bbb: function() {
137e484b35bSopenharmony_ci        return this.data.a;
138e484b35bSopenharmony_ci      } }
139e484b35bSopenharmony_ci    };
140e484b35bSopenharmony_ci    initElement(subVm._rootEl);
141e484b35bSopenharmony_ci    bindSubVm(vm, subVm, template, {});
142e484b35bSopenharmony_ci
143e484b35bSopenharmony_ci    // @ts-ignore
144e484b35bSopenharmony_ci    bindSubVmAfterInitialized(vm, subVm, template, {});
145e484b35bSopenharmony_ci    expect(subVm._rootEl.style.aaa).eql(2);
146e484b35bSopenharmony_ci    expect(subVm._rootEl.style.bbb).eql(1);
147e484b35bSopenharmony_ci  });
148e484b35bSopenharmony_ci
149e484b35bSopenharmony_ci  fakeLogRestore();
150e484b35bSopenharmony_ci});
151e484b35bSopenharmony_ci
152e484b35bSopenharmony_ci/*
153e484b35bSopenharmony_ci1. api 7 data* ->$data  set to dataset ,data ->data data set to attr;
154e484b35bSopenharmony_ci2. api 6 data* -> data set to dataset,data -> data set to attr(data and data* are not compatible ar compile time);
155e484b35bSopenharmony_ci3. api 5 data -> data set to attr.
156e484b35bSopenharmony_ci*/
157e484b35bSopenharmony_cidescribe('set $data and data to element to check API 7 scene', () => {
158e484b35bSopenharmony_ci  fakeLog();
159e484b35bSopenharmony_ci
160e484b35bSopenharmony_ci  let vm: any;
161e484b35bSopenharmony_ci  let attr1: any;
162e484b35bSopenharmony_ci  let attr2: any;
163e484b35bSopenharmony_ci  let element: any
164e484b35bSopenharmony_ci  let SETTERS = {
165e484b35bSopenharmony_ci    attr: 'setAttr',
166e484b35bSopenharmony_ci    data: 'setData',
167e484b35bSopenharmony_ci    $data: 'setData'
168e484b35bSopenharmony_ci  }
169e484b35bSopenharmony_ci
170e484b35bSopenharmony_ci  before(() => {
171e484b35bSopenharmony_ci    vm = {
172e484b35bSopenharmony_ci      __data: { c: '333', d: '444'},
173e484b35bSopenharmony_ci      _watchers: [],
174e484b35bSopenharmony_ci    };
175e484b35bSopenharmony_ci    attr1 = {
176e484b35bSopenharmony_ci      data: '111',
177e484b35bSopenharmony_ci      $data: { b: '222' }
178e484b35bSopenharmony_ci    };
179e484b35bSopenharmony_ci    attr2 = {
180e484b35bSopenharmony_ci      data: function () {return vm.__data.c},
181e484b35bSopenharmony_ci      $data: { url: function () {return vm.__data.d} }
182e484b35bSopenharmony_ci    };
183e484b35bSopenharmony_ci    element = {
184e484b35bSopenharmony_ci      dataSet: {},
185e484b35bSopenharmony_ci      attr: {},
186e484b35bSopenharmony_ci      watchers: [],
187e484b35bSopenharmony_ci      setData: function setData(key: string, value: string): void {
188e484b35bSopenharmony_ci        this.dataSet[key] = value;
189e484b35bSopenharmony_ci      },
190e484b35bSopenharmony_ci      setAttr: function(key: string, value: string | number): void {
191e484b35bSopenharmony_ci        if (this.attr[key] === value) {
192e484b35bSopenharmony_ci          return;
193e484b35bSopenharmony_ci        }
194e484b35bSopenharmony_ci        this.attr[key] = value;
195e484b35bSopenharmony_ci      }
196e484b35bSopenharmony_ci    };
197e484b35bSopenharmony_ci  });
198e484b35bSopenharmony_ci
199e484b35bSopenharmony_ci  it('set data and $data to element', () => {
200e484b35bSopenharmony_ci    setAttr(vm, element, attr1)
201e484b35bSopenharmony_ci    expect(element.attr.data).eql('111');
202e484b35bSopenharmony_ci    expect(element.dataSet.b).eql('222');
203e484b35bSopenharmony_ci  })
204e484b35bSopenharmony_ci
205e484b35bSopenharmony_ci  it('set data and $data which is function to element', () => {
206e484b35bSopenharmony_ci    setAttr(vm, element, attr2)
207e484b35bSopenharmony_ci    expect(element.attr.data).eql('333');
208e484b35bSopenharmony_ci    expect(element.dataSet.url).eql('444');
209e484b35bSopenharmony_ci  })
210e484b35bSopenharmony_ci
211e484b35bSopenharmony_ci  fakeLogRestore();
212e484b35bSopenharmony_ci});
213e484b35bSopenharmony_ci
214e484b35bSopenharmony_cidescribe('set data and data* to element to check API 6 scene', () => {
215e484b35bSopenharmony_ci  fakeLog();
216e484b35bSopenharmony_ci
217e484b35bSopenharmony_ci  let vm: any;
218e484b35bSopenharmony_ci  let attr1: any;
219e484b35bSopenharmony_ci  let attr2: any;
220e484b35bSopenharmony_ci  let element: any
221e484b35bSopenharmony_ci  let SETTERS = {
222e484b35bSopenharmony_ci    attr: 'setAttr',
223e484b35bSopenharmony_ci    data: 'setData'
224e484b35bSopenharmony_ci  }
225e484b35bSopenharmony_ci
226e484b35bSopenharmony_ci  before(() => {
227e484b35bSopenharmony_ci    vm = {};
228e484b35bSopenharmony_ci    attr1 = {
229e484b35bSopenharmony_ci      data: '111'
230e484b35bSopenharmony_ci    };
231e484b35bSopenharmony_ci    attr2 = {
232e484b35bSopenharmony_ci      data: { url: '222'}
233e484b35bSopenharmony_ci    };
234e484b35bSopenharmony_ci    element = {
235e484b35bSopenharmony_ci      dataSet: {},
236e484b35bSopenharmony_ci      attr: {},
237e484b35bSopenharmony_ci      setData: function setData(key: string, value: string): void {
238e484b35bSopenharmony_ci        this.dataSet[key] = value;
239e484b35bSopenharmony_ci      },
240e484b35bSopenharmony_ci      setAttr: function(key: string, value: string | number): void {
241e484b35bSopenharmony_ci        if (this.attr[key] === value) {
242e484b35bSopenharmony_ci          return;
243e484b35bSopenharmony_ci        }
244e484b35bSopenharmony_ci        this.attr[key] = value;
245e484b35bSopenharmony_ci      }
246e484b35bSopenharmony_ci    };
247e484b35bSopenharmony_ci  });
248e484b35bSopenharmony_ci
249e484b35bSopenharmony_ci  it('set data to element', () => {
250e484b35bSopenharmony_ci    setAttr(vm, element, attr1)
251e484b35bSopenharmony_ci    expect(element.attr.data).eql('111');
252e484b35bSopenharmony_ci  })
253e484b35bSopenharmony_ci
254e484b35bSopenharmony_ci  it('set data* to element', () => {
255e484b35bSopenharmony_ci    setAttr(vm, element, attr2)
256e484b35bSopenharmony_ci    expect(element.dataSet.url).eql('222');
257e484b35bSopenharmony_ci  })
258e484b35bSopenharmony_ci
259e484b35bSopenharmony_ci  fakeLogRestore();
260e484b35bSopenharmony_ci});
261e484b35bSopenharmony_ci
262e484b35bSopenharmony_cidescribe('set data only to element attr to to check API 5 scene', () => {
263e484b35bSopenharmony_ci  fakeLog();
264e484b35bSopenharmony_ci
265e484b35bSopenharmony_ci  let vm: any;
266e484b35bSopenharmony_ci  let attr: any;
267e484b35bSopenharmony_ci  let element: any
268e484b35bSopenharmony_ci  let SETTERS = {
269e484b35bSopenharmony_ci    attr: 'setAttr',
270e484b35bSopenharmony_ci    data: 'setData'
271e484b35bSopenharmony_ci  }
272e484b35bSopenharmony_ci
273e484b35bSopenharmony_ci  before(() => {
274e484b35bSopenharmony_ci    vm = {};
275e484b35bSopenharmony_ci    attr = {
276e484b35bSopenharmony_ci      data: '111'
277e484b35bSopenharmony_ci    };
278e484b35bSopenharmony_ci    element = {
279e484b35bSopenharmony_ci      dataSet: {},
280e484b35bSopenharmony_ci      attr: {},
281e484b35bSopenharmony_ci      setData: function setData() {},
282e484b35bSopenharmony_ci      setAttr: function(key: string, value: string | number): void {
283e484b35bSopenharmony_ci        if (this.attr[key] === value) {
284e484b35bSopenharmony_ci          return;
285e484b35bSopenharmony_ci        }
286e484b35bSopenharmony_ci        this.attr[key] = value;
287e484b35bSopenharmony_ci      }
288e484b35bSopenharmony_ci    };
289e484b35bSopenharmony_ci  });
290e484b35bSopenharmony_ci
291e484b35bSopenharmony_ci  it('set data to element', () => {
292e484b35bSopenharmony_ci    setAttr(vm, element, attr)
293e484b35bSopenharmony_ci    expect(element.attr.data).eql('111');
294e484b35bSopenharmony_ci  })
295e484b35bSopenharmony_ci
296e484b35bSopenharmony_ci  fakeLogRestore();
297e484b35bSopenharmony_ci});