|  | <!DOCTYPE html> | 
|  | <!-- | 
|  | 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. | 
|  | --> | 
|  |  | 
|  |  | 
|  | <html> | 
|  | <head> | 
|  | <meta charset="utf-8"> | 
|  | <meta name="viewport" content="width=device-width, initial-scale=1" /> | 
|  | <script src="lib/simpleRequire.js"></script> | 
|  | <script src="lib/config.js"></script> | 
|  | <script src="lib/jquery.min.js"></script> | 
|  | <script src="lib/facePrint.js"></script> | 
|  | <script src="lib/testHelper.js"></script> | 
|  | <!-- <script src="ut/lib/canteen.js"></script> --> | 
|  | <link rel="stylesheet" href="lib/reset.css" /> | 
|  | </head> | 
|  | <body> | 
|  | <style> | 
|  | </style> | 
|  |  | 
|  |  | 
|  |  | 
|  | <div id="during-case-continue"></div> | 
|  | <div id="during-case-get-curr"></div> | 
|  | <div id="during-case-partial-change"></div> | 
|  | <div id="during-first-frame-correct"></div> | 
|  | <div id="during-ensure-once-in-each-frame"></div> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  |  | 
|  | function renderItem(params, api) { | 
|  | return { | 
|  | type: 'circle', | 
|  | shape: { | 
|  | cx: api.value(0), | 
|  | cy: api.value(1), | 
|  | r: 40, | 
|  | transition: 'cx' | 
|  | }, | 
|  | style: { | 
|  | fill: 'green', | 
|  | }, | 
|  | }; | 
|  | } | 
|  |  | 
|  | var baseX = 60; | 
|  | var baseY = 80 | 
|  |  | 
|  | var option = { | 
|  | series: [{ | 
|  | id: 'a', | 
|  | type: 'custom', | 
|  | coordinateSystem: 'none', | 
|  | renderItem: renderItem, | 
|  | animationDuration: 3000, | 
|  | animationDurationUpdate: 3000, | 
|  | data: [[baseX, baseY]] | 
|  | }] | 
|  | }; | 
|  |  | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'during-case-continue', { | 
|  | title: [ | 
|  | 'Click "move" several times **before animation finished**', | 
|  | 'The cirle should keep move to right **without jump**' | 
|  | ], | 
|  | height: 200, | 
|  | option: option, | 
|  | buttons: [{ | 
|  | text: 'move', | 
|  | onclick: function () { | 
|  | chart.setOption({ | 
|  | series: { | 
|  | id: 'a', | 
|  | data: [[baseX += 60, baseY]] | 
|  | } | 
|  | }); | 
|  | } | 
|  | }] | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  |  | 
|  | function renderItem(params, api) { | 
|  | var renderNumberStart; | 
|  | return { | 
|  | type: 'circle', | 
|  | shape: { | 
|  | cx: api.value(0), | 
|  | cy: api.value(1), | 
|  | r: 40 | 
|  | }, | 
|  | extra: { | 
|  | renderNumber: ++renderNumber, | 
|  | transition: 'renderNumber' | 
|  | }, | 
|  | style: { | 
|  | fill: 'green' | 
|  | }, | 
|  | during: function (apiDuring) { | 
|  | var currNum = apiDuring.getExtra('renderNumber'); | 
|  | !renderNumberStart && (renderNumberStart = currNum); | 
|  | var opacity = (currNum - renderNumberStart) / (renderNumber - renderNumberStart); | 
|  | isNaN(opacity) && (opacity = 1); | 
|  | apiDuring.setStyle('opacity', opacity); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | var renderNumber = 1; | 
|  | var baseX = 60; | 
|  | var baseY = 100; | 
|  |  | 
|  | var option = { | 
|  | series: [{ | 
|  | id: 'a', | 
|  | type: 'custom', | 
|  | coordinateSystem: 'none', | 
|  | renderItem: renderItem, | 
|  | animationDuration: 3000, | 
|  | animationDurationUpdate: 1000, | 
|  | data: [[baseX, baseY]] | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'during-case-get-curr', { | 
|  | title: [ | 
|  | 'Click next several times **before animation finished**', | 
|  | 'Each click, the circle **disappear immediately** and **fade in** at right a bit', | 
|  | 'MUST **not blink**' | 
|  | ], | 
|  | height: 200, | 
|  | option: option, | 
|  | buttons: [{ | 
|  | text: 'next', | 
|  | onclick: function () { | 
|  | chart.setOption({ | 
|  | series: { | 
|  | id: 'a', | 
|  | data: [[baseX += 40, baseY]] | 
|  | } | 
|  | }); | 
|  | } | 
|  | }] | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  |  | 
|  | var baseX = 100; | 
|  | var baseY = 100; | 
|  |  | 
|  | function renderItem(params, api) { | 
|  | var textOpt = { | 
|  | type: 'text', | 
|  | extra: { }, | 
|  | // transition: [], // disable the default transition of x y. | 
|  | style: { x: 20, y: 20, fontSize: 20, stroke: 'green' }, | 
|  | during: function (apiDuring) { | 
|  | var x = apiDuring.getExtra('x'); | 
|  | var y = apiDuring.getExtra('y'); | 
|  | apiDuring.setStyle('text', makeText(x, y)); | 
|  | } | 
|  | }; | 
|  | var movingCircleOpt = { | 
|  | type: 'circle', | 
|  | shape: { cx: 0, cy: 0, r: 10 }, | 
|  | extra: { }, | 
|  | style: { fill: 'red' }, | 
|  | // transition: [], // disable the default transition of x y. | 
|  | during: function (apiDuring) { | 
|  | var x = apiDuring.getExtra('x'); | 
|  | var y = apiDuring.getExtra('y'); | 
|  | apiDuring.setTransform('x', x).setTransform('y', y); | 
|  | } | 
|  | }; | 
|  |  | 
|  | var cmd = api.value(0); | 
|  | if (cmd === 'init') { | 
|  | textOpt.extra.x = baseX; | 
|  | textOpt.extra.y = baseY; | 
|  | textOpt.extra.transition = ['x', 'y']; | 
|  | textOpt.style.text = makeText(baseX, baseY); | 
|  | movingCircleOpt.x = baseX; | 
|  | movingCircleOpt.y = baseY; | 
|  | movingCircleOpt.extra.x = baseX; | 
|  | movingCircleOpt.extra.y = baseY; | 
|  | movingCircleOpt.extra.transition = ['x', 'y']; | 
|  | } | 
|  | else if (cmd === 'x') { | 
|  | baseX += 100; | 
|  | textOpt.extra.x = baseX; | 
|  | textOpt.extra.transition = ['x']; | 
|  | // textOpt.style.text = makeText(baseX, baseY); | 
|  | movingCircleOpt.extra.x = baseX; | 
|  | movingCircleOpt.extra.transition = ['x']; | 
|  | } | 
|  | else if (cmd === 'y') { | 
|  | baseY += 100; | 
|  | textOpt.extra.y = baseY; | 
|  | textOpt.extra.transition = ['y']; | 
|  | // textOpt.style.text = makeText(baseX, baseY); | 
|  | movingCircleOpt.extra.y = baseY; | 
|  | movingCircleOpt.extra.transition = ['y']; | 
|  | } | 
|  |  | 
|  | return { | 
|  | type: 'group', | 
|  | children: [ | 
|  | textOpt, | 
|  | movingCircleOpt, | 
|  | { | 
|  | // Standard circle: used to check the result of moving circle. | 
|  | type: 'circle', | 
|  | x: baseX, | 
|  | y: baseY, | 
|  | transition: [], // disable the default transition of x y. | 
|  | shape: {cx: 0, cy: 0, r: 15}, | 
|  | style: {fill: '#aaa'}, | 
|  | z2: -1 | 
|  | } | 
|  | ] | 
|  | }; | 
|  | } | 
|  |  | 
|  | function makeText(x, y) { | 
|  | return ['x: ' + x.toFixed(2), 'y: ' + y.toFixed(2)].join('\n'); | 
|  | } | 
|  |  | 
|  | var option = { | 
|  | series: [{ | 
|  | id: 'a', | 
|  | type: 'custom', | 
|  | coordinateSystem: 'none', | 
|  | renderItem: renderItem, | 
|  | animationDuration: 3000, | 
|  | animationDurationUpdate: 5000, | 
|  | data: [['init']] | 
|  | }] | 
|  | }; | 
|  |  | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'during-case-partial-change', { | 
|  | title: [ | 
|  | 'Partial change props test:', | 
|  | 'Click "add x" and "add y" before animation finished.', | 
|  | 'The red circle animation should be smooth **without jump**.', | 
|  | 'The red circle should be finally **reach at the grey circle**.', | 
|  | 'The **text should be correct**.', | 
|  | ], | 
|  | height: 500, | 
|  | option: option, | 
|  | buttons: [{ | 
|  | text: 'add x 100', | 
|  | onclick: function () { | 
|  | chart.setOption({ | 
|  | series: { | 
|  | id: 'a', | 
|  | data: [['x']] | 
|  | } | 
|  | }); | 
|  | } | 
|  | }, { | 
|  | text: 'add y 100', | 
|  | onclick: function () { | 
|  | chart.setOption({ | 
|  | series: { | 
|  | id: 'a', | 
|  | data: [['y']] | 
|  | } | 
|  | }); | 
|  | } | 
|  | }] | 
|  | }); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var resultPrinted = false; | 
|  |  | 
|  | function renderItem(params, api) { | 
|  | return { | 
|  | type: 'text', | 
|  | extra: { | 
|  | renderNumber: renderNumber, | 
|  | transition: 'renderNumber' | 
|  | }, | 
|  | style: { | 
|  | x: 100, | 
|  | y: 50, | 
|  | fontSize: 30, | 
|  | enterFrom: { | 
|  | x: 10 | 
|  | } | 
|  | }, | 
|  | during: function (apiDuring) { | 
|  | var currNum = apiDuring.getExtra('renderNumber'); | 
|  | if (resultPrinted || currNum <= 2) { | 
|  | return; | 
|  | } | 
|  | resultPrinted = true; | 
|  | if (currNum === 3) { | 
|  | apiDuring.setStyle('text', 'TEST FAIL'); | 
|  | apiDuring.setStyle('fill', 'red'); | 
|  | } | 
|  | else { | 
|  | apiDuring.setStyle('text', 'TEST PASS'); | 
|  | apiDuring.setStyle('fill', 'green'); | 
|  | } | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | var renderNumber = 2; | 
|  |  | 
|  | var option = { | 
|  | series: [{ | 
|  | id: 'a', | 
|  | type: 'custom', | 
|  | coordinateSystem: 'none', | 
|  | renderItem: renderItem, | 
|  | animationDuration: 10000, | 
|  | animationDurationUpdate: 10000, | 
|  | data: [[10]] | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'during-first-frame-correct', { | 
|  | title: [ | 
|  | 'Test the first during call should not get the target value:', | 
|  | 'Should print TEST PASS' | 
|  | ], | 
|  | option: option, | 
|  | height: 200 | 
|  | }); | 
|  |  | 
|  | chart && setTimeout(function () { | 
|  | renderNumber = 3; | 
|  | chart.setOption({ | 
|  | series: { | 
|  | id: 'a', | 
|  | data: [[10]] | 
|  | } | 
|  | }); | 
|  | // Set option before init finished. | 
|  | }, 100); | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | <script> | 
|  | require(['echarts'], function (echarts) { | 
|  | var resultPrinted = false; | 
|  | var currX = 0; | 
|  | var currFontSize = 16; | 
|  |  | 
|  | function renderItem(params, api) { | 
|  | var cmd = api.value(0); | 
|  |  | 
|  | var opt = { | 
|  | type: 'text', | 
|  | extra: { | 
|  | renderNumber: renderNumber, | 
|  | transition: 'renderNumber' | 
|  | }, | 
|  | style: { | 
|  | x: 100, | 
|  | y: 50, | 
|  | fontSize: currFontSize, | 
|  | fill: 'green' | 
|  | } | 
|  | }; | 
|  |  | 
|  | if (cmd !== 'noDuring') { | 
|  | opt.during = function (apiDuring) { | 
|  | duringCount++; | 
|  | var currNum = apiDuring.getExtra('renderNumber'); | 
|  | apiDuring.setStyle( | 
|  | 'text', | 
|  | 'during count: ' + duringCount + '\n' + 'rAF count: ' + rAFCount | 
|  | ); | 
|  | }; | 
|  | } | 
|  | if (cmd === 'addX') { | 
|  | currX += 50; | 
|  | opt.x = currX; | 
|  | opt.transition = 'x'; | 
|  | } | 
|  | if (cmd === 'addFontSize') { | 
|  | currFontSize += 8; | 
|  | opt.style.fontSize = currFontSize; | 
|  | opt.style.transition = 'fontSize'; | 
|  | } | 
|  |  | 
|  | return opt; | 
|  | } | 
|  |  | 
|  | var renderNumber = 2; | 
|  |  | 
|  | var option = { | 
|  | series: [{ | 
|  | id: 'a', | 
|  | type: 'custom', | 
|  | coordinateSystem: 'none', | 
|  | renderItem: renderItem, | 
|  | animationDuration: 3000, | 
|  | animationDurationUpdate: 3000, | 
|  | data: [[10]] | 
|  | }] | 
|  | }; | 
|  |  | 
|  | var chart = testHelper.create(echarts, 'during-ensure-once-in-each-frame', { | 
|  | title: [ | 
|  | 'Test during only called once in each:', | 
|  | 'In **init** and after **click the buttons**,', | 
|  | 'during count and rAF count', | 
|  | 'should **be the same** (may be 1 different)' | 
|  | ], | 
|  | option: option, | 
|  | height: 200, | 
|  | button: [{ | 
|  | text: 'add x 50', | 
|  | onclick: function () { | 
|  | chart.setOption({ series: { id: 'a', data: [['addX']] } }); | 
|  | startCountFrame(); | 
|  | } | 
|  | }, { | 
|  | text: 'add fontSize 8', | 
|  | onclick: function () { | 
|  | chart.setOption({ series: { id: 'a', data: [['addFontSize']] } }); | 
|  | startCountFrame(); | 
|  | } | 
|  | }] | 
|  | }); | 
|  |  | 
|  | var rAFCount = 0; | 
|  | var duringCount = 0; | 
|  | var rAFId; | 
|  |  | 
|  | function startCountFrame() { | 
|  | stopCountFrame(); | 
|  | rAFId = requestAnimationFrame(countFrame); | 
|  |  | 
|  | function countFrame() { | 
|  | rAFCount++; | 
|  | rAFId = requestAnimationFrame(countFrame); | 
|  | } | 
|  | } | 
|  |  | 
|  | function stopCountFrame() { | 
|  | if (rAFId != null) { | 
|  | cancelAnimationFrame(rAFId); | 
|  | rAFId = null; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (chart) { | 
|  | chart.on('finished', function () { | 
|  | stopCountFrame(); | 
|  | }); | 
|  |  | 
|  | startCountFrame(); | 
|  |  | 
|  | setTimeout(function () { | 
|  | renderNumber = 3; | 
|  | chart.setOption({ series: { id: 'a', data: [['init']] } }); | 
|  | // Set option before init finished. | 
|  | startCountFrame(); | 
|  | }, 100); | 
|  | } | 
|  | }); | 
|  | </script> | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  |  | 
|  | </body> | 
|  | </html> | 
|  |  |