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