16a23e08bSopenharmony_ci/*
26a23e08bSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
36a23e08bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46a23e08bSopenharmony_ci * you may not use this file except in compliance with the License.
56a23e08bSopenharmony_ci * You may obtain a copy of the License at
66a23e08bSopenharmony_ci *
76a23e08bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86a23e08bSopenharmony_ci *
96a23e08bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106a23e08bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116a23e08bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126a23e08bSopenharmony_ci * See the License for the specific language governing permissions and
136a23e08bSopenharmony_ci * limitations under the License.
146a23e08bSopenharmony_ci */
156a23e08bSopenharmony_ci
166a23e08bSopenharmony_ci'use strict';
176a23e08bSopenharmony_ci
186a23e08bSopenharmony_ciconst fs = require('fs');
196a23e08bSopenharmony_ciconst path =require('path');
206a23e08bSopenharmony_ci
216a23e08bSopenharmony_ciconst chai = require('chai');
226a23e08bSopenharmony_ciconst sinon = require('sinon');
236a23e08bSopenharmony_ciconst expect = chai.expect;
246a23e08bSopenharmony_ci
256a23e08bSopenharmony_cifunction getActualString(componentName) {
266a23e08bSopenharmony_ci  const filePath = path.join(__dirname, 'testcase/build/pages', `${componentName}`, `${componentName}.js`);
276a23e08bSopenharmony_ci  const fileContent = fs.readFileSync(filePath, 'utf-8');
286a23e08bSopenharmony_ci  const fileString = fileContent.toString();
296a23e08bSopenharmony_ci  return fileString;
306a23e08bSopenharmony_ci}
316a23e08bSopenharmony_ci
326a23e08bSopenharmony_cifunction getExpectJSON(componentName) {
336a23e08bSopenharmony_ci  const matchHashComment = /\/\*(.|\n)+\*\//;
346a23e08bSopenharmony_ci  const filepath = path.join(__dirname, 'expected', `${componentName}.js`);
356a23e08bSopenharmony_ci  const expectedContent = fs.readFileSync(filepath, 'utf-8').substring(607);
366a23e08bSopenharmony_ci  const expectedObj = JSON.parse(expectedContent.toString().replace(matchHashComment, ''));
376a23e08bSopenharmony_ci  return expectedObj;
386a23e08bSopenharmony_ci}
396a23e08bSopenharmony_ci
406a23e08bSopenharmony_cifunction stringifyActual(json) {
416a23e08bSopenharmony_ci  return JSON.stringify(json, function(key, value) {
426a23e08bSopenharmony_ci    if (typeof value === 'function') {
436a23e08bSopenharmony_ci      value = value.toString();
446a23e08bSopenharmony_ci    }
456a23e08bSopenharmony_ci    return value;
466a23e08bSopenharmony_ci  }, ' ');
476a23e08bSopenharmony_ci}
486a23e08bSopenharmony_ci
496a23e08bSopenharmony_cidescribe('build', () => {
506a23e08bSopenharmony_ci  let $app_define$;
516a23e08bSopenharmony_ci  let $app_bootstrap$;
526a23e08bSopenharmony_ci  let components;
536a23e08bSopenharmony_ci  let requireStub;
546a23e08bSopenharmony_ci  let bootstrapStub;
556a23e08bSopenharmony_ci
566a23e08bSopenharmony_ci  function expectActual(name) {
576a23e08bSopenharmony_ci    const actualStr = getActualString(name);
586a23e08bSopenharmony_ci    const fn = new Function('$app_define$', '$app_bootstrap$', actualStr);
596a23e08bSopenharmony_ci    fn($app_define$, $app_bootstrap$);
606a23e08bSopenharmony_ci    const expectJSON = getExpectJSON(name);
616a23e08bSopenharmony_ci    expect(JSON.parse(stringifyActual(components))).eql(expectJSON);
626a23e08bSopenharmony_ci    expect(components).to.include.keys($app_bootstrap$.firstCall.args[0]);
636a23e08bSopenharmony_ci    return actualStr;
646a23e08bSopenharmony_ci  }
656a23e08bSopenharmony_ci
666a23e08bSopenharmony_ci  beforeEach(() => {
676a23e08bSopenharmony_ci    components = {};
686a23e08bSopenharmony_ci    requireStub = sinon.stub();
696a23e08bSopenharmony_ci    bootstrapStub = sinon.stub();
706a23e08bSopenharmony_ci
716a23e08bSopenharmony_ci    $app_define$ = function(componentName, deps, factory) {
726a23e08bSopenharmony_ci      if (components[componentName]) {
736a23e08bSopenharmony_ci        throw new Error(`${componentName} is defined repeatly`);
746a23e08bSopenharmony_ci      }
756a23e08bSopenharmony_ci
766a23e08bSopenharmony_ci      let $app_require$ = requireStub;
776a23e08bSopenharmony_ci      let $app_exports$ = {};
786a23e08bSopenharmony_ci      let $app_module$ = {exports : $app_exports$};
796a23e08bSopenharmony_ci
806a23e08bSopenharmony_ci      factory($app_require$, $app_exports$, $app_module$);
816a23e08bSopenharmony_ci      components[componentName] = $app_module$.exports;
826a23e08bSopenharmony_ci    }
836a23e08bSopenharmony_ci
846a23e08bSopenharmony_ci    $app_bootstrap$ = bootstrapStub;
856a23e08bSopenharmony_ci  });
866a23e08bSopenharmony_ci
876a23e08bSopenharmony_ci  it('class', () => {
886a23e08bSopenharmony_ci    expectActual('class');
896a23e08bSopenharmony_ci  });
906a23e08bSopenharmony_ci  it('event', () => {
916a23e08bSopenharmony_ci    expectActual('event');
926a23e08bSopenharmony_ci  });
936a23e08bSopenharmony_ci  it('expression', () => {
946a23e08bSopenharmony_ci    expectActual('expression');
956a23e08bSopenharmony_ci  });
966a23e08bSopenharmony_ci  it('commonAttr', () => {
976a23e08bSopenharmony_ci    expectActual('commonAttr');
986a23e08bSopenharmony_ci  });
996a23e08bSopenharmony_ci  it('uncommonAttr', () => {
1006a23e08bSopenharmony_ci    expectActual('uncommonAttr');
1016a23e08bSopenharmony_ci  });
1026a23e08bSopenharmony_ci  it('privateAttr', () => {
1036a23e08bSopenharmony_ci    expectActual('privateAttr');
1046a23e08bSopenharmony_ci  });
1056a23e08bSopenharmony_ci  it('forDirective', () => {
1066a23e08bSopenharmony_ci    expectActual('forDirective');
1076a23e08bSopenharmony_ci  });
1086a23e08bSopenharmony_ci  it('ifDirective', () => {
1096a23e08bSopenharmony_ci    expectActual('ifDirective');
1106a23e08bSopenharmony_ci  });
1116a23e08bSopenharmony_ci  it('inlineStyle', () => {
1126a23e08bSopenharmony_ci    expectActual('inlineStyle');
1136a23e08bSopenharmony_ci  });
1146a23e08bSopenharmony_ci  it('exteriorStyle', () => {
1156a23e08bSopenharmony_ci    expectActual('exteriorStyle');
1166a23e08bSopenharmony_ci  });
1176a23e08bSopenharmony_ci  it('importCSS', () => {
1186a23e08bSopenharmony_ci    expectActual('importCSS');
1196a23e08bSopenharmony_ci  });
1206a23e08bSopenharmony_ci  it('mediaQuery', () => {
1216a23e08bSopenharmony_ci    expectActual('mediaQuery');
1226a23e08bSopenharmony_ci  });
1236a23e08bSopenharmony_ci});