| <!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> | 
 |  |