﻿/// <reference path="../src/datajs.js" />
/// <reference path="../src/odata-utils.js" />
/// <reference path="../src/cache.js" />
/// <reference path="common/djstest.js" />
/// <reference path="common/ODataReadOracle.js" />
/// <reference path="common/rx.js" />

(function (window, undefined) {
    OData.defaultHandler.accept = "application/json;q=0.9, application/atomsvc+xml;q=0.8, */*;q=0.1";
    var feeds = [
        { uri: "./endpoints/FoodStoreDataServiceV4.svc/Foods" }
    ];

    var itemsInCollection = 16;
    var pageSizes = [
        1,
        4,  // factor of total, <= server page size
        5,  // non-factor of total, <= server page size
        6,  // non-factor of total, > server page size
        8,  // factor of total, > server page size
        itemsInCollection,
        itemsInCollection + 1
    ];

    var operatorTests = [
        function (observable) { return observable.Take(0); },
        function (observable) { return observable.Take(1); },
        function (observable) { return observable.Skip(1); },
        function (observable) { return observable.Skip(2).Take(4); },
        function (observable) { return observable.Select(function (item) { return item.Name; }); },
        function (observable) { return observable.Where(function (item) { return item.FoodID % 2 === 1; }); }
    ];

    var assertObservables = function (actual, expected, done) {
        /// <summary>Asserts two finite observables generate the same sequence</summary>
        /// <param name="actual" type="IObservable">The actual observable</param>
        /// <param name="expected" type="IObservable">The expected observable</param>
        /// <param name="done" type="Function">The callback function when asserts are done</param>
        var toArray = function (observable, callback) {
            var arr = [];
            observable.Subscribe(
                function (item) { arr.push(item); },
                function (err) { arr.push({ "__error__": err }); },
                function () { callback(arr); });
        };

        toArray(actual, function (actualSequence) {
            toArray(expected, function (expectedSequence) {
                djstest.assertAreEqualDeep(actualSequence, expectedSequence, "Verify observable sequence");
                done();
            });
        });
    };

    module("Functional");
    $.each(feeds, function (_, feed) {
        $.each(pageSizes, function (_, pageSize) {
            $.each(operatorTests, function (_, operator) {
                var params = { feedUri: feed.uri, pageSize: pageSize, operator: operator };
                djstest.addTest(function (params) {
                    djstest.assertsExpected(1);
                    var options = { name: "cache" + new Date().valueOf(), source: params.feedUri, pageSize: params.pageSize, prefetchSize: 0 };
                    var cache = odatajs.createDataCache(options);

                    ODataReadOracle.readJsonAcrossServerPages(params.feedUri, function (collection) {
                        assertObservables(params.operator(cache.toObservable()), params.operator(window.Rx.Observable.FromArray(collection.value)), function () {
                            djstest.destroyCacheAndDone(cache);
                        });
                    });
                }, "feed: " + params.feedUri + ", pageSize: " + params.pageSize + ", operator: " + params.operator.toString(), params);
            });
        });
    });
})(this);
