blob: 6cb4c57ea8e871e5ff9db9717b7434361d17fa2f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
'use strict';
const fs = require('fs');
const path =require('path');
const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const expect = chai.expect;
chai.use(sinonChai);
const Base64 = require('js-base64').Base64;
const SourceMap = require('source-map');
function getActualString(name) {
const filepath = path.resolve(__dirname, 'actual', `${name}.js`);
const result = fs.readFileSync(filepath, 'utf-8');
return result.toString();
}
function getExpectJSON(name) {
const filepath = path.resolve(__dirname, 'expect', `${name}.js`);
const result = fs.readFileSync(filepath, 'utf-8');
return JSON.parse(result.toString());
}
function stringifyActual(json) {
return JSON.stringify(json, function(key, value) {
if (typeof value === 'function') {
value = value.toString();
}
return value;
}, ' ');
}
function extractMap(actualStr) {
const mapStr = actualStr.match(/\/\/\# sourceMappingURL=data:application\/json;charset=utf-8;base64,([0-9a-zA-Z=+\/]+)/)
if (mapStr) {
return JSON.parse(Base64.decode(mapStr[1]));
}
}
describe('build', () => {
let __weex_define__;
let __weex_bootstrap__;
let components;
let requireStub;
let bootstrapStub;
function expectActual(name) {
const actualStr = getActualString(name);
const fn = new Function('__weex_define__', '__weex_bootstrap__', actualStr);
fn(__weex_define__, __weex_bootstrap__);
// const filepath = path.resolve(__dirname, 'expect', `${name}.js`);
// fs.writeFileSync(filepath, stringifyActual(components), 'utf-8');
const expectJSON = getExpectJSON(name);
expect(JSON.parse(stringifyActual(components))).eql(expectJSON);
expect(components).to.include.keys(__weex_bootstrap__.firstCall.args[0]);
return actualStr;
}
beforeEach(() => {
components = {};
requireStub = sinon.stub();
bootstrapStub = sinon.stub();
__weex_define__ = function(componentName, deps, factory) {
if (components[componentName]) {
throw new Error(`${componentName} is defined repeatly`);
}
var __weex_require__ = requireStub;
var __weex_exports__ = {};
var __weex_module__ = {exports : __weex_exports__}
factory(__weex_require__, __weex_exports__, __weex_module__)
components[componentName] = __weex_module__.exports
}
__weex_bootstrap__ = bootstrapStub;
});
it('single template', () => {
expectActual('a');
});
it('template with style', () => {
expectActual('b');
});
it('template with style and script', () => {
expectActual('c');
});
it('template with single inline element', () => {
expectActual('d');
});
it('template with multiple inline elements', () => {
expectActual('e');
});
it('parted files specifed in src', () => {
expectActual('f');
});
it('component by requiring src and specifing alias', () => {
expectActual('g');
expect(requireStub.callCount).eql(0);
});
it('component under same folder', () => {
expectActual('h');
});
it('template with config and data', () => {
expectActual('i');
expect(bootstrapStub.firstCall.args[1]).is.not.undefined;
expect(bootstrapStub.firstCall.args[2]).is.not.undefined;
});
it('template and use weex module', () => {
expectActual('j');
expect(requireStub.callCount).eql(1);
expect(requireStub.firstCall.args).eql(['@weex-module/modal']);
});
it('template by using custom language', () => {
expectActual('k');
expect(requireStub.callCount).eql(1);
expect(requireStub.firstCall.args).eql(['@weex-module/modal']);
});
it('template and require commonjs module', () => {
expectActual('l');
expect(requireStub.callCount).eql(1);
expect(requireStub.firstCall.args).eql(['@weex-module/modal']);
});
it('template and use weex module in commonjs module', () => {
expectActual('m');
expect(requireStub.callCount).eql(1);
expect(requireStub.firstCall.args).eql(['@weex-module/modal']);
});
it.skip('template with sourcemap', () => {
const actualStr = expectActual('n');
const map = extractMap(actualStr);
const smc = new SourceMap.SourceMapConsumer(map);
// new Array(276).fill(0).forEach((n, i) => {
// i = i + 1
// const original = smc.originalPositionFor({
// line: i,
// column: 0
// })
// if (original.source) {
// console.log(i, original.line, original.source)
// }
// })
});
it('weex examples', () => {
expectActual('o');
});
});