| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372 | import { Cascader, Icon } from '../../index';import { clear } from 'jest-date-mock';import { BASE_CLASS_PREFIX } from '../../../semi-foundation/base/constants';const animationMs = 200;const sleep = (ms = animationMs) =>    new Promise((resolve, reject) =>        setTimeout(() => {            resolve(ms);        }, ms)    );const getPopupContainer = () => document.querySelector(`.${BASE_CLASS_PREFIX}-cascader`);const treeData = [    {        label: '亚洲',        value: 'Asia',        key: 'Asia',        children: [            {                label: '中国',                value: 'China',                key: 'China',                children: [                    {                        label: '北京',                        value: 'Beijing',                        key: 'beijing',                    },                    {                        label: '上海',                        value: 'Shanghai',                        key: 'shanghai',                    },                ],            },        ],    },    {        label: '北美洲',        value: 'North America',        key: 'North America',        children: [            {                label: '美国',                value: 'United States',                key: 'United States',            },            {                label: '加拿大',                value: 'Canada',                key: 'Canada',            },        ],    },];const treeDataWithDisabled = [    {        label: '亚洲',        value: 'Asia',        key: 'Asia',        children: [            {                label: '中国',                value: 'China',                key: 'China',                disabled: true,                children: [                    {                        label: '北京',                        value: 'Beijing',                        key: 'beijing',                    },                    {                        label: '上海',                        value: 'Shanghai',                        key: 'shanghai',                    },                ],            },            {                label: '韩国',                value: 'Hanguo',                key: 'hanguo',            }        ],    }];const treeDataWithReactNode = [    {        label: <strong>亚洲</strong>,        value: 'Asia',        key: 'Asia',        children: [            {                label: '中国',                value: 'China',                key: 'China',                children: [                    {                        label: '北京',                        value: 'Beijing',                        key: 'beijing',                    },                    {                        label: <div>上海</div>,                        value: 'Shanghai',                        key: 'shanghai',                    },                ],            }        ],    },    {        label: <p>北美洲</p>,        value: 'North America',        key: 'North America',    }];let commonProps = {    // Cascader use Popup Layer to show candidate option,    // but all Popup Layer which extends from Tooltip (eg Popover, Dropdown) have animation and delay.    // Turn off animation and delay during testing, to avoid wating (something like setTimeOut/balabala...) in the test code    motion: false,    mouseEnterDelay: 0,    mouseLeaveDelay: 0,};function render(props) {    props = { treeData: treeData, ...commonProps, ...props };    return mount(<Cascader {...props} />, {        attachTo: document.getElementById('container'),    });}describe('Cascader', () => {    beforeEach(() => {        // Avoid `attachTo: document.body` Warning        // clear();        const div = document.createElement('div');        div.setAttribute('id', 'container');        document.body.appendChild(div);    });    afterEach(() => {        const div = document.getElementById('container');        if (div) {            document.body.removeChild(div);        }        document.body.innerHTML = '';    });    it('className / style', () => {        let props = {            className: 'test',            style: { height: 420 },        };        let cascader = render(props);        expect(cascader.hasClass('test')).toEqual(true);        expect(cascader.find('div.test')).toHaveStyle('height', 420);    });    it('with placeholder', () => {        const props = { placeholder: 'semi' };        const cascader = render(props);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection-placeholder`).instance().textContent).toEqual(            'semi'        );    });    it('with validateStatus', () => {        const props = {};        const cascader = render(props);        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-error`)).toEqual(false);        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-warning`)).toEqual(false);        cascader.setProps({ validateStatus: `error` });        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-error`)).toEqual(true);        cascader.setProps({ validateStatus: `warning` });        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-warning`)).toEqual(true);    });    it('different size', () => {        const props = {};        const cascader = render(props);        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-large`)).toEqual(false);        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-small`)).toEqual(false);        cascader.setProps({ size: 'large' });        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-large`)).toEqual(true);        cascader.setProps({ size: 'small' });        expect(cascader.exists(`.${BASE_CLASS_PREFIX}-cascader-small`)).toEqual(true);    });    it('custom prefix / suffix / insetLabel', () => {        let prefix = <div className="prefix">prefix content</div>;        let suffix = <div className="suffix">suffix content</div>;        let insetLabel = 'semi';        const props = {            prefix: prefix,            suffix: suffix,        };        let cascader = render(props);        expect(cascader.contains(prefix)).toEqual(true);        expect(cascader.contains(suffix)).toEqual(true);        cascader.unmount();        let cascader2 = render({ insetLabel: insetLabel });        expect(cascader2.contains(insetLabel)).toEqual(true);        cascader2.unmount();    });    it('empty data / empty content', () => {        let cascader = render({            treeData: [],            defaultOpen: true,        });        // await sleep();        let opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`);        expect(opt.length).toEqual(1);        expect(opt[0].className.includes(`${BASE_CLASS_PREFIX}-cascader-option-empty`)).toEqual(true);        cascader.setProps({ emptyContent: 'test' });        cascader.update();        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0].textContent).toEqual('test');        // done();    });    it('dynamic treeData in multiple and uncontrolled mode', () => {        const cascader = render({            defaultValue: 'Asia',            multiple: true,        });        const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`);        expect(opt.length).toEqual(1);        cascader.setProps({ treeData: treeDataWithDisabled });        cascader.update();        expect(opt.length).toEqual(1);    });    it('dynamic treeData in multiple and controlled mode', () => {        const cascader = render({            value: 'Asia',            multiple: true,        });        const opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-selection-multiple .${BASE_CLASS_PREFIX}-tag`);        expect(opt.length).toEqual(1);        cascader.setProps({ treeData: treeDataWithDisabled });        cascader.update();        expect(opt.length).toEqual(1);    });    it('getPopupContainer', () => {        let cascader = render({            getPopupContainer: getPopupContainer,            defaultOpen: true,        });        // await sleep();        let dom = document.querySelector(`.${BASE_CLASS_PREFIX}-cascader`);        expect(dom.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(1);        // done();    });    it('defaultOpen', () => {        let cascader = render({            defaultOpen: true,        });        // await sleep();        expect(cascader.state().isOpen).toEqual(true);        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(1);        // done();    });    it('custom dropdownClassNam/dropdownStyle/zIndex', () => {        let props = {            dropdownClassName: 'test',            dropdownStyle: {                color: 'red',            },            defaultOpen: true,            zIndex: 2000,        };        let cascader = render(props);        // await sleep();        const dropdown = document.querySelector(`.${BASE_CLASS_PREFIX}-cascader-popover`);        expect(document.querySelector(`.${BASE_CLASS_PREFIX}-portal`).style.zIndex).toEqual('2000');        expect(dropdown.className.includes('test')).toEqual(true);        expect(dropdown.style.color).toEqual('red');        // done();    });    it('defaultValue', () => {        let cascader = render({            defaultValue: ['Asia', 'China', 'Beijing'],            defaultOpen: true,        });        // await sleep();        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );        let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        expect(lists.length).toEqual(3);        let activeItems = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-active`);        expect(activeItems.length).toEqual(2);        expect(activeItems[0].textContent).toEqual('亚洲');        expect(activeItems[1].textContent).toEqual('中国');        let selectItem = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-select`);        expect(selectItem.length).toEqual(1);        expect(selectItem[0].textContent).toEqual('北京');        expect(selectItem[0].querySelectorAll(`.${BASE_CLASS_PREFIX}-icon`).length).toEqual(1);        // done();    });    it('displayProp', () => {        let cascader = render({            defaultValue: ['Asia', 'China', 'Beijing'],            displayProp: 'value',        });        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            'Asia / China / Beijing'        );    });    it('displayRender', () => {        let spyOnRender = sinon.spy(() => {});        let cascader = render({            defaultValue: ['Asia', 'China', 'Beijing'],            displayRender: spyOnRender,        });        expect(spyOnRender.calledWithMatch(['亚洲', '中国', '北京'])).toEqual(true);        cascader.unmount();        let cusRender = render({            defaultValue: ['Asia', 'China', 'Beijing'],            displayRender: list => '已选择:' + list.join(' -> '),        });        expect(cusRender.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '已选择:亚洲 -> 中国 -> 北京'        );    });    it('label is ReactNode when unsearchable and single-selection mode', () => {        const cascader = render({            defaultValue: ['Asia', 'China', 'Shanghai'],            treeData: treeDataWithReactNode        });        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span strong`).getDOMNode().textContent).toEqual(            '亚洲'        );        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span div`).getDOMNode().textContent).toEqual(            '上海'        );        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 上海'        );        cascader.unmount();        const cascader2 = render({            defaultValue: ['North America'],            treeData: treeDataWithReactNode,        });        expect(cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection span p`).getDOMNode().textContent).toEqual(            '北美洲'        );        expect(cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(            '北美洲'        );        cascader2.unmount();        const cascader3 = render({            defaultValue: ['Asia', 'China', 'Shanghai'],            treeData: treeDataWithReactNode,            separator: ' - '        });        expect(cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection span strong`).getDOMNode().textContent).toEqual(            '亚洲'        );        expect(cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection span div`).getDOMNode().textContent).toEqual(            '上海'        );        expect(cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(            '亚洲 - 中国 - 上海'        );        cascader3.unmount();    });    it('disabled', () => {        let cascader = render({            disabled: true,        });        expect(            document                .querySelector(`.${BASE_CLASS_PREFIX}-cascader`)                .className.includes(`${BASE_CLASS_PREFIX}-cascader-disabled`)        ).toEqual(true);        // cannot select        let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBox.simulate('click');        // await sleep();        expect(cascader.state().isOpen).toEqual(false);        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-lists`).length).toEqual(0);        // done();    });    it('disabled + defaultValue', () => {        const cascaderWithSingle = render({            treeData: treeDataWithDisabled,            changeOnSelect: true,            defaultValue:['Asia', 'China']        });        expect(            cascaderWithSingle            .find(`.${BASE_CLASS_PREFIX}-cascader-selection span`)            .at(0)            .getDOMNode()            .textContent        ).toEqual('亚洲 / 中国');        cascaderWithSingle.unmount();        const cascaderWithSingleFilter = render({            treeData: treeDataWithDisabled,            changeOnSelect: true,            filterTreeNode: true,            defaultValue:['Asia', 'China']        });        expect(            cascaderWithSingleFilter            .find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper span`)            .getDOMNode()            .textContent            ).toEqual('亚洲 / 中国');        cascaderWithSingleFilter.unmount();        const cascaderWithSingleControlled = render({            treeData: treeDataWithDisabled,            changeOnSelect: true,            value: ['Asia', 'China'],        });        expect(cascaderWithSingleControlled.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`).getDOMNode().textContent).toEqual(            '亚洲 / 中国'        );        cascaderWithSingleControlled.unmount();        const cascaderWithMultiple = render({            treeData: treeDataWithDisabled,            multiple: true,            defaultValue:['Asia', 'China']        });        expect(            cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`)            .at(0)            .getDOMNode()            .textContent        ).toEqual('中国');        cascaderWithMultiple.unmount();        const cascaderWithMultipleFilter = render({            treeData: treeDataWithDisabled,            multiple: true,            filterTreeNode: true,            defaultValue:['Asia', 'China']        });        expect(            cascaderWithMultipleFilter            .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`)            .at(0)            .getDOMNode()            .textContent        ).toEqual('中国');        cascaderWithMultipleFilter.unmount();        const cascaderWithMultipleControlled = render({            treeData: treeDataWithDisabled,            multiple: true,            value:['Asia', 'China']        });        expect(            cascaderWithMultipleControlled            .find(`.${BASE_CLASS_PREFIX}-tag .${BASE_CLASS_PREFIX}-tag-content`)            .at(0)            .getDOMNode()            .textContent        ).toEqual('中国');        cascaderWithMultipleControlled.unmount();    });    it('select item / onSelect / onChange', () => {        let spyOnSelect = sinon.spy(() => {});        let spyOnChange = sinon.spy(() => {});        let cascader = render({            defaultOpen: true,            onSelect: spyOnSelect,            onChange: spyOnChange,        });        // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        // selectBox.simulate('click');        // await sleep();        let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        expect(lists.length).toEqual(1);        lists[0].querySelectorAll('li')[0].click();        lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        expect(lists.length).toEqual(2);        expect(spyOnSelect.notCalled).toBe(true);        expect(spyOnChange.notCalled).toBe(true);        expect(            lists[0]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`)        ).toEqual(true);        lists[1].querySelectorAll('li')[0].click();        lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        expect(lists.length).toEqual(3);        expect(spyOnSelect.notCalled).toBe(true);        expect(spyOnChange.notCalled).toBe(true);        expect(            lists[1]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`)        ).toEqual(true);        lists[2].querySelectorAll('li')[0].click();        expect(spyOnSelect.calledOnce).toBe(true);        expect(spyOnChange.calledOnce).toBe(true);        expect(spyOnSelect.calledWithMatch('Beijing')).toEqual(true);        expect(spyOnChange.calledWithMatch(['Asia', 'China', 'Beijing'])).toEqual(true);        expect(            lists[2]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-icon-tick`).length        ).toEqual(1);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );        // done();    });    it('filterTreeNode = true shows input box', () => {        let cascader = render({            filterTreeNode: true,            searchPlaceholder: 'placeholder',        });        let searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);        expect(searchWrapper.exists()).toEqual(true);        expect(            searchWrapper                .find('span')                .getDOMNode()                .textContent            ).toEqual('placeholder');    });    it('onSearch', () => {        let onSearch = value => {};        let spyOnSearch = sinon.spy(onSearch);        let cascader = render({            filterTreeNode: true,            onSearch: spyOnSearch,        });        let searchValue = '${BASE_CLASS_PREFIX}';        let event = { target: { value: searchValue } };        cascader.simulate('click');        const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);        input.simulate('change', event);        expect(spyOnSearch.calledOnce).toBe(true);        expect(spyOnSearch.calledWithMatch(searchValue)).toBe(true);    });    it('onSelect + changeOnSelect', async () => {        let spyOnSelect = sinon.spy(() => {});        let spyOnChange = sinon.spy(() => {});        let cascader = render({            defaultOpen: true,            onSelect: spyOnSelect,            onChange: spyOnChange,            changeOnSelect: true,        });        // await sleep();        let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[0].querySelectorAll('li')[0].click();        expect(spyOnSelect.calledOnce).toBe(true);        expect(spyOnChange.calledOnce).toBe(true);        expect(spyOnSelect.calledWithMatch('Asia')).toEqual(true);        expect(spyOnChange.calledWithMatch(['Asia'])).toEqual(true);        expect(            lists[0]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`)        ).toEqual(true);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual('亚洲');        lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[1].querySelectorAll('li')[0].click();        expect(spyOnSelect.calledWithMatch('China')).toEqual(true);        expect(spyOnChange.calledWithMatch(['Asia', 'China'])).toEqual(true);        expect(            lists[0]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-active`)        ).toEqual(true);        expect(            lists[1]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`)        ).toEqual(true);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国'        );    });    // display none not working properly    it('filterTreeNode shows correct result', () => {        let cascader = render({            filterTreeNode: true,            defaultOpen: true,        });        // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        // selectBox.simulate('click');        // await sleep();        const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);        let searchValue = '北';        let event = { target: { value: searchValue } };        searchWrapper.find('input').simulate('change', event);        // await sleep();        let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`);        expect(resList.length).toEqual(3);        // debugger        // expect(resList[0].textContent).toEqual('亚洲/中国/北京');        // done();    });    // display none not working properly    it('filterTreeNode + treeNodeFilterProp', () => {        let cascader = render({            filterTreeNode: true,            treeNodeFilterProp: 'value',            defaultOpen: true,        });        // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        // selectBox.simulate('click');        // await sleep();        const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);        let searchValue = 'Bei';        let event = { target: { value: searchValue } };        searchWrapper.find('input').simulate('change', event);        // await sleep();        let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`);        expect(resList.length).toEqual(1);        // debugger        // expect(resList[0].textContent).toEqual('亚洲/中国/北京');        // done();    });    it('filterTreeNode + no result', () => {        let cascader = render({            filterTreeNode: true,            defaultOpen: true,            emptyContent: 'test',        });        // await sleep();        const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);        let searchValue = 'Bei';        let event = { target: { value: searchValue } };        searchWrapper.find('input').simulate('change', event);        // await sleep();        let opt = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`);        expect(opt.length).toEqual(1);        expect(opt[0].className.includes(`${BASE_CLASS_PREFIX}-cascader-option-empty`)).toEqual(true);        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0].textContent).toEqual('test');        // done();    });    it('filterTreeNode as a func', () => {        let cascader = render({            filterTreeNode: (inputValue, cascaderNode) => cascaderNode === inputValue,            defaultOpen: true,        });        const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);        searchWrapper.find('input').simulate('change', { target: { value: '北' } });        // await sleep();        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`).length).toEqual(0);        // done();    });    it('controlled: value shows correct', () => {        let cascader = render({            value: ['Asia', 'China', 'Beijing'],        });        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );    });    it('controlled: fire onChange and ui not update', () => {        let spyOnChange = sinon.spy(() => {});        let cascader = render({            value: ['Asia', 'China', 'Beijing'],            defaultOpen: true,            onChange: spyOnChange,            changeOnSelect: true,        });        // await sleep();        let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[0].querySelectorAll('li')[0].click();        expect(spyOnChange.calledOnce).toBe(true);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );        // done();    });    it('async load data', () => {        const nativeEvent = { nativeEvent: { stopImmediatePropagation: () => {} } };        const then = jest.fn(() => Promise.resolve());        const loadData = jest.fn(() => ({ then }));        const data = {            label: '亚洲',            value: 'Asia',        };        let cascader = render({            loadData,            defaultOpen: true,            treeData: [data],        });        let topNodeAsia = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-option`).at(0);        topNodeAsia.simulate('click', nativeEvent);        expect(loadData).toHaveBeenCalledWith([data]);        expect(then).toHaveBeenCalled();    });    it('select item + onChange + onChangeWithObject', () => {        let spyOnChange = sinon.spy(() => {});        let cascader = render({            defaultOpen: true,            onChange: spyOnChange,            onChangeWithObject: true,        });        // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        // selectBox.simulate('click');        // await sleep();        let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[0].querySelectorAll('li')[0].click();        lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[1].querySelectorAll('li')[0].click();        lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[2].querySelectorAll('li')[0].click();        expect(spyOnChange.calledOnce).toBe(true);        expect(            spyOnChange.calledWithMatch([                {                    label: '亚洲',                    value: 'Asia',                    key: 'Asia',                    children: [                        {                            label: '中国',                            value: 'China',                            key: 'China',                            children: [                                {                                    label: '北京',                                    value: 'Beijing',                                    key: 'beijing',                                },                                {                                    label: '上海',                                    value: 'Shanghai',                                    key: 'shanghai',                                },                            ],                        },                    ],                },                {                    label: '中国',                    value: 'China',                    key: 'China',                    children: [                        {                            label: '北京',                            value: 'Beijing',                            key: 'beijing',                        },                        {                            label: '上海',                            value: 'Shanghai',                            key: 'shanghai',                        },                    ],                },                {                    label: '北京',                    value: 'Beijing',                    key: 'beijing',                },            ])        ).toEqual(true);        expect(            lists[2]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-icon-tick`).length        ).toEqual(1);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );        // done();    });    it('select item + onChange + onChangeWithObject + changeOnSelect', () => {        let spyOnChange = sinon.spy(() => {});        let cascader = render({            defaultOpen: true,            onChange: spyOnChange,            onChangeWithObject: true,            changeOnSelect: true,        });        let lists = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`);        lists[0].querySelectorAll('li')[0].click();        expect(spyOnChange.calledOnce).toBe(true);        expect(            spyOnChange.calledWithMatch([                {                    label: '亚洲',                    value: 'Asia',                    key: 'Asia',                    children: [                        {                            label: '中国',                            value: 'China',                            key: 'China',                            children: [                                {                                    label: '北京',                                    value: 'Beijing',                                    key: 'beijing',                                },                                {                                    label: '上海',                                    value: 'Shanghai',                                    key: 'shanghai',                                },                            ],                        },                    ],                },            ])        ).toEqual(true);        expect(            lists[0]                .querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option`)[0]                .className.includes(`${BASE_CLASS_PREFIX}-cascader-option-select`)        ).toEqual(true);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual('亚洲');    });    it('controlled: value shows correct', () => {        let cascader = render({            value: [                {                    label: '亚洲',                    value: 'Asia',                    key: 'Asia',                    children: [                        {                            label: '中国',                            value: 'China',                            key: 'China',                            children: [                                {                                    label: '北京',                                    value: 'Beijing',                                    key: 'beijing',                                },                                {                                    label: '上海',                                    value: 'Shanghai',                                    key: 'shanghai',                                },                            ],                        },                    ],                },                {                    label: '中国',                    value: 'China',                    key: 'China',                    children: [                        {                            label: '北京',                            value: 'Beijing',                            key: 'beijing',                        },                        {                            label: '上海',                            value: 'Shanghai',                            key: 'shanghai',                        },                    ],                },                {                    label: '北京',                    value: 'Beijing',                    key: 'beijing',                },            ],            onChangeWithObject: true,        });        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );    });    it('onClear and showClear', () => {        const spyOnClear = sinon.spy(() => { });        const cascader = render({            defaultValue: ['Asia', 'China', 'Beijing'],            showClear: true,            onClear: spyOnClear,            placeholder: "请选择所在地区"        });        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '亚洲 / 中国 / 北京'        );        cascader.simulate('mouseEnter', {}).find(`.${BASE_CLASS_PREFIX}-cascader-clearbtn`).simulate('click');        expect(spyOnClear.calledOnce).toBe(true);        expect(cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).getDOMNode().textContent).toEqual(            '请选择所在地区'        );        cascader.unmount();    });    it('filterLeafOnly = false', () => {        let cascader = render({            filterTreeNode: true,            defaultOpen: true,            filterLeafOnly: false        });        // let selectBox = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        // selectBox.simulate('click');        // await sleep();        const searchWrapper = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-search-wrapper`);        let searchValue = '亚';        let event = { target: { value: searchValue } };        searchWrapper.find('input').simulate('change', event);        // await sleep();        let resList = document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-label-highlight`);        expect(resList.length).toEqual(4);        // debugger        // expect(resList[0].textContent).toEqual('亚洲/中国/北京');        // done();    });    it('showNext',()=>{        // expand next menu by hover        // 通过 hover 展开 Dropdown 的子菜单        const cascaderWithHover = render({            showNext: 'hover',        });        const selectBox = cascaderWithHover.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBox.simulate('click');        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1);        cascaderWithHover            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .simulate('mouseEnter');        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(2);        cascaderWithHover.unmount();        // expand next menu by click        // 通过 click 展开 Dropdown 的子菜单        const cascaderWithClick = render({            showNext: 'click',        });        const selectBox2 = cascaderWithClick.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBox2.simulate('click');        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1);        cascaderWithClick            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .simulate('mouseEnter');        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(1);        cascaderWithClick            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .simulate('click');        expect(document.querySelectorAll(`.${BASE_CLASS_PREFIX}-cascader-option-list`).length).toEqual(2);        cascaderWithClick.unmount();            })    it('disableStrictly', ()=>{        // disable strictly        const cascaderWithDisableStrictly = render({            showNext: 'hover',            treeData:treeDataWithDisabled,            disableStrictly: true,            multiple: true,        });        expect(cascaderWithDisableStrictly.state().checkedKeys.size).toEqual(0);         expect(cascaderWithDisableStrictly.state().disabledKeys.size).toEqual(3);         // open dropdown        const selectBoxWithDisableStrictly = cascaderWithDisableStrictly.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBoxWithDisableStrictly.simulate('click');        // click checkbox        cascaderWithDisableStrictly            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-checkbox`)            .at(0)            .simulate('click');        // check checkedKeys        expect(cascaderWithDisableStrictly.state().checkedKeys.size).toEqual(1);         cascaderWithDisableStrictly.unmount();        // default disable        const cascaderWithDisable = render({            showNext: 'hover',            treeData:treeDataWithDisabled,            multiple: true,        });        expect(cascaderWithDisable.state().checkedKeys.size).toEqual(0);         expect(cascaderWithDisable.state().disabledKeys.size).toEqual(0);         // open dropdown        const selectBoxWithDisable = cascaderWithDisable.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBoxWithDisable.simulate('click');        // click checkbox        cascaderWithDisable            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-checkbox`)            .at(0)            .simulate('click');        // check checkedKeys        expect(cascaderWithDisable.state().checkedKeys.size).toEqual(5);         cascaderWithDisable.unmount();    });    it('multiple + onChangeWithObject', () => {        const cascader = render({            multiple: true,            onChangeWithObject: true,            defaultValue: [                {                    label: '北美洲',                    value: 'North America',                    key: 'North America',                    children: [                        {                            label: '美国',                            value: 'United States',                            key: 'United States',                        },                        {                            label: '加拿大',                            value: 'Canada',                            key: 'Canada',                        },                    ],                },                {                    label: '美国',                    value: 'United States',                    key: 'United States',                }            ]        });        const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags.length).toEqual(1);        expect(            tags            .find(`.${BASE_CLASS_PREFIX}-tag-content`)            .getDOMNode()            .textContent        ).toEqual('美国');    });    it('multiple select enableLeafClick', () => {        const cascaderWithMultiple = render({            multiple: true,            enableLeafClick: true,            treeData: [                {                    label: '北美洲',                    value: 'North America',                    key: 'North America',                    children: [                        {                            label: '美国',                            value: 'United States',                            key: 'United States',                        },                        {                            label: '加拿大',                            value: 'Canada',                            key: 'Canada',                        },                    ],                },                {                    label: '南美洲',                    value: 'Nanmeiguo',                    key: 'Nanmeiguo',                }            ]        })        const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBox.simulate('click');        // click checkbox        cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(1)            .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-checkbox`)            .at(0)            .simulate('click');        expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);        // click option cancel checked        cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(1)            .simulate('click')        expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(0);        // click option select        cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .simulate('click')        cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(1)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(0)            .simulate('click')        expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);        const states = cascaderWithMultiple.state()        cascaderWithMultiple.unmount();    })    it('multiple select disable enableLeafClick', () => {        const cascaderWithMultiple = render({            multiple: true,            treeData: [                {                    label: '北美洲',                    value: 'North America',                    key: 'North America',                    children: [                        {                            label: '美国',                            value: 'United States',                            key: 'United States',                        },                        {                            label: '加拿大',                            value: 'Canada',                            key: 'Canada',                        },                    ],                },                {                    label: '南美洲',                    value: 'Nanmeiguo',                    key: 'Nanmeiguo',                }            ]        })        const selectBox = cascaderWithMultiple.find(`.${BASE_CLASS_PREFIX}-cascader-selection`).at(0);        selectBox.simulate('click');        // click checkbox        cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(1)            .find(`.${BASE_CLASS_PREFIX}-cascader-option-label`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-checkbox`)            .at(0)            .simulate('click');        expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);        // click option can't cancel checked        cascaderWithMultiple            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list`)            .at(0)            .find(`.${BASE_CLASS_PREFIX}-cascader-option`)            .at(1)            .simulate('click')        expect(cascaderWithMultiple.state().checkedKeys.size).toEqual(1);        cascaderWithMultiple.unmount();    })    it('separator', () => {        const cascader = render({            filterTreeNode: true,            defaultValue: ['Asia', 'China', 'Beijing'],            separator: ' > ',            defaultOpen: true,        });        const span = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection span`);        expect(span.getDOMNode().textContent).toEqual('亚洲 > 中国 > 北京');         cascader.simulate('click');        const input = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection input`);        const event = { target: { value: '中国' } };        input.simulate('change', event);        expect(            cascader            .find(`.${BASE_CLASS_PREFIX}-cascader-option-list li`)            .at(0)            .getDOMNode()            .textContent        ).toEqual('亚洲 > 中国 > 北京');        cascader.unmount();    });    it('triggerRender', () => {        const spyTriggerRender = sinon.spy(() => <span>123</span>);        const cascaderAutoMerge = render({            multiple: true,            triggerRender: spyTriggerRender,            defaultValue: 'Asia'        });        cascaderAutoMerge.simulate('click');        const firstCall = spyTriggerRender.getCall(0);        const args = firstCall.args[0];         /* check arguments of triggerRender */        expect(args.value.size).toEqual(1);        expect(args.value).toEqual(new Set('0'));        cascaderAutoMerge.unmount();        const spyTriggerRender2 = sinon.spy(() => <span>123</span>);        const cascaderNoAutoMerge = render({            multiple: true,            triggerRender: spyTriggerRender2,            defaultValue: 'Asia',            autoMergeValue: false,        });        cascaderNoAutoMerge.simulate('click');        const firstCall2 = spyTriggerRender2.getCall(0);        const args2 = firstCall2.args[0];         /* check arguments of triggerRender */        expect(args2.value.size).toEqual(4);        expect(args2.value).toEqual(new Set(['0','0-0','0-0-1','0-0-0']));        cascaderNoAutoMerge.unmount();    });    it('autoMergeValue', () => {        const cascader = render({            multiple: true,            autoMergeValue: false,            defaultValue: 'Asia',        });        const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags.length).toEqual(4);        cascader.unmount();        const cascaderAutoMerge = render({            multiple: true,            autoMergeValue: true,            defaultValue: 'Asia',        });        const tags2 = cascaderAutoMerge.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags2.length).toEqual(1);        expect(            tags2                .find(`.${BASE_CLASS_PREFIX}-tag-content`)                .getDOMNode()                .textContent        ).toEqual('亚洲');        cascaderAutoMerge.unmount();    });    it('leafOnly', () => {        /* autoMergeValue and leafOnly are both false */        const cascader = render({            multiple: true,            autoMergeValue: false,            leafOnly: false,            defaultValue: 'Asia',        });        const tags = cascader.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags.length).toEqual(4);        cascader.unmount();        /* autoMergeValue and leafOnly are both true */        const cascader2 = render({            multiple: true,            autoMergeValue: true,            leafOnly: true,            defaultValue: 'Asia',        });        const tags2 = cascader2.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags2.length).toEqual(2);        cascader2.unmount();        /* autoMergeValue is false, leafOnly is true */        const cascader3 = render({            multiple: true,            autoMergeValue: false,            leafOnly: true,            defaultValue: 'Asia',        });        const tags3 = cascader3.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags3.length).toEqual(2);        cascader3.unmount();        /* autoMergeValue is true, leafOnly is false */        const cascader4 = render({            multiple: true,            autoMergeValue: true,            leafOnly: false,            defaultValue: 'Asia',        });        const tags4 = cascader4.find(`.${BASE_CLASS_PREFIX}-cascader-selection .${BASE_CLASS_PREFIX}-tag`)        expect(tags4.length).toEqual(1);        expect(            tags4                .find(`.${BASE_CLASS_PREFIX}-tag-content`)                .getDOMNode()                .textContent        ).toEqual('亚洲');        cascader4.unmount();    });    it('ref method', () => {        let r;        let props = {            ref: (ref) => { r = ref },            filter: true,            multiple: true,        };        let select = render(props);        r.open();        expect(select.state().isOpen).toEqual(true);        r.close();        expect(select.state().isOpen).toEqual(false);    });});
 |