You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/05/08 08:46:58 UTC

[echarts] 01/02: test(visual): fix progressive rendering in VST

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch enhance-visual-regression-test
in repository https://gitbox.apache.org/repos/asf/echarts.git

commit 0d972e02e3dfa88ad59fcae77374142d1be3e7f2
Author: pissang <bm...@gmail.com>
AuthorDate: Sat May 8 14:55:00 2021 +0800

    test(visual): fix progressive rendering in VST
---
 test/lib/frameInsight.js         | 17 +++++++++++------
 test/runTest/cli.js              |  2 +-
 test/runTest/client/client.js    |  2 +-
 test/runTest/runtime/timeline.js | 12 ++++++++++--
 test/runTest/util.js             | 26 ++++++++++++++++++--------
 test/stream-basic.js             |  1 +
 test/stream-basic1.html          |  2 +-
 7 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/test/lib/frameInsight.js b/test/lib/frameInsight.js
index 493e553..cca8bdb 100644
--- a/test/lib/frameInsight.js
+++ b/test/lib/frameInsight.js
@@ -43,12 +43,17 @@
         addEventListener: global.addEventListener
     };
 
-    var now = global.performance
-        // performance.now has higer accuracy.
-        ? performance.now.bind(performance)
-        : function () {
-            return +new Date();
-        };
+    // var now = global.performance
+    //     // performance.now has higer accuracy.
+    //     ? performance.now.bind(performance)
+    //     : function () {
+    //         return +new Date();
+    //     };
+
+    // performance.now is not mocked in the visual regression test. Always use Date.now
+    var now = function () {
+        return Date.now();
+    };
 
     instrumentBase();
 
diff --git a/test/runTest/cli.js b/test/runTest/cli.js
index bd5af5f..99070a2 100644
--- a/test/runTest/cli.js
+++ b/test/runTest/cli.js
@@ -24,7 +24,7 @@ const fs = require('fs');
 const path = require('path');
 const program = require('commander');
 const compareScreenshot = require('./compareScreenshot');
-const {testNameFromFile, fileNameFromTest, getVersionDir, buildRuntimeCode, getEChartsTestFileName, waitTime} = require('./util');
+const {testNameFromFile, fileNameFromTest, getVersionDir, buildRuntimeCode, getEChartsTestFileName} = require('./util');
 const {origin} = require('./config');
 const cwebpBin = require('cwebp-bin');
 const { execFile } = require('child_process');
diff --git a/test/runTest/client/client.js b/test/runTest/client/client.js
index 26214e7..ea5d53d 100644
--- a/test/runTest/client/client.js
+++ b/test/runTest/client/client.js
@@ -419,7 +419,7 @@ function runTests(tests, noHeadless) {
         threads: app.runConfig.threads,
         renderer: app.runConfig.renderer,
         noHeadless,
-        replaySpeed: noHeadless ? 2 : 5
+        replaySpeed: noHeadless ? 5 : 5
     });
 }
 
