/*
 * Copyright 2015-present Open Networking Laboratory
 *
 * Licensed 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.
 */

/*
 ONOS GUI -- SVG -- Glyph Service - Unit Tests
 */

//FIXME Size are changed

describe('factory: fw/svg/glyph.js', function() {
    var $log, fs, gs, d3Elem, svg;

    var numBaseGlyphs = 50,
        vbBird = '352 224 113 112',
        vbGlyph = '0 0 110 110',
        vbBadge = '0 0 10 10',
        longPrefix = 'M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v81.5c0,2.8,2.2,5,5,' +
            '5h81.5c2.8,0,5-2.2,5-5V14.2C100.8,11.5,98.5,9.2,95.8,9.2z ',
        tablePrefix = 'M15.9,19.1h-8v-13h8V19.1z M90.5,6.1H75.6v13h14.9V6.1' +
            'z M71.9,6.1H56.9v13h14.9V6.1z M53.2,6.1H38.3v13h14.9V6.1z M34.5,' +
            '6.1H19.6v13h14.9V6.1z M102.2,6.1h-8v13h8V6.1z ',
        prefixLookup = {
            bird: 'M427.7,300.4',
            unknown: 'M35,40a5',
            node: 'M15,100a5',
            switch: 'M10,20a10',
            roadm: 'M10,35l25-',
            endstation: 'M10,15a5,5',
            router: 'M10,55A45,45',
            bgpSpeaker: 'M10,40a45,35',
            chain: 'M60.4,77.6c-',
            crown: 'M99.5,21.6c0,',
            lock: 'M79.4,48.6h',
            topo: 'M97.2,76.3H86.6',
            refresh: 'M102.6,40.8L88.4',
            garbage: 'M94.6,20.2c',

            // navigation specific glyphs
            flowTable: tablePrefix + 'M102.2,23.6H7.9v',
            portTable: tablePrefix + 'M102.6,23.6v78.5H',
            groupTable: 'M16,19.1H8v-13h',

            // toolbar specific glyphs
            summary: longPrefix + 'M16.7',
            details: longPrefix + 'M16.9',
            ports: 'M98,9.2H79.6c',
            map: 'M95.8,9.2H14.2c-2.8,0-5,2.2-5,5v66',
            cycleLabels: 'M72.5,33.9c',
            oblique: 'M80.9,30.2h',
            filters: 'M24.8,13.3L',
            resetZoom: 'M86,79.8L',
            relatedIntents: 'M99.9,43.7',
            nextIntent: 'M88.1,55.7',
            prevIntent: 'M22.5,55.6',
            intentTraffic: 'M14.7,71.5h',
            allTraffic: 'M15.7,64.5h-7v',
            flows: 'M93.8,46.1c',
            eqMaster: 'M100.1,46.9l',

            // badges
            uiAttached: 'M2,2.5a.5,.5',
            checkMark: 'M2.6,4.5c0',
            xMark: 'M9.0,7.2C8.2',
            triangleUp: 'M0.5,6.2c0',
            triangleDown: 'M9.5,4.2c0',
            plus: 'M4,2h2v2h2v2',
            minus: 'M2,4h6v2',
            play: 'M2.5,2l5.5,3',
            stop: 'M2.5,2.5h5',

            cloud: 'M37.6,79.5c-6.9,8.7-20.4,8.6',

            // our test ones..
            triangle: 'M.5,.2',
            diamond: 'M.2,.5'
        },
        glyphIds = [
            'unknown', 'node', 'switch', 'roadm', 'endstation', 'router',
            'bgpSpeaker', 'chain', 'crown', 'lock', 'topo', 'refresh',
            'garbage',
            'flowTable', 'portTable', 'groupTable',
            'summary', 'details', 'ports', 'map', 'cycleLabels',
            'oblique', 'filters', 'resetZoom', 'relatedIntents', 'nextIntent',
            'prevIntent', 'intentTraffic', 'allTraffic', 'flows', 'eqMaster'
        ],
        badgeIds = [
            'uiAttached', 'checkMark', 'xMark', 'triangleUp', 'triangleDown',
            'plus', 'minus', 'play', 'stop'
        ],
        spriteIds = [
            'cloud'
        ];

    beforeEach(module('onosUtil', 'onosSvg'));

    beforeEach(inject(function (_$log_, FnService, GlyphService) {
        var body = d3.select('body');
        $log = _$log_;
        fs = FnService;
        gs = GlyphService;
        d3Elem = body.append('defs').attr('id', 'myDefs');
        svg = body.append('svg').attr('id', 'mySvg');
    }));

    afterEach(function () {
        d3.select('#mySvg').remove();
        d3.select('#myDefs').remove();
        gs.clear();
    });

    it('should define GlyphService', function () {
        expect(gs).toBeDefined();
    });

    it('should define api functions', function () {
        expect(fs.areFunctions(gs, [
            'clear', 'init', 'registerGlyphs', 'registerGlyphSet',
            'ids', 'glyph', 'glyphDefined', 'loadDefs', 'addGlyph'
        ])).toBe(true);
    });

    it('should start with no glyphs loaded', function () {
        expect(gs.ids()).toEqual([]);
    });

    it('should load the base set of glyphs into the cache', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
    });

    it('should remove glyphs from the cache on clear', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        gs.clear();
        expect(gs.ids().length).toEqual(0);
    });

    function verifyGlyphLoadedInCache(id, vbox, expPfxId) {
        var pfxId = expPfxId || id,
            glyph = gs.glyph(id),
            prefix = prefixLookup[pfxId],
            plen = prefix.length;
        expect(fs.contains(gs.ids(), id)).toBe(true);
        expect(glyph).toBeDefined();
        expect(glyph.id).toEqual(id);
        expect(glyph.vb).toEqual(vbox);
        expect(glyph.d.slice(0, plen)).toEqual(prefix);
    }

    xit('should be configured with the correct number of glyphs', function () {
        var nGlyphs = 1 + glyphIds.length + badgeIds.length + spriteIds.length;
        expect(nGlyphs).toEqual(numBaseGlyphs);
    });

    it('should load the bird glyph', function() {
        gs.init();
        verifyGlyphLoadedInCache('bird', vbBird);
    });

    xit('should load the regular glyphs', function () {
        gs.init();
        glyphIds.forEach(function (id) {
            verifyGlyphLoadedInCache(id, vbGlyph);
        });
    });

    it('should load the badge glyphs', function () {
        gs.init();
        badgeIds.forEach(function (id) {
            verifyGlyphLoadedInCache(id, vbBadge);
        });
    });

    it('should load the sprites', function () {
        gs.init();
        spriteIds.forEach(function (id) {
            verifyGlyphLoadedInCache(id, vbGlyph);
        });
    });


    // define some glyphs that we want to install

    var testVbox = '0 0 1 1',
        triVbox = '0 0 12 12',
        diaVbox = '0 0 15 15',
        dTriangle = 'M.5,.2l.3,.6,h-.6z',
        dDiamond = 'M.2,.5l.3,-.3l.3,.3l-.3,.3z',
        newGlyphs = {
            _viewbox: testVbox,
            triangle: dTriangle,
            diamond: dDiamond
        },
        dupGlyphs = {
            _viewbox: testVbox,
            router: dTriangle,
            switch: dDiamond
        },
        altNewGlyphs = {
            _triangle: triVbox,
            triangle: dTriangle,
            _diamond: diaVbox,
            diamond: dDiamond
        },
        altDupGlyphs = {
            _router: triVbox,
            router: dTriangle,
            _switch: diaVbox,
            switch: dDiamond
        },
        badGlyphSet = {
            triangle: dTriangle,
            diamond: dDiamond
        },
        warnMsg = 'GlyphService.registerGlyphs(): ',
        warnMsgSet = 'GlyphService.registerGlyphSet(): ',
        idCollision = warnMsg + 'ID collision: ',
        idCollisionSet = warnMsgSet + 'ID collision: ',
        missVbSet = warnMsgSet + 'no "_viewbox" property found',
        missVbCustom = warnMsg + 'Missing viewbox property: ',
        missVbTri = missVbCustom + '"_triangle"',
        missVbDia = missVbCustom + '"_diamond"';


    it('should install new glyphs as a glyph-set', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphSet(newGlyphs);
        expect(ok).toBe(true);
        expect($log.warn).not.toHaveBeenCalled();

        expect(gs.ids().length).toEqual(numBaseGlyphs + 2);
        verifyGlyphLoadedInCache('triangle', testVbox);
        verifyGlyphLoadedInCache('diamond', testVbox);
    });

    it('should not overwrite glyphs (via glyph-set) with dup IDs', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphSet(dupGlyphs);
        expect(ok).toBe(false);
        expect($log.warn).toHaveBeenCalledWith(idCollisionSet + '"switch"');
        expect($log.warn).toHaveBeenCalledWith(idCollisionSet + '"router"');

        expect(gs.ids().length).toEqual(numBaseGlyphs);
        // verify original glyphs still exist...
        verifyGlyphLoadedInCache('router', vbGlyph);
        verifyGlyphLoadedInCache('switch', vbGlyph);
    });

    it('should replace glyphs (via glyph-set) if asked nicely', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphSet(dupGlyphs, true);
        expect(ok).toBe(true);
        expect($log.warn).not.toHaveBeenCalled();

        expect(gs.ids().length).toEqual(numBaseGlyphs);
        // verify glyphs have been overwritten...
        verifyGlyphLoadedInCache('router', testVbox, 'triangle');
        verifyGlyphLoadedInCache('switch', testVbox, 'diamond');
    });

    it ('should complain if missing _viewbox in a glyph-set', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphSet(badGlyphSet);
        expect(ok).toBe(false);
        expect($log.warn).toHaveBeenCalledWith(missVbSet);
        expect(gs.ids().length).toEqual(numBaseGlyphs);
    });

    it('should install new glyphs', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphs(altNewGlyphs);
        expect(ok).toBe(true);
        expect($log.warn).not.toHaveBeenCalled();

        expect(gs.ids().length).toEqual(numBaseGlyphs + 2);
        verifyGlyphLoadedInCache('triangle', triVbox);
        verifyGlyphLoadedInCache('diamond', diaVbox);
    });

    it('should not overwrite glyphs with dup IDs', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphs(altDupGlyphs);
        expect(ok).toBe(false);
        expect($log.warn).toHaveBeenCalledWith(idCollision + '"switch"');
        expect($log.warn).toHaveBeenCalledWith(idCollision + '"router"');

        expect(gs.ids().length).toEqual(numBaseGlyphs);
        // verify original glyphs still exist...
        verifyGlyphLoadedInCache('router', vbGlyph);
        verifyGlyphLoadedInCache('switch', vbGlyph);
    });

    it('should replace glyphs if asked nicely', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphs(altDupGlyphs, true);
        expect(ok).toBe(true);
        expect($log.warn).not.toHaveBeenCalled();

        expect(gs.ids().length).toEqual(numBaseGlyphs);
        // verify glyphs have been overwritten...
        verifyGlyphLoadedInCache('router', triVbox, 'triangle');
        verifyGlyphLoadedInCache('switch', diaVbox, 'diamond');
    });

    it ('should complain if missing custom viewbox', function () {
        gs.init();
        expect(gs.ids().length).toEqual(numBaseGlyphs);
        spyOn($log, 'warn');

        var ok = gs.registerGlyphs(badGlyphSet);
        expect(ok).toBe(false);
        expect($log.warn).toHaveBeenCalledWith(missVbTri);
        expect($log.warn).toHaveBeenCalledWith(missVbDia);
        expect(gs.ids().length).toEqual(numBaseGlyphs);
    });

    function verifyPathPrefix(elem, prefix) {
        var plen = prefix.length,
            d = elem.select('path').attr('d');
        expect(d.slice(0, plen)).toEqual(prefix);
    }

    function verifyLoadedInDom(id, vb, expPfxId) {
        var pfxId = expPfxId || id,
            symbol = d3Elem.select('#' + id);
        expect(symbol.size()).toEqual(1);
        expect(symbol.attr('viewBox')).toEqual(vb);
        verifyPathPrefix(symbol, prefixLookup[pfxId]);
    }

    it('should load base glyphs into the DOM', function () {
        gs.init();
        gs.loadDefs(d3Elem);
        expect(d3Elem.selectAll('symbol').size()).toEqual(numBaseGlyphs);
        verifyLoadedInDom('bgpSpeaker', vbGlyph);
    });

    it('should load custom glyphs into the DOM', function () {
        gs.init();
        gs.registerGlyphSet(newGlyphs);
        gs.loadDefs(d3Elem);
        expect(d3Elem.selectAll('symbol').size()).toEqual(numBaseGlyphs + 2);
        verifyLoadedInDom('diamond', testVbox);
    });

    it('should load only specified glyphs into the DOM', function () {
        gs.init();
        gs.loadDefs(d3Elem, ['crown', 'chain', 'node']);
        expect(d3Elem.selectAll('symbol').size()).toEqual(3);
        verifyLoadedInDom('crown', vbGlyph);
        verifyLoadedInDom('chain', vbGlyph);
        verifyLoadedInDom('node', vbGlyph);
    });

    it('should add a glyph with default size', function () {
        gs.init();
        var retval = gs.addGlyph(svg, 'crown');
        var what = svg.selectAll('use');
        expect(what.size()).toEqual(1);
        expect(what.attr('width')).toEqual('40');
        expect(what.attr('height')).toEqual('40');
        expect(what.attr('xlink:href')).toEqual('#crown');
        expect(what.classed('glyph')).toBeTruthy();
        expect(what.classed('overlay')).toBeFalsy();

        // check a couple on retval, which should be the same thing..
        expect(retval.attr('xlink:href')).toEqual('#crown');
        expect(retval.classed('glyph')).toBeTruthy();
    });

    it('should add a glyph with given size', function () {
        gs.init();
        gs.addGlyph(svg, 'crown', 37);
        var what = svg.selectAll('use');
        expect(what.size()).toEqual(1);
        expect(what.attr('width')).toEqual('37');
        expect(what.attr('height')).toEqual('37');
        expect(what.attr('xlink:href')).toEqual('#crown');
        expect(what.classed('glyph')).toBeTruthy();
        expect(what.classed('overlay')).toBeFalsy();
    });

    it('should add a glyph marked as overlay', function () {
        gs.init();
        gs.addGlyph(svg, 'crown', 20, true);
        var what = svg.selectAll('use');
        expect(what.size()).toEqual(1);
        expect(what.attr('width')).toEqual('20');
        expect(what.attr('height')).toEqual('20');
        expect(what.attr('xlink:href')).toEqual('#crown');
        expect(what.classed('glyph')).toBeTruthy();
        expect(what.classed('overlay')).toBeTruthy();
    });
});
