/*
 * Copyright 2015 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 -- Widget -- Toolbar Service - Unit Tests
 */
describe('factory: fw/widget/toolbar.js', function () {
    var $log, fs, tbs, ps,
        d3Elem;

    beforeEach(module('onosWidget', 'onosUtil', 'onosLayer'));

    beforeEach(inject(function (_$log_, FnService,
                                ToolbarService, PanelService) {
        $log = _$log_;
        fs = FnService;
        tbs = ToolbarService;
        ps = PanelService;
    }));

    beforeEach(function () {
        d3Elem = d3.select('body').append('div').attr('id', 'floatpanels');
        tbs.init();
        ps.init();
    });

    afterEach(function () {
        d3.select('#floatpanels').remove();
        tbs.init();
        ps.init();
    });

    it('should define ToolbarService', function () {
        expect(tbs).toBeDefined();
    });

    it('should define api functions', function () {
        expect(fs.areFunctions(tbs, [
            'init', 'makeButton', 'makeToggle', 'makeRadio', 'separator',
            'createToolbar'
        ])).toBeTruthy();
    });

    function toolbarSelection() {
        return d3Elem.selectAll('.toolbar');
    }

    it('should have no toolbars to start', function () {
        expect(toolbarSelection().size()).toBe(0);
    });

    it('should log a warning if no ID is given', function () {
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar();
        expect(tbar).toBeNull();
        expect($log.warn).toHaveBeenCalledWith('createToolbar: no ID given');
        expect(toolbarSelection().size()).toBe(0);
    });

    it('should log a warning if no tools are given', function () {
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar(true);
        expect(tbar).toBeNull();
        expect($log.warn).toHaveBeenCalledWith('createToolbar: no tools given');
        expect(toolbarSelection().size()).toBe(0);
    });

    it('should log a warning if tools are not an array', function () {
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar(true, {});
        expect(tbar).toBeNull();
        expect($log.warn).toHaveBeenCalledWith('createToolbar: no tools given');
        expect(toolbarSelection().size()).toBe(0);
    });

    it('should log a warning if tools array is empty', function () {
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar(true, []);
        expect(tbar).toBeNull();
        expect($log.warn).toHaveBeenCalledWith('createToolbar: no tools given');
        expect(toolbarSelection().size()).toBe(0);
    });

    it("should verify makeButton's returned object", function () {
        var button = tbs.makeButton('foo', 'glyph-bar', function () {});

        expect(button.t).toBe('btn');
        expect(button.id).toBe('foo');
        expect(button.gid).toBe('glyph-bar');
        expect(fs.isF(button.cb)).toBeTruthy();
    });

    it("should verify makeToggle's returned object", function () {
        var toggle = tbs.makeToggle('foo', 'glyph-bar', function () {});

        expect(toggle.t).toBe('tog');
        expect(toggle.id).toBe('foo');
        expect(toggle.gid).toBe('glyph-bar');
        expect(fs.isF(toggle.cb)).toBeTruthy();
    });

    it("should verify makeRadio's returned object", function () {
        var rFoo0 = tbs.makeRadio('foo', 'glyph-foo0', function () {});
        var rFoo1 = tbs.makeRadio('foo', 'glyph-foo1', function () {});
        var rFoo2 = tbs.makeRadio('foo', 'glyph-foo2', function () {});
        var rBar0 = tbs.makeRadio('bar', 'glyph-bar0', function () {});
        var rBar1 = tbs.makeRadio('bar', 'glyph-bar1', function () {});
        var rFoo3 = tbs.makeRadio('foo', 'glyph-foo3', function () {});

        expect(rFoo0.t).toBe('rad');
        expect(rFoo0.id).toBe('foo-0');
        expect(rFoo0.rid).toBe('0');
        expect(rFoo0.gid).toBe('glyph-foo0');
        expect(fs.isF(rFoo0.cb)).toBeTruthy();

        expect(rFoo1.t).toBe('rad');
        expect(rFoo1.id).toBe('foo-1');
        expect(rFoo1.rid).toBe('1');
        expect(rFoo1.gid).toBe('glyph-foo1');
        expect(fs.isF(rFoo1.cb)).toBeTruthy();

        expect(rFoo2.t).toBe('rad');
        expect(rFoo2.id).toBe('foo-2');
        expect(rFoo2.rid).toBe('2');
        expect(rFoo2.gid).toBe('glyph-foo2');
        expect(fs.isF(rFoo2.cb)).toBeTruthy();

        expect(rFoo3.t).toBe('rad');
        expect(rFoo3.id).toBe('foo-3');
        expect(rFoo3.rid).toBe('3');
        expect(rFoo3.gid).toBe('glyph-foo3');
        expect(fs.isF(rFoo3.cb)).toBeTruthy();

        expect(rBar0.t).toBe('rad');
        expect(rBar0.id).toBe('bar-0');
        expect(rBar0.rid).toBe('0');
        expect(rBar0.gid).toBe('glyph-bar0');
        expect(fs.isF(rBar0.cb)).toBeTruthy();

        expect(rBar1.t).toBe('rad');
        expect(rBar1.id).toBe('bar-1');
        expect(rBar1.rid).toBe('1');
        expect(rBar1.gid).toBe('glyph-bar1');
        expect(fs.isF(rBar1.cb)).toBeTruthy();
    });

    it("should verify separator's returned object", function () {
        var separator = tbs.separator();
        expect(separator.t).toBe('sep');
    });

    it('should log a warning if btn id is already in use', function () {
        var tools = [
            tbs.makeButton('id0', 'glyph-id0', function () {}),
            tbs.makeButton('id0', 'glyph-id0', function () {})
        ];

        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('someId', tools);
        expect(tbar).toBeNull();
        expect($log.warn).toHaveBeenCalledWith('createToolbar: item with id ' +
                                                'id0 already exists');
        expect(toolbarSelection().size()).toBe(0);
    });

    it('should log a warning if tog id is already in use', function () {
        var tools = [
            tbs.makeToggle('id0', 'glyph-id0', function () {}),
            tbs.makeToggle('id1', 'glyph-id1', function () {}),
            tbs.makeToggle('id0', 'glyph-id0', function () {})
        ];

        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('someId', tools);
        expect(tbar).toBeNull();
        expect($log.warn).toHaveBeenCalledWith('createToolbar: item with id ' +
                                                'id0 already exists');
        expect(toolbarSelection().size()).toBe(0);
    });

    it('should create a toolbar', function () {
        // need to create a button so it does not throw errors
        var tools = [
            tbs.makeButton('btn0', 'glyph0', function () {})
        ];
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('test', tools);
        expect($log.warn).not.toHaveBeenCalled();
        expect(toolbarSelection().size()).toBe(1);
    });

    it('should test multiple separators in a row', function () {
        var tools = [
            tbs.separator(),
            tbs.separator(),
            tbs.separator()
        ];
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('test', tools);
        expect($log.warn).not.toHaveBeenCalled();
        expect(toolbarSelection().size()).toBe(1);
    });

    it('should create a button div', function () {
        var tools = [
            tbs.makeButton('btn0', 'glyph0', function () {})
        ];
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('test', tools);
        expect($log.warn).not.toHaveBeenCalled();
        expect(toolbarSelection().size()).toBe(1);

        expect(d3Elem.select('.btn')).toBeTruthy();
    });

    it('should create a toggle div', function () {
        var tools = [
            tbs.makeToggle('tog0', 'glyph0', function () {})
        ];
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('test', tools);
        expect($log.warn).not.toHaveBeenCalled();
        expect(toolbarSelection().size()).toBe(1);

        expect(d3Elem.select('.tog')).toBeTruthy();
    });

    it('should create a radio btn div', function () {
        var tools = [
            tbs.makeRadio('rad0', 'glyph0', function () {})
        ];
        spyOn($log, 'warn');
        var tbar = tbs.createToolbar('test', tools);
        expect($log.warn).not.toHaveBeenCalled();
        expect(toolbarSelection().size()).toBe(1);

        expect(d3Elem.select('.rad')).toBeTruthy();
    });


    it('should create a separator div', function () {
        var tools = [
            tbs.separator()
        ];
        tbs.createToolbar('test', tools);

        var sepDiv = d3Elem.select('.sep');
        expect(sepDiv).toBeTruthy();
        expect(sepDiv.style('width')).toBe('2px');
        expect(sepDiv.style('border-width')).toBe('1px');
        expect(sepDiv.style('border-style')).toBe('solid');
    });

});
