<!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/esl.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="main_normalMerge_basic"></div>
        <div id="main_replaceMerge_basic"></div>
        <div id="main_normalMerge_add"></div>
        <div id="main_replaceMerge_add_no_id"></div>
        <div id="main_replaceMerge_add_new_id"></div>
        <div id="main_replaceMerge_add_find_hole"></div>
        <div id="main_normalMerge_add_find_hole"></div>
        <div id="main_replaceMerge_internal_and_other_cmpt_not_effect"></div>
        <div id="main_replaceMerge_remove_all"></div>
        <div id="main_replaceMerge_reproduce_by_getOption_src"></div>
        <div id="main_replaceMerge_reproduce_by_getOption_tar"></div>
        <div id="main_replaceMerge_if_not_declared_in_option"></div>
        <div id="main_throw_error_when_id_duplicated"></div>




        <script>
            function makeBasicOption(opt) {
                return {
                    xAxis: {
                        type: 'category'
                    },
                    yAxis: {},
                    legend: {},
                    tooltip: {},
                    dataZoom: [{
                        type: 'slider'
                    }, {
                        type: 'inside'
                    }],
                    series: [{
                        id: 'a',
                        name: 'aa',
                        type: 'line',
                        data: [['a11', 22], ['a33', 44]]
                    }, {
                        id: 'b',
                        name: 'bb',
                        type: 'line',
                        data: [['a11', 55], ['a33', 77]]
                    }, {
                        id: 'c',
                        name: 'cc',
                        type: 'line',
                        data: [['a11', 66], ['a33', 100]]
                    }, {
                        id: 'd',
                        name: 'dd',
                        type: 'line',
                        data: [['a11', 99], ['a33', 130]]
                    }, {
                        name: 'no_id',
                        type: 'line',
                        data: [['a11', 130], ['a33', 160]]
                    }]
                };
            }

        </script>



        <!-- ----------------------------- -->
        <!-- ----------------------------- -->
        <!-- ----------------------------- -->



        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_normalMerge_basic', {
                title: [
                    'normalMerge: basic case',
                    'click "setOption": "bb" become bar chart, "aa" become **rect** symbol',
                    'other series **do not change**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'b',
                                type: 'bar',
                                data: [['a11', 55], ['a33', 77]]
                            }, {
                                id: 'a',
                                symbol: 'rect'
                            }]
                        })
                    }
                }],
                height: 300
            });
        });
        </script>




        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_replaceMerge_basic', {
                title: [
                    'replaceMerge: basic case',
                    'click "setOption": "bb" become bar chart, "aa" become **rect** symbol',
                    'other series **removed**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'b',
                                type: 'bar',
                                data: [['a11', 55], ['a33', 77]]
                            }, {
                                id: 'a',
                                symbol: 'rect'
                            }]
                        }, {replaceMerge: 'series'})
                    }
                }, {
                    text: 'check after click setOption',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 2);
                            assert(chart.getModel().getSeriesCount() === 2);
                        });
                    }
                }],
                height: 300
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_normalMerge_add', {
                title: [
                    'normalMerge: add',
                    'click "setOption": "aa" become **rect** symbol, "no_id" become "new_no_id" and bar',
                    'other series **do not change**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'a',
                                symbol: 'rect'
                            }, {
                                name: 'new_no_id',
                                type: 'bar',
                                data: [['a11', 10], ['a33', 20]]
                            }]
                        })
                    }
                }],
                height: 300
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_replaceMerge_add_no_id', {
                title: [
                    'replaceMerge: add (add no id)',
                    'click "setOption": "aa" become **rect** symbol, bar series "new_no_id" added',
                    'other series **removed**',
                    'click "check": should show **checked: Pass**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'a',
                                symbol: 'rect'
                            }, {
                                name: 'new_no_id',
                                type: 'bar',
                                data: [['a11', 10], ['a33', 20]]
                            }]
                        }, {replaceMerge: ['series']});
                    }
                }, {
                    text: 'check after click setOption',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 2);
                            assert(
                                seriesModels[1].componentIndex === 1
                                && seriesModels[1].name === 'new_no_id'
                            );
                            assert(chart.getModel().getSeriesCount() === 2);
                        });
                    }
                }],
                height: 300
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_replaceMerge_add_new_id', {
                title: [
                    'replaceMerge: add (has new id)',
                    'click "setOption": "aa" become **rect** symbol, bar series "xx" added',
                    'other series **removed**',
                    'click "check": should show **checked: Pass**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'a',
                                symbol: 'rect'
                            }, {
                                id: 'x',
                                name: 'xx',
                                type: 'bar',
                                data: [['a11', 10], ['a33', 20]]
                            }]
                        }, {replaceMerge: 'series'});
                    }
                }, {
                    text: 'check after click setOption',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 2);
                            assert(
                                seriesModels[1].componentIndex === 1
                                && seriesModels[1].name === 'xx'
                            );
                            assert(chart.getModel().getSeriesCount() === 2);
                        });
                    }
                }],
                height: 300
            });
        });
        </script>








        <script>
        require(['echarts'], function (echarts) {
            function makeInitOption() {
                var option = makeBasicOption();

                option.toolbox = {
                    left: 'center',
                    top: 25,
                    feature: {
                        magicType: {
                            show: true,
                            type: ['line', 'bar']
                        },
                        dataZoom: {},
                        restore: {},
                        dataView: {}
                    }
                };

                return option;
            }

            var chart = testHelper.create(echarts, 'main_replaceMerge_add_find_hole', {
                title: [
                    '**replaceMerge**: add (find the first hole)',
                    '<1> click the buttons one by one from left to right',
                    'should show **TWO checked: Pass**',
                    '<2> use **toolbox.dataZoom**, then click btns again, should be OK',
                    '<3> use **toolbox.magicType**, then click btns again, should be OK',
                    '<4> use **toolbox.dataView**, then click btns again, should be OK',
                    '<5> use **toolbox.restore**, then click btns again, should be OK',
                ],
                option: makeInitOption(),
                buttons: [{
                    text: 'remove some',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'a'
                            }, {
                                id: 'c'
                            }, {
                                id: 'd'
                            }]
                        }, {replaceMerge: 'series'});
                    }
                }, {
                    text: 'then check',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 3);
                            assert(seriesModels[0].componentIndex === 0);
                            assert(seriesModels[1].componentIndex === 2);
                            assert(seriesModels[2].componentIndex === 3);
                            assert(seriesModels[0].id === 'a');
                            assert(seriesModels[1].id === 'c');
                            assert(seriesModels[2].id === 'd');

                            assert(chart.getModel().getSeriesCount() === 3);

                            var optionGotten = chart.getOption();
                            assert(optionGotten.series.length === 4);
                            assert(optionGotten.series[0].name === 'aa');
                            assert(optionGotten.series[1] == null);
                            assert(optionGotten.series[2].name === 'cc');
                            assert(optionGotten.series[3].name === 'dd');

                            assert(chart.getModel().getSeriesByIndex(1) == null);
                            assert(chart.getModel().getComponent('series', 1) == null);

                            var eachModelResult = [];
                            var eachIndexResult = [];
                            chart.getModel().eachComponent('series', function (seriesModel, seriesIndex) {
                                eachModelResult.push(seriesModel);
                                eachIndexResult.push(seriesIndex);
                            });
                            assert(eachModelResult.length === 3 && eachIndexResult.length === 3);
                            for (var i = 0; i < 3; i++) {
                                assert(eachModelResult[i] === seriesModels[i]);
                                assert(eachIndexResult[i] === seriesModels[i].componentIndex);
                            }
                        });
                    }
                }, {
                    text: 'replaceMerge',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'm',
                                type: 'bar',
                                data: [['a11', 22], ['a33', 44]]
                            }, {
                                id: 'n',
                                type: 'bar',
                                data: [['a11', 32], ['a33', 54]]
                            }, {
                                id: 'a'
                            }, {
                                id: 'c'
                            }, {
                                id: 'd'
                            }]
                        }, {replaceMerge: 'series'});
                    }
                }, {
                    text: 'then check',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 5);
                            assert(seriesModels[0].componentIndex === 0);
                            assert(seriesModels[1].componentIndex === 1);
                            assert(seriesModels[2].componentIndex === 2);
                            assert(seriesModels[3].componentIndex === 3);
                            assert(seriesModels[4].componentIndex === 4);
                            assert(seriesModels[0].id === 'a');
                            assert(seriesModels[1].id === 'm');
                            assert(seriesModels[2].id === 'c');
                            assert(seriesModels[3].id === 'd');
                            assert(seriesModels[4].id === 'n');

                            assert(chart.getModel().getSeriesCount() === 5);

                            var optionGotten = chart.getOption();
                            assert(optionGotten.series.length === 5);
                            assert(optionGotten.series[0].id === 'a');
                            assert(optionGotten.series[1].id === 'm');
                            assert(optionGotten.series[2].id === 'c');
                            assert(optionGotten.series[3].id === 'd');
                            assert(optionGotten.series[4].id === 'n');

                            assert(chart.getModel().getSeriesByIndex(1).id == 'm');
                            assert(chart.getModel().getComponent('series', 1).id == 'm');

                            var eachModelResult = [];
                            var eachIndexResult = [];
                            chart.getModel().eachComponent('series', function (seriesModel, seriesIndex) {
                                eachModelResult.push(seriesModel);
                                eachIndexResult.push(seriesIndex);
                            });
                            assert(eachModelResult.length === 5 && eachIndexResult.length === 5);
                            for (var i = 0; i < 5; i++) {
                                assert(eachModelResult[i] === seriesModels[i]);
                                assert(eachIndexResult[i] === seriesModels[i].componentIndex);
                            }
                        });
                    }
                }, {
                    text: 'reset all',
                    onclick: function () {
                        chart.setOption(makeInitOption(), true);
                    }
                }],
                height: 300
            });
        });
        </script>







        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_normalMerge_add_find_hole', {
                title: [
                    '**normalMerge**: add (find the first hole)',
                    'click the buttons one by one from left to right',
                    'should show **TWO checked: Pass**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption_remove',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'a'
                            }, {
                                id: 'c'
                            }, {
                                id: 'd'
                            }]
                        }, {replaceMerge: 'series'});
                    }
                }, {
                    text: 'check after click setOption_remove',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 3);
                            assert(seriesModels[0].componentIndex === 0);
                            assert(seriesModels[1].componentIndex === 2);
                            assert(seriesModels[2].componentIndex === 3);
                            assert(seriesModels[0].id === 'a');
                            assert(seriesModels[1].id === 'c');
                            assert(seriesModels[2].id === 'd');

                            assert(chart.getModel().getSeriesCount() === 3);

                            var optionGotten = chart.getOption();
                            assert(optionGotten.series.length === 4);
                            assert(optionGotten.series[0].name === 'aa');
                            assert(optionGotten.series[1] == null);
                            assert(optionGotten.series[2].name === 'cc');
                            assert(optionGotten.series[3].name === 'dd');

                            assert(chart.getModel().getSeriesByIndex(1) == null);
                            assert(chart.getModel().getComponent('series', 1) == null);
                        });
                    }
                }, {
                    text: 'setOption_normalMerge',
                    onclick: function () {
                        chart.setOption({
                            series: [{
                                id: 'm',
                                type: 'bar',
                                data: [['a11', 22], ['a33', 44]]
                            }, {
                                id: 'n',
                                type: 'bar',
                                data: [['a11', 32], ['a33', 54]]
                            }]
                        });
                    }
                }, {
                    text: 'check after click setOption_normalMerge',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 5);
                            assert(seriesModels[0].componentIndex === 0);
                            assert(seriesModels[1].componentIndex === 1);
                            assert(seriesModels[2].componentIndex === 2);
                            assert(seriesModels[3].componentIndex === 3);
                            assert(seriesModels[4].componentIndex === 4);
                            assert(seriesModels[0].id === 'a');
                            assert(seriesModels[1].id === 'm');
                            assert(seriesModels[2].id === 'c');
                            assert(seriesModels[3].id === 'd');
                            assert(seriesModels[4].id === 'n');

                            assert(chart.getModel().getSeriesCount() === 5);

                            var optionGotten = chart.getOption();
                            assert(optionGotten.series.length === 5);
                            assert(optionGotten.series[0].id === 'a');
                            assert(optionGotten.series[1].id === 'm');
                            assert(optionGotten.series[2].id === 'c');
                            assert(optionGotten.series[3].id === 'd');
                            assert(optionGotten.series[4].id === 'n');

                            assert(chart.getModel().getSeriesByIndex(1).id == 'm');
                            assert(chart.getModel().getComponent('series', 1).id == 'm');
                        });
                    }
                }],
                height: 300
            });
        });
        </script>







        <script>
        require(['echarts'], function (echarts) {
        var option = {
                xAxis: {
                    type: 'category'
                },
                yAxis: {},
                legend: {},
                tooltip: {},
                toolbox: {
                    feature: {
                        dataZoom: {}
                    }
                },
                dataZoom: [{
                    id: 'inside_dz',
                    type: 'inside'
                }],
                series: [{
                    id: 'a',
                    name: 'aa',
                    type: 'line',
                    data: [['a11', 22], ['a33', 44]]
                }, {
                    id: 'b',
                    name: 'bb',
                    type: 'line',
                    data: [['a11', 55], ['a33', 77]]
                }]
            };

            var chart = testHelper.create(echarts, 'main_replaceMerge_internal_and_other_cmpt_not_effect', {
                title: [
                    'replaceMerge: inner not effect',
                    'click "setOption": a dataZoom.slider added',
                    'check **inside dataZoom** and **select dataZoom** on toolbox still OK',
                    'series **not change**',
                    'click "check": should show **checked: Pass**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            dataZoom: [{
                               type: 'slider'
                            }, {
                                id: 'inside_dz'
                            }]
                        }, {replaceMerge: ['dataZoom']});
                    }
                }, {
                    text: 'check after click setOption',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var insideDZ = chart.getModel().getComponent('dataZoom', 0);
                            var selectDZX = chart.getModel().getComponent('dataZoom', 1);
                            var selectDZY = chart.getModel().getComponent('dataZoom', 2);
                            var sliderDZ = chart.getModel().getComponent('dataZoom', 3);
                            assert(insideDZ.type === 'dataZoom.inside');
                            assert(selectDZX.type === 'dataZoom.select');
                            assert(selectDZY.type === 'dataZoom.select');
                            assert(sliderDZ.type === 'dataZoom.slider');
                            assert(chart.getModel().getComponent('dataZoom', 4) == null);
                        });
                    }
                }],
                height: 300
            });
        });
        </script>





        <script>
        require(['echarts'], function (echarts) {
            var option = makeBasicOption();

            var chart = testHelper.create(echarts, 'main_replaceMerge_remove_all', {
                title: [
                    'replaceMerge: remove all',
                    'click "setOption": "all series should be removed"',
                    'click "check": should show **checked: Pass**'
                ],
                option: option,
                buttons: [{
                    text: 'setOption',
                    onclick: function () {
                        chart.setOption({
                            series: []
                        }, {replaceMerge: 'series'});
                    }
                }, {
                    text: 'check after click setOption',
                    onclick: function () {
                        testHelper.printAssert(chart, function (assert) {
                            var seriesModels = chart.getModel().getSeries();
                            assert(seriesModels.length === 0);
                            assert(chart.getModel().getSeriesCount() === 0);
                        });
                    }
                }],
                height: 300
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            function makeInitOption() {
                var option = {
                    grid: [{
                        right: '55%',
                        bottom: 70
                    }, {
                        id: 'grid-r',
                        left: '55%',
                        bottom: 70
                    }],
                    xAxis: [{
                        type: 'category',
                        gridIndex: 0,
                    }, {
                        id: 'xAxis-r',
                        type: 'category',
                        gridIndex: 1,
                    }],
                    yAxis: [{
                        gridIndex: 0
                    }, {
                        id: 'yAxis-r',
                        gridIndex: 1
                    }],
                    legend: {},
                    tooltip: {},
                    dataZoom: [{
                        type: 'slider'
                    }, {
                        type: 'inside'
                    }],
                    toolbox: {
                        left: 'center',
                        top: 25,
                        feature: {
                            magicType: {
                                show: true,
                                type: ['line', 'bar']
                            },
                            dataZoom: {},
                            restore: {},
                            dataView: {}
                        }
                    },
                    series: [{
                        id: 'a',
                        name: 'aa',
                        type: 'line',
                        data: [['a11', 22], ['a33', 44]]
                    }, {
                        id: 'b',
                        name: 'bb',
                        type: 'line',
                        data: [['a11', 55], ['a33', 77]],
                        xAxisIndex: 1,
                        yAxisIndex: 1,
                    }, {
                        id: 'c',
                        name: 'cc',
                        type: 'line',
                        data: [['a11', 66], ['a33', 100]]
                    }, {
                        name: 'no_id',
                        type: 'line',
                        data: [['a11', 130], ['a33', 160]]
                    }]
                };

                return option;
            }

            var chartSrc = testHelper.create(echarts, 'main_replaceMerge_reproduce_by_getOption_src', {
                title: [
                    '**replaceMerge**: test reproduce via **getOption**',
                    'Click "remove left grid"',
                    'left grid removed and dataZoom go to right grid',
                    'use insideZoom',
                    'Click "reproduce1"',
                    'should show **TWO checked: Pass**',
                    'The chart reproduced below should be **the same**'
                ],
                option: makeInitOption(),
                buttons: [{
                    text: 'remove left grid',
                    onclick: function () {
                        chartSrc.setOption({
                            grid: {
                                id: 'grid-r'
                            },
                            xAxis: {
                                id: 'xAxis-r'
                            },
                            yAxis: {
                                id: 'yAxis-r'
                            },
                            series: [{
                                id: 'b'
                            }]
                        }, { replaceMerge: ['series', 'grid', 'xAxis', 'yAxis'] });
                    }
                }, {
                    text: 'reproduce',
                    onclick: function () {
                        testHelper.printAssert(chartSrc, function (assert) {
                            var seriesModels = chartSrc.getModel().getSeries();
                            assert(seriesModels.length === 1);
                            assert(seriesModels[0].componentIndex === 1);

                            var optionGotten = chartSrc.getOption();
                            assert(optionGotten.series.length === 2);
                            assert(optionGotten.series[0] === null);
                            assert(optionGotten.series[1].id === 'b');

                            console.log(optionGotten);
                            chartTar.setOption(optionGotten);
                        });
                    }
                }],
                height: 200
            });

            var chartTar = testHelper.create(echarts, 'main_replaceMerge_reproduce_by_getOption_tar', {
                title: [
                    '↓↓↓ reproduce ↓↓↓ ',
                ],
                option: {},
                height: 200
            });

        });
        </script>











        <script>
        require(['echarts'], function (echarts) {
            function makePartialOption() {
                return {
                    grid: [{
                        bottom: '60%'
                    }, {
                        id: 'gb',
                        top: '60%'
                    }],
                    xAxis: [{
                        type: 'category'
                    }, {
                        type: 'category'
                    }, {
                        id: 'xb0',
                        type: 'category',
                        gridIndex: 1
                    }, {
                        id: 'xb1',
                        type: 'category',
                        gridIndex: 1
                    }],
                    yAxis: [{

                    }, {
                        id: 'yb',
                        gridIndex: 1
                    }],
                    series: [{
                        type: 'line',
                        data: [[11, 22], [33, 44]]
                    }, {
                        type: 'line',
                        xAxisIndex: 1,
                        data: [[11111, 52], [21133, 74]]
                    }, {
                        id: 'sb0',
                        type: 'line',
                        xAxisIndex: 2,
                        yAxisIndex: 1,
                        data: [[23, 432], [54, 552]]
                    }, {
                        id: 'sb1',
                        type: 'line',
                        xAxisIndex: 3,
                        yAxisIndex: 1,
                        data: [[222233, 1432], [111154, 1552]]
                    }]
                };
            }

            var option = echarts.util.extend(makePartialOption(), {
                toolbox: {
                    left: 'center',
                    feature: {
                        dataZoom: {}
                    }
                },
                dataZoom: [{
                    type: 'slider',
                    xAxisIndex: 'all'
                }, {
                    type: 'inside',
                    xAxisIndex: 'all'
                }]
            });

            var chart = testHelper.create(echarts, 'main_replaceMerge_if_not_declared_in_option', {
                title: [
                    'DataZoom controlls all of the axes.',
                    'Click btn "remove all grids".',
                    'Should no error.',
                    'Click btn "addback".',
                    'Functionalities should be OK.'
                ],
                option: option,
                height: 350,
                buttons: [{
                    text: 'remove all grids',
                    onclick: function () {
                        chart.setOption({
                            // Not declared in option
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }, {
                    text: 'addback',
                    onclick: function () {
                        chart.setOption(makePartialOption());
                    }
                }]
            });
        });
        </script>









        <script>
        require(['echarts'], function (echarts) {
            var option;

            option = {
                xAxis: [{
                    type: 'category'
                }],
                yAxis: [{
                }],
                series: [{
                    id: 'sb0',
                    type: 'line',
                    data: [[11, 22], [33, 44]]
                }, {
                    type: 'line',
                    data: [[11111, 52], [21133, 74]]
                }, {
                    id: 'sb0',
                    type: 'line',
                    data: [[222233, 1432], [111154, 1552]]
                }]
            };

            testHelper.printAssert('main_throw_error_when_id_duplicated', function (assert) {
                try {
                    var chart = testHelper.create(echarts, 'main_throw_error_when_id_duplicated', {
                        title: [
                            'Check throw error when id duplicated',
                            'Should show **checked: Pass**'
                        ],
                        option: option,
                        height: 100,
                    });
                    assert(false);
                }
                catch (err) {
                    assert(true);
                }
            });

        });
        </script>





    </body>
</html>

