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 {
22e484b35bSopenharmony_ci  before,
23e484b35bSopenharmony_ci  after,
24e484b35bSopenharmony_ci  describe,
25e484b35bSopenharmony_ci  it
26e484b35bSopenharmony_ci} from 'mocha';
27e484b35bSopenharmony_ciimport {
28e484b35bSopenharmony_ci  fakeLog,
29e484b35bSopenharmony_ci  fakeLogRestore
30e484b35bSopenharmony_ci} from '../fakeLog';
31e484b35bSopenharmony_ciimport { initFramework } from '../../runtime/preparation/init';
32e484b35bSopenharmony_ciimport framework from '../../runtime/preparation/methods';
33e484b35bSopenharmony_ciimport {
34e484b35bSopenharmony_ci  getModule,
35e484b35bSopenharmony_ci  clearModules,
36e484b35bSopenharmony_ci  allModules
37e484b35bSopenharmony_ci} from '../../runtime/main/page/register';
38e484b35bSopenharmony_ciimport { App } from '../../runtime/main/app/App';
39e484b35bSopenharmony_ciimport { PageLinkedMap } from '../../runtime/main/app/map';
40e484b35bSopenharmony_ciimport Page from '../../runtime/main/page';
41e484b35bSopenharmony_ci
42e484b35bSopenharmony_ciconst expect = chai.expect;
43e484b35bSopenharmony_ci
44e484b35bSopenharmony_cifunction clearRefs(json) {
45e484b35bSopenharmony_ci  delete json.ref;
46e484b35bSopenharmony_ci  if (json.children) {
47e484b35bSopenharmony_ci    json.children.forEach(clearRefs);
48e484b35bSopenharmony_ci  }
49e484b35bSopenharmony_ci}
50e484b35bSopenharmony_ci
51e484b35bSopenharmony_cidescribe('framework entry', () => {
52e484b35bSopenharmony_ci  fakeLog();
53e484b35bSopenharmony_ci
54e484b35bSopenharmony_ci  const pageMap: PageLinkedMap = App.pageMap;
55e484b35bSopenharmony_ci  let instanceId;
56e484b35bSopenharmony_ci  const options = {
57e484b35bSopenharmony_ci    orientation: 'portrait',
58e484b35bSopenharmony_ci    'device-type': 'phone',
59e484b35bSopenharmony_ci    resolution: '3.0',
60e484b35bSopenharmony_ci    'aspect-ratio': 'string',
61e484b35bSopenharmony_ci    'device-width': '1176',
62e484b35bSopenharmony_ci    'device-height': '2400',
63e484b35bSopenharmony_ci    'round-screen': false,
64e484b35bSopenharmony_ci    width: '0',
65e484b35bSopenharmony_ci    height: '0',
66e484b35bSopenharmony_ci    isInit: true,
67e484b35bSopenharmony_ci    'dark-mode': 'false',
68e484b35bSopenharmony_ci    pcPreview: 'disable',
69e484b35bSopenharmony_ci    appInstanceId: '10002',
70e484b35bSopenharmony_ci    packageName: 'com.example.helloworld',
71e484b35bSopenharmony_ci    resourcesConfiguration: [],
72e484b35bSopenharmony_ci    i18n: {
73e484b35bSopenharmony_ci      resources: [
74e484b35bSopenharmony_ci        {'strings': {'hello': 'hello', 'world': 'world'},
75e484b35bSopenharmony_ci          'Files': {}},
76e484b35bSopenharmony_ci        {'strings': {'hello': 'Hello', 'world': 'World'},
77e484b35bSopenharmony_ci          'Files': {}}
78e484b35bSopenharmony_ci      ]
79e484b35bSopenharmony_ci    },
80e484b35bSopenharmony_ci    language: 'zh_CN',
81e484b35bSopenharmony_ci    appCreate: true,
82e484b35bSopenharmony_ci    appCode: '',
83e484b35bSopenharmony_ci    bundleUrl: ''
84e484b35bSopenharmony_ci  };
85e484b35bSopenharmony_ci
86e484b35bSopenharmony_ci  before(() => {
87e484b35bSopenharmony_ci    initFramework();
88e484b35bSopenharmony_ci    global.callNative = (id, tasks, callbackId) => {
89e484b35bSopenharmony_ci      if (callbackId !== '-1') {
90e484b35bSopenharmony_ci        framework.callJS(id, [{
91e484b35bSopenharmony_ci          method: 'callback',
92e484b35bSopenharmony_ci          args: [callbackId, null, true]
93e484b35bSopenharmony_ci        }]);
94e484b35bSopenharmony_ci      }
95e484b35bSopenharmony_ci    };
96e484b35bSopenharmony_ci  });
97e484b35bSopenharmony_ci
98e484b35bSopenharmony_ci  after(() => {
99e484b35bSopenharmony_ci    fakeLogRestore();
100e484b35bSopenharmony_ci    framework.destroyInstance(instanceId);
101e484b35bSopenharmony_ci  });
102e484b35bSopenharmony_ci
103e484b35bSopenharmony_ci  it('createInstance', () => {
104e484b35bSopenharmony_ci    instanceId = Date.now() + '';
105e484b35bSopenharmony_ci    const code: string = `
106e484b35bSopenharmony_ci      $app_define$('@app-component/index', [],
107e484b35bSopenharmony_ci        function($app_require$, $app_exports$, $app_module$) {
108e484b35bSopenharmony_ci          $app_module$.exports = {
109e484b35bSopenharmony_ci            data: {},
110e484b35bSopenharmony_ci          }
111e484b35bSopenharmony_ci          $app_module$.exports.template = {
112e484b35bSopenharmony_ci            'type': 'div',
113e484b35bSopenharmony_ci            'attr': {},
114e484b35bSopenharmony_ci            'children': [
115e484b35bSopenharmony_ci              {
116e484b35bSopenharmony_ci                'type': 'text',
117e484b35bSopenharmony_ci                'attr': {
118e484b35bSopenharmony_ci                  'value': 'This is the index page.'
119e484b35bSopenharmony_ci                },
120e484b35bSopenharmony_ci                'classList': [
121e484b35bSopenharmony_ci                  'title'
122e484b35bSopenharmony_ci                ]
123e484b35bSopenharmony_ci              }
124e484b35bSopenharmony_ci            ]
125e484b35bSopenharmony_ci          }
126e484b35bSopenharmony_ci          $app_module$.exports.style = {
127e484b35bSopenharmony_ci            '.title': {
128e484b35bSopenharmony_ci              'fontSize': '50px'
129e484b35bSopenharmony_ci            }
130e484b35bSopenharmony_ci          }
131e484b35bSopenharmony_ci        })
132e484b35bSopenharmony_ci      $app_bootstrap$('@app-component/index',undefined,undefined)
133e484b35bSopenharmony_ci    `;
134e484b35bSopenharmony_ci    const expectComponent = {
135e484b35bSopenharmony_ci      'index': {
136e484b35bSopenharmony_ci        'data': {},
137e484b35bSopenharmony_ci        'template': {
138e484b35bSopenharmony_ci          'type': 'div',
139e484b35bSopenharmony_ci          'attr': {},
140e484b35bSopenharmony_ci          'children': [{'type': 'text', 'attr': {'value': 'This is the index page.'}, 'classList': ['title']}]
141e484b35bSopenharmony_ci        },
142e484b35bSopenharmony_ci        'style': {'.title': {'fontSize': '50px'}}
143e484b35bSopenharmony_ci      }
144e484b35bSopenharmony_ci    };
145e484b35bSopenharmony_ci    framework.createInstance(instanceId, code, options, null);
146e484b35bSopenharmony_ci    expect(pageMap[instanceId].customComponentMap).eql(expectComponent);
147e484b35bSopenharmony_ci  });
148e484b35bSopenharmony_ci
149e484b35bSopenharmony_ci  describe('getRoot', () => {
150e484b35bSopenharmony_ci    it('with an exist instanceId', () => {
151e484b35bSopenharmony_ci      const json = framework.getRoot(instanceId);
152e484b35bSopenharmony_ci      expect(json.ref).eql('_root');
153e484b35bSopenharmony_ci      clearRefs(json);
154e484b35bSopenharmony_ci      const expectJSON = {
155e484b35bSopenharmony_ci        type: 'div',
156e484b35bSopenharmony_ci        attr: {},
157e484b35bSopenharmony_ci        style: {},
158e484b35bSopenharmony_ci        children: [{
159e484b35bSopenharmony_ci          type: 'text',
160e484b35bSopenharmony_ci          attr: {
161e484b35bSopenharmony_ci            value: 'This is the index page.'
162e484b35bSopenharmony_ci          },
163e484b35bSopenharmony_ci          customComponent: false,
164e484b35bSopenharmony_ci          style: {fontSize: '50px'}
165e484b35bSopenharmony_ci        }],
166e484b35bSopenharmony_ci        event: ['viewappear', 'viewdisappear', 'viewsizechanged'],
167e484b35bSopenharmony_ci        customComponent: true
168e484b35bSopenharmony_ci      };
169e484b35bSopenharmony_ci      expect(json).eql(expectJSON);
170e484b35bSopenharmony_ci    });
171e484b35bSopenharmony_ci  });
172e484b35bSopenharmony_ci
173e484b35bSopenharmony_ci  describe('callJS', () => {
174e484b35bSopenharmony_ci    it('fireEvent with no params', () => {
175e484b35bSopenharmony_ci      const result = framework.callJS(undefined, undefined);
176e484b35bSopenharmony_ci      expect(result).to.be.an.instanceof(Error);
177e484b35bSopenharmony_ci    });
178e484b35bSopenharmony_ci
179e484b35bSopenharmony_ci    it('non-exist instanceId', () => {
180e484b35bSopenharmony_ci      const result = framework.callJS('123', [{
181e484b35bSopenharmony_ci        method: 'fireEvent',
182e484b35bSopenharmony_ci        args: []
183e484b35bSopenharmony_ci      }]);
184e484b35bSopenharmony_ci      expect(result).to.be.an.instanceof(Error);
185e484b35bSopenharmony_ci    });
186e484b35bSopenharmony_ci
187e484b35bSopenharmony_ci    it('non-array tasks', () => {
188e484b35bSopenharmony_ci      const result = framework.callJS(instanceId, {
189e484b35bSopenharmony_ci        // @ts-ignore
190e484b35bSopenharmony_ci        method: 'fireEvent',
191e484b35bSopenharmony_ci        args: []
192e484b35bSopenharmony_ci      });
193e484b35bSopenharmony_ci      expect(result).to.be.an.instanceof(Error);
194e484b35bSopenharmony_ci    });
195e484b35bSopenharmony_ci  });
196e484b35bSopenharmony_ci
197e484b35bSopenharmony_ci  describe('destroyInstance', () => {
198e484b35bSopenharmony_ci    it('with no params', () => {
199e484b35bSopenharmony_ci      const result = framework.destroyInstance(undefined);
200e484b35bSopenharmony_ci      expect(result).to.be.an.instanceof(Error);
201e484b35bSopenharmony_ci    });
202e484b35bSopenharmony_ci
203e484b35bSopenharmony_ci    it('with an exist instanceId', () => {
204e484b35bSopenharmony_ci      const result = framework.destroyInstance(instanceId);
205e484b35bSopenharmony_ci      expect(result[instanceId]).to.be.undefined;
206e484b35bSopenharmony_ci    });
207e484b35bSopenharmony_ci
208e484b35bSopenharmony_ci    it('non-exist instanceId', () => {
209e484b35bSopenharmony_ci      const result = framework.destroyInstance('123');
210e484b35bSopenharmony_ci      expect(result).to.be.an.instanceof(Error);
211e484b35bSopenharmony_ci    });
212e484b35bSopenharmony_ci  });
213e484b35bSopenharmony_ci
214e484b35bSopenharmony_ci  describe('registerModules', () => {
215e484b35bSopenharmony_ci    it('with object of modules', () => {
216e484b35bSopenharmony_ci      clearModules();
217e484b35bSopenharmony_ci      expect(allModules()).to.deep.equal({});
218e484b35bSopenharmony_ci      const modules = {
219e484b35bSopenharmony_ci        'system.test': ['getInfo', 'getAvailableStorage', 'getCpuInfo']
220e484b35bSopenharmony_ci      };
221e484b35bSopenharmony_ci      framework.registerModules(modules);
222e484b35bSopenharmony_ci      expect(getModule('system')).to.be.an('object');
223e484b35bSopenharmony_ci      clearModules();
224e484b35bSopenharmony_ci    });
225e484b35bSopenharmony_ci  });
226e484b35bSopenharmony_ci});
227