﻿/// <reference path="common/djstest.js" />
/// <reference path="../src/odata.js" />
/// <reference path="../src/odata-net.js" />
/// <reference path="common/ODataReadOracle.js" />

(function (window, undefined) {

    var unexpectedErrorHandler = function (err) {
        djstest.assert(false, "Unexpected call to error handler with error: " + djstest.toString(err));
        djstest.done();
    };

    var fixConstructors = function (obj) {
        /// <summary>Fix the constructors of the supplied object graph.</summary>
        /// <remarks>
        /// When using IE9 or a non-IE browser, the JSONP support in the library creates objects in a separate IFRAME,
        /// causing the constructor property to be different to that of objects created by the oracle. This function
        /// stringifies and then re-parses the object, which fixes the constructors.
        /// </remarks>
        if (!window.ActiveXObject || window.DOMParser) {
            return window.JSON.parse(window.JSON.stringify(obj));
        } else {
            return obj;
        }
    };

    var handlerAcceptStrings = [
        "*/*",
    /*"application/atom+xml",*/
        "application/json",
        undefined
    ];

    var formatJsonStrings = [
        "application/json",
        "application/json;odata.metadata=none",
        "application/json;odata.metadata=minimal",
        "application/json;odata.metadata=full",
        undefined
    ];
    var azureOdataService = "http://odatasampleservices.azurewebsites.net/V4/OData/OData.svc/";
    var azureOdataFeed = azureOdataService + "Categories";
    var crossDomainTimeout = 45000;

    module("CrossDomain", {
        setup: function () {
            this.oldEnableJsonpCallback = OData.defaultHttpClient.enableJsonpCallback;
            OData.defaultHttpClient.enableJsonpCallback = true;
        },
        teardown: function () {
            OData.defaultHttpClient.enableJsonpCallback = this.oldEnableJsonpCallback;
        }
    });

    for (var i = 0; i < handlerAcceptStrings.length; i++) {
        for (var j = 0; j < formatJsonStrings.length; j++) {
            djstest.addTest(function readCrossDomainFullFeedTest(params) {
                djstest.assertsExpected(1);
                var request = { requestUri: azureOdataFeed, headers: { Accept: params.handlerAccept}, enableJsonpCallback: true };
                if (params.formatJsonString != undefined) {
                    request.formatQueryString = "$format=" + params.formatJsonString;
                }

                djstest.log("Reading data over the wire.");
                odatajs.oData.read(request, function (data, response) {
                    djstest.log("Verifying data over the wire from Oracle.");
                    window.ODataReadOracle.readFeed(azureOdataFeed, function (expectedData) {
                        data = fixConstructors(data);
                        djstest.assertWithoutMetadata(data, expectedData, "Response data not same as expected");
                        djstest.done();
                    }, params.formatJsonString);
                }, unexpectedErrorHandler);
            }, "Testing valid read of cross domain feed collection with " + handlerAcceptStrings[i] + "," + formatJsonStrings[j], { handlerAccept: handlerAcceptStrings[i], formatJsonString: formatJsonStrings[j] }, crossDomainTimeout);
        }

        djstest.addTest(function readCrossDomainEntryTest(handlerAccept) {
            var endPoint = azureOdataFeed + "(1)";
            djstest.assertsExpected(1);
            djstest.log("Reading data over the wire.");
            odatajs.oData.read({ requestUri: endPoint, headers: { Accept: handlerAccept} }, function (data, response) {
                djstest.log("Verifying data over the wire from Oracle.");
                window.ODataReadOracle.readEntry(endPoint, function (expectedData) {
                    data = fixConstructors(data);
                    djstest.assertWithoutMetadata(data, expectedData, "Response data not same as expected");
                    djstest.done();
                }, "application/json");
            }, unexpectedErrorHandler);
        }, "Testing valid read of cross domain entry with " + handlerAcceptStrings[i], handlerAcceptStrings[i], crossDomainTimeout);
    }

    var prefetchSizes = [-1, 0, 15];
    var cacheSizes = [-1, 0, 15];
    var skipValues = [
        0,
        14, // < pageSize
        15, // = pageSize
        16 // > pageSize but < pageSize + prefetchSize
    ];

    var createTestName = function (params) {
        return "Testing ReadRange of " + params.feed + " skip " + params.skip + " take " + params.take + " with pageSize " +
            params.pageSize + ", prefetch " + params.prefetchSize + " and cacheSize " + params.cacheSize;
    };

    var dataCacheReadRangeSingleTest = function (params) {
        var options = { name: "cache", source: params.feed, pageSize: params.pageSize, prefetchSize: params.prefetchSize, cacheSize: params.cacheSize };
        OData.defaultHttpClient.enableJsonpCallback = true;
        var cache = odatajs.createDataCache(options);
        cache.readRange(params.skip, params.take).then(function (data) {
            validateExpectedRange(cache, data, params.feed, params.skip, params.take);
        }, unexpectedErrorHandler);
    };

    var validateExpectedRange = function (cache, data, feed, skipValue, takeValue) {
        var expectedRangeUrl = feed + "?$skip=" + skipValue + "&$top=" + takeValue;
        window.ODataReadOracle.readFeed(expectedRangeUrl, function (expectedData) {
            if (expectedData.results) {
                expectedData = expectedData.results;
            }
            data = fixConstructors(data);
            djstest.assertAreEqualDeep(data, expectedData, "Response data not same as expected");
            djstest.destroyCacheAndDone(cache);
        });
    };

    $.each(prefetchSizes, function (_, prefetchSizeValue) {
        $.each(cacheSizes, function (_, cacheSizeValue) {
            var parameters = { feed: "http://odatasampleservices.azurewebsites.net/V4/OData/OData.svc/Categories", skip: 0, take: 5, pageSize: 15, prefetchSize: prefetchSizeValue, cacheSize: cacheSizeValue };
            djstest.addTest(dataCacheReadRangeSingleTest, createTestName(parameters), parameters);
        });
    });

    $.each(skipValues, function (_, skipValue) {
        var parameters = { feed: "http://odatasampleservices.azurewebsites.net/V4/OData/OData.svc/Categories", skip: skipValue, take: 14, pageSize: 5, prefetchSize: 5, cacheSize: 5 };
        djstest.addTest(dataCacheReadRangeSingleTest, createTestName(parameters), parameters, crossDomainTimeout);
    });
})(this);
