188c88e8eSopenharmony_ci/* 288c88e8eSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one 388c88e8eSopenharmony_ci * or more contributor license agreements. See the NOTICE file 488c88e8eSopenharmony_ci * distributed with this work for additional information 588c88e8eSopenharmony_ci * regarding copyright ownership. The ASF licenses this file 688c88e8eSopenharmony_ci * to you under the Apache License, Version 2.0 (the 788c88e8eSopenharmony_ci * "License"); you may not use this file except in compliance 888c88e8eSopenharmony_ci * with the License. You may obtain a copy of the License at 988c88e8eSopenharmony_ci * 1088c88e8eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 1188c88e8eSopenharmony_ci * 1288c88e8eSopenharmony_ci * Unless required by applicable law or agreed to in writing, 1388c88e8eSopenharmony_ci * software distributed under the License is distributed on an 1488c88e8eSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1588c88e8eSopenharmony_ci * KIND, either express or implied. See the License for the 1688c88e8eSopenharmony_ci * specific language governing permissions and limitations 1788c88e8eSopenharmony_ci * under the License. 1888c88e8eSopenharmony_ci */ 1988c88e8eSopenharmony_ci 2088c88e8eSopenharmony_ci'use strict'; 2188c88e8eSopenharmony_ci 2288c88e8eSopenharmony_ciconst fs = require('fs'); 2388c88e8eSopenharmony_ciconst path =require('path'); 2488c88e8eSopenharmony_ci 2588c88e8eSopenharmony_ciconst chai = require('chai'); 2688c88e8eSopenharmony_ciconst sinon = require('sinon'); 2788c88e8eSopenharmony_ciconst sinonChai = require('sinon-chai'); 2888c88e8eSopenharmony_ciconst expect = chai.expect; 2988c88e8eSopenharmony_cichai.use(sinonChai); 3088c88e8eSopenharmony_ci 3188c88e8eSopenharmony_ciconst Base64 = require('js-base64').Base64; 3288c88e8eSopenharmony_ciconst SourceMap = require('source-map'); 3388c88e8eSopenharmony_ci 3488c88e8eSopenharmony_cifunction getActualString(name) { 3588c88e8eSopenharmony_ci const filepath = path.resolve(__dirname, 'actual', `${name}.js`); 3688c88e8eSopenharmony_ci const result = fs.readFileSync(filepath, 'utf-8'); 3788c88e8eSopenharmony_ci return result.toString(); 3888c88e8eSopenharmony_ci} 3988c88e8eSopenharmony_ci 4088c88e8eSopenharmony_cifunction getExpectJSON(name) { 4188c88e8eSopenharmony_ci const filepath = path.resolve(__dirname, 'expect', `${name}.js`); 4288c88e8eSopenharmony_ci const result = fs.readFileSync(filepath, 'utf-8'); 4388c88e8eSopenharmony_ci return JSON.parse(result.toString()); 4488c88e8eSopenharmony_ci} 4588c88e8eSopenharmony_ci 4688c88e8eSopenharmony_cifunction stringifyActual(json) { 4788c88e8eSopenharmony_ci return JSON.stringify(json, function(key, value) { 4888c88e8eSopenharmony_ci if (typeof value === 'function') { 4988c88e8eSopenharmony_ci value = value.toString(); 5088c88e8eSopenharmony_ci } 5188c88e8eSopenharmony_ci return value; 5288c88e8eSopenharmony_ci }, ' '); 5388c88e8eSopenharmony_ci} 5488c88e8eSopenharmony_ci 5588c88e8eSopenharmony_cifunction extractMap(actualStr) { 5688c88e8eSopenharmony_ci const mapStr = actualStr.match(/\/\/\# sourceMappingURL=data:application\/json;charset=utf-8;base64,([0-9a-zA-Z=+\/]+)/) 5788c88e8eSopenharmony_ci if (mapStr) { 5888c88e8eSopenharmony_ci return JSON.parse(Base64.decode(mapStr[1])); 5988c88e8eSopenharmony_ci } 6088c88e8eSopenharmony_ci} 6188c88e8eSopenharmony_ci 6288c88e8eSopenharmony_cidescribe('build', () => { 6388c88e8eSopenharmony_ci let __weex_define__; 6488c88e8eSopenharmony_ci let __weex_bootstrap__; 6588c88e8eSopenharmony_ci let components; 6688c88e8eSopenharmony_ci let requireStub; 6788c88e8eSopenharmony_ci let bootstrapStub; 6888c88e8eSopenharmony_ci 6988c88e8eSopenharmony_ci function expectActual(name) { 7088c88e8eSopenharmony_ci const actualStr = getActualString(name); 7188c88e8eSopenharmony_ci const fn = new Function('__weex_define__', '__weex_bootstrap__', actualStr); 7288c88e8eSopenharmony_ci fn(__weex_define__, __weex_bootstrap__); 7388c88e8eSopenharmony_ci 7488c88e8eSopenharmony_ci // const filepath = path.resolve(__dirname, 'expect', `${name}.js`); 7588c88e8eSopenharmony_ci // fs.writeFileSync(filepath, stringifyActual(components), 'utf-8'); 7688c88e8eSopenharmony_ci 7788c88e8eSopenharmony_ci const expectJSON = getExpectJSON(name); 7888c88e8eSopenharmony_ci expect(JSON.parse(stringifyActual(components))).eql(expectJSON); 7988c88e8eSopenharmony_ci expect(components).to.include.keys(__weex_bootstrap__.firstCall.args[0]); 8088c88e8eSopenharmony_ci 8188c88e8eSopenharmony_ci return actualStr; 8288c88e8eSopenharmony_ci } 8388c88e8eSopenharmony_ci 8488c88e8eSopenharmony_ci beforeEach(() => { 8588c88e8eSopenharmony_ci components = {}; 8688c88e8eSopenharmony_ci requireStub = sinon.stub(); 8788c88e8eSopenharmony_ci bootstrapStub = sinon.stub(); 8888c88e8eSopenharmony_ci 8988c88e8eSopenharmony_ci __weex_define__ = function(componentName, deps, factory) { 9088c88e8eSopenharmony_ci if (components[componentName]) { 9188c88e8eSopenharmony_ci throw new Error(`${componentName} is defined repeatly`); 9288c88e8eSopenharmony_ci } 9388c88e8eSopenharmony_ci 9488c88e8eSopenharmony_ci var __weex_require__ = requireStub; 9588c88e8eSopenharmony_ci var __weex_exports__ = {}; 9688c88e8eSopenharmony_ci var __weex_module__ = {exports : __weex_exports__} 9788c88e8eSopenharmony_ci 9888c88e8eSopenharmony_ci factory(__weex_require__, __weex_exports__, __weex_module__) 9988c88e8eSopenharmony_ci components[componentName] = __weex_module__.exports 10088c88e8eSopenharmony_ci } 10188c88e8eSopenharmony_ci 10288c88e8eSopenharmony_ci __weex_bootstrap__ = bootstrapStub; 10388c88e8eSopenharmony_ci 10488c88e8eSopenharmony_ci }); 10588c88e8eSopenharmony_ci 10688c88e8eSopenharmony_ci it('single template', () => { 10788c88e8eSopenharmony_ci expectActual('a'); 10888c88e8eSopenharmony_ci }); 10988c88e8eSopenharmony_ci 11088c88e8eSopenharmony_ci it('template with style', () => { 11188c88e8eSopenharmony_ci expectActual('b'); 11288c88e8eSopenharmony_ci }); 11388c88e8eSopenharmony_ci 11488c88e8eSopenharmony_ci it('template with style and script', () => { 11588c88e8eSopenharmony_ci expectActual('c'); 11688c88e8eSopenharmony_ci }); 11788c88e8eSopenharmony_ci 11888c88e8eSopenharmony_ci it('template with single inline element', () => { 11988c88e8eSopenharmony_ci expectActual('d'); 12088c88e8eSopenharmony_ci }); 12188c88e8eSopenharmony_ci 12288c88e8eSopenharmony_ci it('template with multiple inline elements', () => { 12388c88e8eSopenharmony_ci expectActual('e'); 12488c88e8eSopenharmony_ci }); 12588c88e8eSopenharmony_ci 12688c88e8eSopenharmony_ci it('parted files specifed in src', () => { 12788c88e8eSopenharmony_ci expectActual('f'); 12888c88e8eSopenharmony_ci }); 12988c88e8eSopenharmony_ci 13088c88e8eSopenharmony_ci it('component by requiring src and specifing alias', () => { 13188c88e8eSopenharmony_ci expectActual('g'); 13288c88e8eSopenharmony_ci expect(requireStub.callCount).eql(0); 13388c88e8eSopenharmony_ci }); 13488c88e8eSopenharmony_ci 13588c88e8eSopenharmony_ci it('component under same folder', () => { 13688c88e8eSopenharmony_ci expectActual('h'); 13788c88e8eSopenharmony_ci }); 13888c88e8eSopenharmony_ci 13988c88e8eSopenharmony_ci it('template with config and data', () => { 14088c88e8eSopenharmony_ci expectActual('i'); 14188c88e8eSopenharmony_ci expect(bootstrapStub.firstCall.args[1]).is.not.undefined; 14288c88e8eSopenharmony_ci expect(bootstrapStub.firstCall.args[2]).is.not.undefined; 14388c88e8eSopenharmony_ci }); 14488c88e8eSopenharmony_ci 14588c88e8eSopenharmony_ci it('template and use weex module', () => { 14688c88e8eSopenharmony_ci expectActual('j'); 14788c88e8eSopenharmony_ci expect(requireStub.callCount).eql(1); 14888c88e8eSopenharmony_ci expect(requireStub.firstCall.args).eql(['@weex-module/modal']); 14988c88e8eSopenharmony_ci }); 15088c88e8eSopenharmony_ci 15188c88e8eSopenharmony_ci it('template by using custom language', () => { 15288c88e8eSopenharmony_ci expectActual('k'); 15388c88e8eSopenharmony_ci expect(requireStub.callCount).eql(1); 15488c88e8eSopenharmony_ci expect(requireStub.firstCall.args).eql(['@weex-module/modal']); 15588c88e8eSopenharmony_ci }); 15688c88e8eSopenharmony_ci 15788c88e8eSopenharmony_ci it('template and require commonjs module', () => { 15888c88e8eSopenharmony_ci expectActual('l'); 15988c88e8eSopenharmony_ci expect(requireStub.callCount).eql(1); 16088c88e8eSopenharmony_ci expect(requireStub.firstCall.args).eql(['@weex-module/modal']); 16188c88e8eSopenharmony_ci }); 16288c88e8eSopenharmony_ci 16388c88e8eSopenharmony_ci it('template and use weex module in commonjs module', () => { 16488c88e8eSopenharmony_ci expectActual('m'); 16588c88e8eSopenharmony_ci expect(requireStub.callCount).eql(1); 16688c88e8eSopenharmony_ci expect(requireStub.firstCall.args).eql(['@weex-module/modal']); 16788c88e8eSopenharmony_ci }); 16888c88e8eSopenharmony_ci 16988c88e8eSopenharmony_ci it.skip('template with sourcemap', () => { 17088c88e8eSopenharmony_ci const actualStr = expectActual('n'); 17188c88e8eSopenharmony_ci const map = extractMap(actualStr); 17288c88e8eSopenharmony_ci const smc = new SourceMap.SourceMapConsumer(map); 17388c88e8eSopenharmony_ci 17488c88e8eSopenharmony_ci // new Array(276).fill(0).forEach((n, i) => { 17588c88e8eSopenharmony_ci // i = i + 1 17688c88e8eSopenharmony_ci // const original = smc.originalPositionFor({ 17788c88e8eSopenharmony_ci // line: i, 17888c88e8eSopenharmony_ci // column: 0 17988c88e8eSopenharmony_ci // }) 18088c88e8eSopenharmony_ci // if (original.source) { 18188c88e8eSopenharmony_ci // console.log(i, original.line, original.source) 18288c88e8eSopenharmony_ci // } 18388c88e8eSopenharmony_ci // }) 18488c88e8eSopenharmony_ci }); 18588c88e8eSopenharmony_ci 18688c88e8eSopenharmony_ci it('weex examples', () => { 18788c88e8eSopenharmony_ci expectActual('o'); 18888c88e8eSopenharmony_ci }); 18988c88e8eSopenharmony_ci}); 190