/*
 * 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 -- SVG -- GeoData Service - Unit Tests
 */
describe('factory: fw/svg/geodata.js', function() {
    var $log, $httpBackend, fs, gds, promise;

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

    beforeEach(inject(function (_$log_, _$httpBackend_, FnService, GeoDataService) {
        $log = _$log_;
        $httpBackend = _$httpBackend_;
        fs = FnService;
        gds = GeoDataService;
        gds.clearCache();
    }));


    it('should define GeoDataService', function () {
        expect(gds).toBeDefined();
    });

    it('should define api functions', function () {
        expect(fs.areFunctions(gds, [
            'clearCache', 'fetchTopoData', 'createPathGenerator'
        ])).toBeTruthy();
    });

    it('should return null when no parameters given', function () {
        promise = gds.fetchTopoData();
        expect(promise).toBeNull();
    });

    it('should augment the id of a bundled map', function () {
        var id = '*foo';
        promise = gds.fetchTopoData(id);
        expect(promise.meta).toBeDefined();
        expect(promise.meta.id).toBe(id);
        expect(promise.meta.url).toBe('../data/map/foo.json');
    });

    it('should treat an external id as the url itself', function () {
        var id = 'some/path/to/foo';
        promise = gds.fetchTopoData(id);
        expect(promise.meta).toBeDefined();
        expect(promise.meta.id).toBe(id);
        expect(promise.meta.url).toBe(id + '.json');
    });

    it('should cache the returned objects', function () {
        var id = 'foo';
        promise = gds.fetchTopoData(id);
        expect(promise).toBeDefined();
        expect(promise.meta.wasCached).toBeFalsy();
        expect(promise.tagged).toBeUndefined();

        promise.tagged = 'I woz here';

        promise = gds.fetchTopoData(id);
        expect(promise).toBeDefined();
        expect(promise.meta.wasCached).toBeTruthy();
        expect(promise.tagged).toEqual('I woz here');
    });

    it('should clear the cache when asked', function () {
        var id = 'foo';
        promise = gds.fetchTopoData(id);
        expect(promise.meta.wasCached).toBeFalsy();

        promise = gds.fetchTopoData(id);
        expect(promise.meta.wasCached).toBeTruthy();

        gds.clearCache();
        promise = gds.fetchTopoData(id);
        expect(promise.meta.wasCached).toBeFalsy();
    });


    it('should log a warning if data fails to load', function () {
        var id = 'foo';
        $httpBackend.expectGET('foo.json').respond(404, 'Not found');
        spyOn($log, 'warn');

        promise = gds.fetchTopoData(id);
        $httpBackend.flush();
        expect(promise.topodata).toBeUndefined();
        expect($log.warn)
            .toHaveBeenCalledWith('Failed to retrieve map TopoJSON data: foo.json',
            404, 'Not found');
    });

    // --- path generator tests

    function simpleTopology(object) {
        return {
            type: "Topology",
            transform: {scale: [1, 1], translate: [0, 0]},
            objects: {states: object},
            arcs: [
                [[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1]],
                [[0, 0], [1, 0], [0, 1]],
                [[1, 1], [-1, 0], [0, -1]],
                [[1, 1]],
                [[0, 0]]
            ]
        };
    }

    function simpleLineStringTopo() {
        return simpleTopology({type: "LineString", arcs: [1, 2]});
    }

    it('should use default settings if none are supplied', function () {
        var gen = gds.createPathGenerator(simpleLineStringTopo());
        expect(gen.settings.objectTag).toBe('states');
        expect(gen.settings.logicalSize).toBe(1000);
        expect(gen.settings.mapFillScale).toBe(.95);
        // best we can do for now is test that projection is a function ...
        expect(fs.isF(gen.settings.projection)).toBeTruthy();
    });

    it('should allow us to override default settings', function () {
        var gen = gds.createPathGenerator(simpleLineStringTopo(), {
            mapFillScale: .80
        });
        expect(gen.settings.objectTag).toBe('states');
        expect(gen.settings.logicalSize).toBe(1000);
        expect(gen.settings.mapFillScale).toBe(.80);
    });

    it('should create transformed geodata, and a path generator', function () {
        var gen = gds.createPathGenerator(simpleLineStringTopo());
        expect(fs.isO(gen.settings)).toBeTruthy();
        expect(fs.isO(gen.geodata)).toBeTruthy();
        expect(fs.isF(gen.pathgen)).toBeTruthy();
    });
    // NOTE: we probably should have more unit tests that assert stuff about
    //       the transformed data (geo data) -- though perhaps we can rely on
    //       the unit testing of TopoJSON? See...
    //  https://github.com/mbostock/topojson/blob/master/test/feature-test.js
    //       and, what about the path generator?, and the computed bounds?
    //  In summary, more work should be done here..

});
