/*
 * 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 -- Tooltip Service - Unit Tests
 */
describe('factory: fw/widget/tooltip.js', function () {
    var $log, fs, tts, d3Elem;

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

    beforeEach(inject(function (_$log_, FnService, TooltipService) {
        $log = _$log_;
        fs = FnService;
        tts = TooltipService;
    }));

    beforeEach(function () {
        d3Elem = d3.select('body').append('div').attr('id', 'tooltip');
    });

    afterEach(function () {
        d3.select('#tooltip').remove();
    });

    it('should define TooltipService', function () {
        expect(tts).toBeDefined();
    });

    it('should define api functions', function () {
        expect(fs.areFunctions(tts, [
            'showTooltip', 'cancelTooltip', 'resetTooltip'
        ])).toBeTruthy();
    });

    it('should not accept undefined arguments', function () {
        var btn = d3.select('body').append('div');
        expect(tts.showTooltip()).toBeFalsy();
        expect(tts.showTooltip(btn)).toBeFalsy();

        expect(tts.cancelTooltip()).toBeFalsy();
    });

    // TODO: figure out how to test this
    // testing mouse events is tough
    // showTooltip needs a d3 event, which currently has no test backend
    // .each is a workaround, which provides this, d, and i
    xit('should show a tooltip', function () {
        var btn = d3.select('body').append('div').attr('id', 'foo');
        btn.each(function () {
            tts.showTooltip(this, 'yay a tooltip');
        });
        // tests here
    });

    // can't cancel a tooltip until we show one
    // because currElemId isn't set otherwise
    xit('should cancel an existing tooltip', function () {
        var btn = d3.select('body').append('div').attr('id', 'foo');
        btn.each(function () {
            tts.cancelTooltip(this);
        });
        expect(d3Elem.text()).toBe('');
        expect(d3Elem.style('display')).toBe('none');
    });
});
