/**
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.
*/

var rewire = require('rewire');
var et = require('elementtree');
var xml = require('cordova-common').xmlHelpers;
var ConfigParser = require('../../template/cordova/lib/ConfigParser');
var ConfigParserOrig = require('cordova-common').ConfigParser;

var TEST_XML = '<?xml version="1.0" encoding="UTF-8"?><widget/>';

describe('Windows ConfigParser', function () {
    it('should extend ConfigParser from cordova-common', function () {
        expect(ConfigParser.prototype instanceof ConfigParserOrig).toBe(true);
    });
});

/***
 * Unit tests for validating that min/max versions are correctly obtained
 * (for the function getAllMinMaxUAPVersions) from prepare.js.
 **/

describe('getAllMinMaxUAPVersions method', function () {

    var mockConfig;
    beforeEach(function () {
        spyOn(xml, 'parseElementtreeSync').and.returnValue(new et.ElementTree(et.XML(TEST_XML)));

        mockConfig = new ConfigParser('/some/file');
    });

    it('should correctly transform all versions as a baseline.', function () {
        spyOn(mockConfig, 'getMatchingPreferences').and.returnValue([
            { name: 'Windows.Universal-MinVersion', value: '10.0.9910.0' },
            { name: 'Windows.Universal-MaxVersionTested', value: '10.0.9917.0' },
            { name: 'Windows.Desktop-MinVersion', value: '10.0.9910.0' },
            { name: 'Microsoft.Xbox-MaxVersionTested', value: '10.0.9917.0' }
        ]);

        var versionSet = mockConfig.getAllMinMaxUAPVersions();
        var ver9910 = '10.0.9910.0';
        var ver9917 = '10.0.9917.0';

        expect(versionSet.length).toBe(3);

        expect(versionSet[0].Name).toBe('Windows.Universal');
        expect(versionSet[0].MinVersion).toBe(ver9910);
        expect(versionSet[0].MaxVersionTested).toBe(ver9917);

        expect(versionSet[1].Name).toBe('Windows.Desktop');
        expect(versionSet[1].MinVersion).toBe(ver9910);
        expect(versionSet[1].MaxVersionTested).toBe(ver9910);

        expect(versionSet[2].Name).toBe('Microsoft.Xbox');
        expect(versionSet[2].MinVersion).toBe(ver9917);
        expect(versionSet[2].MaxVersionTested).toBe(ver9917);
    });

    it('should produce versions correctly even when the config file has no settings.', function () {
        spyOn(mockConfig, 'getMatchingPreferences').and.returnValue([]);

        var versionSet = mockConfig.getAllMinMaxUAPVersions();
        var verBaseline = rewire('../../template/cordova/lib/ConfigParser')
            .__get__('BASE_UAP_VERSION').toString();

        expect(versionSet.length).toBe(1);
        expect(versionSet[0].Name).toBe('Windows.Universal');
        expect(versionSet[0].MinVersion).toBe(verBaseline);
        expect(versionSet[0].MaxVersionTested).toBe(verBaseline);

    });

    it('should fail with a RangeError if version specified incorrectly', function () {
        spyOn(mockConfig, 'getMatchingPreferences')
            .and.returnValue([
                { name: 'Windows.Universal-MinVersion', value: '10.0.9910.f' },
                { name: 'Windows.Universal-MaxVersionTested', value: '10.0.9917.0' }
            ]);

        try {
            mockConfig.getAllMinMaxUAPVersions();
            expect(false).toBe(true);
        } catch (ex) {
            expect(ex.constructor).toBe(RangeError);
        }
    });
});
