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