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  it
25e484b35bSopenharmony_ci} from 'mocha';
26e484b35bSopenharmony_ciimport {
27e484b35bSopenharmony_ci  fakeLog,
28e484b35bSopenharmony_ci  fakeLogRestore
29e484b35bSopenharmony_ci} from '../../fakeLog';
30e484b35bSopenharmony_ciimport Vm from '../../../runtime/main/model';
31e484b35bSopenharmony_ciimport Doc from '../../../runtime/vdom/Document';
32e484b35bSopenharmony_ciimport Differ from '../../../runtime/main/page/api/Differ';
33e484b35bSopenharmony_ci
34e484b35bSopenharmony_ciconst expect = chai.expect;
35e484b35bSopenharmony_ci
36e484b35bSopenharmony_cidescribe('api of communication between vm and data methods', () => {
37e484b35bSopenharmony_ci  fakeLog();
38e484b35bSopenharmony_ci
39e484b35bSopenharmony_ci  const options = {
40e484b35bSopenharmony_ci    orientation: 1,
41e484b35bSopenharmony_ci    width: 1,
42e484b35bSopenharmony_ci    height: 1,
43e484b35bSopenharmony_ci    'aspect-ratio': 1,
44e484b35bSopenharmony_ci    'device-width': 1,
45e484b35bSopenharmony_ci    'device-height': 1,
46e484b35bSopenharmony_ci    resolution: 1,
47e484b35bSopenharmony_ci    accessType: 1
48e484b35bSopenharmony_ci  };
49e484b35bSopenharmony_ci
50e484b35bSopenharmony_ci  const doc = new Doc('1', '');
51e484b35bSopenharmony_ci  const differ = new Differ('test');
52e484b35bSopenharmony_ci  const customComponentMap: any = {};
53e484b35bSopenharmony_ci  const spyEl = sinon.spy();
54e484b35bSopenharmony_ci
55e484b35bSopenharmony_ci  customComponentMap.parent = {
56e484b35bSopenharmony_ci    template: {
57e484b35bSopenharmony_ci      type: 'div',
58e484b35bSopenharmony_ci      id: 'myDiv',
59e484b35bSopenharmony_ci      children: [
60e484b35bSopenharmony_ci        {
61e484b35bSopenharmony_ci          type: 'text',
62e484b35bSopenharmony_ci          id: 'myBar',
63e484b35bSopenharmony_ci          events: {
64e484b35bSopenharmony_ci            'click': 'proxyClick'
65e484b35bSopenharmony_ci          }
66e484b35bSopenharmony_ci        },
67e484b35bSopenharmony_ci        {
68e484b35bSopenharmony_ci          type: 'child',
69e484b35bSopenharmony_ci          id: 'myChild'
70e484b35bSopenharmony_ci        }
71e484b35bSopenharmony_ci      ]
72e484b35bSopenharmony_ci    },
73e484b35bSopenharmony_ci    proxyClick: function(e) {
74e484b35bSopenharmony_ci      spyEl(e);
75e484b35bSopenharmony_ci    }
76e484b35bSopenharmony_ci  };
77e484b35bSopenharmony_ci
78e484b35bSopenharmony_ci  customComponentMap.child = {
79e484b35bSopenharmony_ci    template: {
80e484b35bSopenharmony_ci      type: 'div'
81e484b35bSopenharmony_ci    }
82e484b35bSopenharmony_ci  };
83e484b35bSopenharmony_ci
84e484b35bSopenharmony_ci  const page = {doc, customComponentMap, options};
85e484b35bSopenharmony_ci
86e484b35bSopenharmony_ci  const vm = new Vm(
87e484b35bSopenharmony_ci    'parent',
88e484b35bSopenharmony_ci    null,
89e484b35bSopenharmony_ci    {
90e484b35bSopenharmony_ci      __app: page,
91e484b35bSopenharmony_ci      __rootVm: true
92e484b35bSopenharmony_ci    },
93e484b35bSopenharmony_ci    null,
94e484b35bSopenharmony_ci    null,
95e484b35bSopenharmony_ci    null
96e484b35bSopenharmony_ci  );
97e484b35bSopenharmony_ci
98e484b35bSopenharmony_ci  const spyParent = sinon.spy();
99e484b35bSopenharmony_ci  const spyChild = sinon.spy();
100e484b35bSopenharmony_ci  const subVm = vm._childrenVms[0];
101e484b35bSopenharmony_ci  vm.$on('event1', spyParent);
102e484b35bSopenharmony_ci  subVm.$on('event1', spyChild);
103e484b35bSopenharmony_ci
104e484b35bSopenharmony_ci  it('$on && $off', () => {
105e484b35bSopenharmony_ci    const fn = function() {};
106e484b35bSopenharmony_ci    vm.$on('event1', fn);
107e484b35bSopenharmony_ci    expect(vm._vmEvents['event1'].length).eql(2);
108e484b35bSopenharmony_ci    expect(typeof vm._vmEvents['event1'][1]).eql('function');
109e484b35bSopenharmony_ci
110e484b35bSopenharmony_ci    vm.$off('event1', fn);
111e484b35bSopenharmony_ci    expect(vm._vmEvents['event1'].length).eql(1);
112e484b35bSopenharmony_ci    expect(typeof vm._vmEvents['event1'][1]).eql('undefined');
113e484b35bSopenharmony_ci  });
114e484b35bSopenharmony_ci
115e484b35bSopenharmony_ci  it('$emit', () => {
116e484b35bSopenharmony_ci    expect(vm._type).eql('parent');
117e484b35bSopenharmony_ci    expect(subVm._type).eql('child');
118e484b35bSopenharmony_ci
119e484b35bSopenharmony_ci    let detail = { lunch: 'banana' };
120e484b35bSopenharmony_ci    vm.$emit('event1', detail);
121e484b35bSopenharmony_ci    expect(spyChild.args.length).eql(0);
122e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(1);
123e484b35bSopenharmony_ci
124e484b35bSopenharmony_ci    detail = { lunch: 'banana' };
125e484b35bSopenharmony_ci    subVm.$emit('event1', detail);
126e484b35bSopenharmony_ci    expect(spyChild.args.length).eql(1);
127e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(1);
128e484b35bSopenharmony_ci  });
129e484b35bSopenharmony_ci
130e484b35bSopenharmony_ci  it('$dispatch', () => {
131e484b35bSopenharmony_ci    const detail = { lunch: 'banana' };
132e484b35bSopenharmony_ci    vm.$dispatch('event1', detail);
133e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(2);
134e484b35bSopenharmony_ci    expect(spyChild.args.length).eql(1);
135e484b35bSopenharmony_ci
136e484b35bSopenharmony_ci    subVm.$dispatch('event1', detail);
137e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(3);
138e484b35bSopenharmony_ci    expect(spyChild.args.length).eql(2);
139e484b35bSopenharmony_ci  });
140e484b35bSopenharmony_ci
141e484b35bSopenharmony_ci  it('$broadCast', () => {
142e484b35bSopenharmony_ci    const detail = { lunch: 'banana' };
143e484b35bSopenharmony_ci    vm.$broadcast('event1', detail);
144e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(4);
145e484b35bSopenharmony_ci    expect(spyChild.args.length).eql(3);
146e484b35bSopenharmony_ci
147e484b35bSopenharmony_ci    subVm.$broadcast('event1', detail);
148e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(4);
149e484b35bSopenharmony_ci    expect(spyChild.args.length).eql(4);
150e484b35bSopenharmony_ci  });
151e484b35bSopenharmony_ci
152e484b35bSopenharmony_ci  it('$emitDirect', () => {
153e484b35bSopenharmony_ci    const detail = { lunch: 'banana' };
154e484b35bSopenharmony_ci    vm.$emitDirect('event1', detail);
155e484b35bSopenharmony_ci    expect(spyParent.args.length).eql(5);
156e484b35bSopenharmony_ci  });
157e484b35bSopenharmony_ci
158e484b35bSopenharmony_ci  it('$emitElement', () => {
159e484b35bSopenharmony_ci    const detail = { lunch: 'banana' };
160e484b35bSopenharmony_ci    vm.$emitElement('click', detail, 'myBar');
161e484b35bSopenharmony_ci    sinon.assert.calledOnce(spyEl);
162e484b35bSopenharmony_ci    expect(spyEl.args.length).eql(1);
163e484b35bSopenharmony_ci    expect(spyEl.args[0][0].detail).to.deep.equal(detail);
164e484b35bSopenharmony_ci  });
165e484b35bSopenharmony_ci
166e484b35bSopenharmony_ci  it('$root', () => {
167e484b35bSopenharmony_ci    expect(subVm.$root()._type).eql('parent');
168e484b35bSopenharmony_ci  });
169e484b35bSopenharmony_ci
170e484b35bSopenharmony_ci  it('$parent', () => {
171e484b35bSopenharmony_ci    expect(subVm.$parent()._type).eql('parent');
172e484b35bSopenharmony_ci  });
173e484b35bSopenharmony_ci
174e484b35bSopenharmony_ci  it('$child', () => {
175e484b35bSopenharmony_ci    expect(vm.$child('myChild')._type).eql('child');
176e484b35bSopenharmony_ci  });
177e484b35bSopenharmony_ci
178e484b35bSopenharmony_ci  it('$element', () => {
179e484b35bSopenharmony_ci    expect(vm.$element('myDiv').type).eql('div');
180e484b35bSopenharmony_ci    expect(vm.$element('myChild').type).eql('div');
181e484b35bSopenharmony_ci  });
182e484b35bSopenharmony_ci
183e484b35bSopenharmony_ci  it('$set && $delete', () => {
184e484b35bSopenharmony_ci    const data = {
185e484b35bSopenharmony_ci      x: 11,
186e484b35bSopenharmony_ci      y: 22,
187e484b35bSopenharmony_ci      z: 'test-style'
188e484b35bSopenharmony_ci    };
189e484b35bSopenharmony_ci    customComponentMap.foo = {
190e484b35bSopenharmony_ci      template: {
191e484b35bSopenharmony_ci        type: 'test.aaa',
192e484b35bSopenharmony_ci        children: [{ type: 'type1', component: true }]
193e484b35bSopenharmony_ci      }
194e484b35bSopenharmony_ci    };
195e484b35bSopenharmony_ci    customComponentMap.bar = {
196e484b35bSopenharmony_ci      template: {
197e484b35bSopenharmony_ci        type: 'test.bbb'
198e484b35bSopenharmony_ci      }
199e484b35bSopenharmony_ci    };
200e484b35bSopenharmony_ci
201e484b35bSopenharmony_ci    const app = { doc, customComponentMap, differ, options };
202e484b35bSopenharmony_ci    const vm = new Vm('foo', customComponentMap.foo, { __app: app, __rootVm: true }, null, data, null);
203e484b35bSopenharmony_ci    doc.destroy();
204e484b35bSopenharmony_ci    const detail = { aaa: 1 };
205e484b35bSopenharmony_ci    vm.$set('test.aaa', detail);
206e484b35bSopenharmony_ci    expect(typeof vm._data['test.aaa']).eql('object');
207e484b35bSopenharmony_ci    vm.$delete('test.aaa');
208e484b35bSopenharmony_ci    expect(typeof vm._data['test.aaa']).eql('undefined');
209e484b35bSopenharmony_ci  });
210e484b35bSopenharmony_ci
211e484b35bSopenharmony_ci  it('$watch', () => {
212e484b35bSopenharmony_ci    const data = {
213e484b35bSopenharmony_ci      x: {
214e484b35bSopenharmony_ci        y: 1
215e484b35bSopenharmony_ci      }
216e484b35bSopenharmony_ci    };
217e484b35bSopenharmony_ci    customComponentMap.foo = {
218e484b35bSopenharmony_ci      template: {
219e484b35bSopenharmony_ci        type: 'div'
220e484b35bSopenharmony_ci      },
221e484b35bSopenharmony_ci      data: data
222e484b35bSopenharmony_ci    };
223e484b35bSopenharmony_ci
224e484b35bSopenharmony_ci    const app = { doc, customComponentMap, differ, options };
225e484b35bSopenharmony_ci    const vm = new Vm('foo', customComponentMap.foo, { __app: app, __rootVm: true }, null, data, null);
226e484b35bSopenharmony_ci    expect(vm._app).to.deep.equal(app);
227e484b35bSopenharmony_ci    expect(typeof doc.body).eql('object');
228e484b35bSopenharmony_ci
229e484b35bSopenharmony_ci    data.x.y = 5;
230e484b35bSopenharmony_ci    vm.$watch('x.y', (value) => {
231e484b35bSopenharmony_ci      expect(value).eql(5);
232e484b35bSopenharmony_ci    });
233e484b35bSopenharmony_ci  });
234e484b35bSopenharmony_ci
235e484b35bSopenharmony_ci  fakeLogRestore();
236e484b35bSopenharmony_ci});
237