diff --git a/test/runTest/runtime/timeline.js b/test/runTest/runtime/timeline.js
index fb2fa04..0c1b644 100644
--- a/test/runTest/runtime/timeline.js
+++ b/test/runTest/runtime/timeline.js
@@ -131,8 +131,15 @@ function flushIntervalHandlers() {
 const NativeDate = window.Date;
 
 const mockNow = function () {
+    // // Use same time in one frame.
+    // var realFrameTime = NativeDate.now();
+    // // Split frame. Add 8ms offset on the second half
+    // // Avoid infinite loop when some logic determine whether to break the loop based on the execution time.
+    // // For example https://github.com/apache/echarts/blob/737e23c0054e6b501ecc6f562920cffae953b5c6/src/core/echarts.ts#L537
+    // var frameDeltaTime = realFrameTime - realFrameStartTime;
+    var frameDeltaTime = 0;
     // Use same time in one frame.
-    return TIMELINE_START + timelineTime * window.__VST_PLAYBACK_SPEED__;
+    return TIMELINE_START + (timelineTime + frameDeltaTime) * window.__VST_PLAYBACK_SPEED__;
 };
 function MockDate(...args) {
     if (!args.length) {
@@ -145,9 +152,10 @@ function MockDate(...args) {
 MockDate.prototype = Object.create(NativeDate.prototype);
 Object.setPrototypeOf(MockDate, NativeDate);
 MockDate.now = mockNow;
-
 window.Date = MockDate;
 
+// TODO Do we need to mock performance? Or leave some API that can keep real.
+
 
 export function start() {
     window.__VST_TIMELINE_PAUSED__ = false;
diff --git a/test/runTest/util.js b/test/runTest/util.js
index 53a0937..de31b41 100644
--- a/test/runTest/util.js
+++ b/test/runTest/util.js
@@ -27,7 +27,11 @@ const commonjs = require('@rollup/plugin-commonjs');
 const config = require('./config');
 
 function modifyEChartsCode(code) {
-    return code.replace(/Math.random/g, '__random__inner__');
+    return code.replace(/Math\.random/g, '__random__inner__')
+        // https://github.com/apache/echarts/blob/737e23c0054e6b501ecc6f562920cffae953b5c6/src/core/echarts.ts#L537
+        // This code will cause infinite loop if we reduce the precision of Date in the visual regression test.
+        // TODO: This is a very dirty HACK.
+        .replace('remainTime > 0', 'false');
 }
 
 module.exports.testNameFromFile = function(fileName) {
@@ -53,20 +57,22 @@ module.exports.getEChartsTestFileName = function () {
 };
 
 module.exports.prepareEChartsLib = function (version) {
-    let versionFolder = path.join(__dirname, getVersionDir(version));
+
+    const versionFolder = path.join(__dirname, getVersionDir(version));
+    const ecDownloadPath = `${versionFolder}/echarts.js`;
     fse.ensureDirSync(versionFolder);
     if (!version || version === 'local') {
         // Developing version, make sure it's new build
         fse.copySync(path.join(__dirname, '../../dist/echarts.js'), `${versionFolder}/echarts.js`);
-        let code = modifyEChartsCode(fs.readFileSync(`${versionFolder}/echarts.js`, 'utf-8'));
+        let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
         fs.writeFileSync(`${versionFolder}/${module.exports.getEChartsTestFileName()}`, code, 'utf-8');
-        return Promise.resolve();
 
+        return Promise.resolve();
     }
     return new Promise(resolve => {
-        let testLibPath = `${versionFolder}/${module.exports.getEChartsTestFileName()}`;
-        if (!fs.existsSync(testLibPath)) {
-            const file = fs.createWriteStream(`${versionFolder}/echarts.js`);
+        const testLibPath = `${versionFolder}/${module.exports.getEChartsTestFileName()}`;
+        if (!fs.existsSync(ecDownloadPath)) {
+            const file = fs.createWriteStream();
             const isNightly = version.includes('-dev');
             const packageName = isNightly ? 'echarts-nightly' : 'echarts'
 
@@ -75,13 +81,17 @@ module.exports.prepareEChartsLib = function (version) {
                 response.pipe(file);
 
                 file.on('finish', () => {
-                    let code = modifyEChartsCode(fs.readFileSync(`${versionFolder}/echarts.js`, 'utf-8'));
+                    let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
                     fs.writeFileSync(testLibPath, code, 'utf-8');
                     resolve();
                 });
             });
         }
         else {
+            // Always do code modifaction.
+            // In case we need to do replacement on old downloads.
+            let code = modifyEChartsCode(fs.readFileSync(ecDownloadPath, 'utf-8'));
+            fs.writeFileSync(testLibPath, code, 'utf-8');
             resolve();
         }
     });
diff --git a/test/stream-basic.js b/test/stream-basic.js
index 87360a1..ffb4114 100644
--- a/test/stream-basic.js
+++ b/test/stream-basic.js
@@ -23,6 +23,7 @@
     var _recordContainer;
     var CELL_MAX = 160;
 
+
     if (window.Canteen) {
         window.Canteen.globals.STACK_SIZE = 100000000;
     }
diff --git a/test/stream-basic1.html b/test/stream-basic1.html
index 0bdc9bd..4bfead6 100644
--- a/test/stream-basic1.html
+++ b/test/stream-basic1.html
@@ -55,7 +55,7 @@ under the License.
 
             var count = 5000;
             var lineCount = 100;
-            var progressive = 50;
+            var progressive = 100;
             var data = [];
             var yCurr = 5;
             for (var i = 0; i < count; i++) {

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org