/*
 * 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 -- 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();
    });

    xit('should define api functions', function () {
        expect(fs.areFunctions(tts, [
            'showTooltip', 'cancelTooltip'
        ])).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');
    });
});
