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});