/*
 * 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 -- Layer -- Flash Service - Unit Tests
 */
describe('factory: fw/layer/flash.js', function () {
    var $log, $timeout, fs, flash, d3Elem;

    beforeEach(module('onosLayer'));

    beforeEach(inject(function (_$log_, _$timeout_, FnService, FlashService) {
        $log = _$log_;
        $timeout = _$timeout_;
        fs = FnService;
        flash = FlashService;
        jasmine.clock().install();
        d3Elem = d3.select('body').append('div').attr('id', 'myflashdiv');
        flash.initFlash();
    }));

    afterEach(function () {
        jasmine.clock().uninstall();
        d3.select('#myflashdiv').remove();
    });

    function flashItemSelection() {
        return d3Elem.selectAll('.flashItem');
    }

    it('should define FlashService', function () {
        expect(flash).toBeDefined();
    });

    xit('should define api functions', function () {
        expect(fs.areFunctions(flash, [
            'initFlash', 'flash', 'enable'
        ])).toBe(true);
    });

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

    it('should flash the message Foo', function () {
        var item, rect, text;
        flash.flash('foo');
        jasmine.clock().tick(101);
        setTimeout(function () {
            item = flashItemSelection();
            expect(item.size()).toEqual(1);
            expect(item.classed('flashItem')).toBeTruthy();
            expect(item.select('rect').size()).toEqual(1);
            text = item.select('text');
            expect(text.size()).toEqual(1);
            expect(text.text()).toEqual('foo');
        }, 100);
    });
});
