/*
 *
 * 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.
 *
 */

// These tests are needed to check browser's functionality and verify that we are not breaking it.
exports.defineAutoTests = function () {
    var isWp8 = cordova.platformId === "windowsphone";
    var isIOS = (cordova.platformId === "ios");
    var isIOSWKWebView = isIOS && (window.webkit && window.webkit.messageHandlers);
               
    describe("XMLHttpRequest", function () {
        var errorHandler = {
            onError: function (done) {
                if (typeof done === "function") {
                    done();
                }
            }
        };

        beforeEach(function () {
            spyOn(errorHandler, 'onError').and.callThrough();
        });

        afterEach(function () {
            expect(errorHandler.onError).not.toHaveBeenCalled();
        });

        var createXHR = function (url, bAsync, win, lose) {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", url, bAsync);
            xhr.onload = win;
            xhr.onerror = lose;
            xhr.send();
            return xhr;
        }

        it("XMLHttpRequest.spec.1 should exist", function () {
            expect(window.XMLHttpRequest).toBeDefined();
            expect(window.XMLHttpRequest.UNSENT).toBe(0);
            expect(window.XMLHttpRequest.OPENED).toBe(1);
            expect(window.XMLHttpRequest.HEADERS_RECEIVED).toBe(2);
            expect(window.XMLHttpRequest.LOADING).toBe(3);
            expect(window.XMLHttpRequest.DONE).toBe(4);
        });

        it("XMLHttpRequest.spec.2 should be able to create new XHR", function () {

            var xhr = new XMLHttpRequest();
            expect(xhr).toBeDefined();

            // abort
            expect(xhr.abort).toBeDefined();
            expect(typeof xhr.abort == 'function').toBe(true);

            // getResponseHeader
            expect(xhr.getResponseHeader).toBeDefined();
            expect(typeof xhr.getResponseHeader == 'function').toBe(true);

            // getAllResponseHeaders
            expect(xhr.getAllResponseHeaders).toBeDefined();
            expect(typeof xhr.getAllResponseHeaders == 'function').toBe(true);

            // overrideMimeType
            //  IE10 does not support overrideMimeType
            if (cordova.platformId != 'windows8' && cordova.platformId != 'windowsphone') {
                expect(xhr.overrideMimeType).toBeDefined();
                expect(typeof xhr.overrideMimeType == 'function').toBe(true);
            }

            // open
            expect(xhr.open).toBeDefined();
            expect(typeof xhr.open == 'function').toBe(true);
            // send
            expect(xhr.send).toBeDefined();
            expect(typeof xhr.send == 'function').toBe(true);
            // setRequestHeader
            expect(xhr.setRequestHeader).toBeDefined();
            expect(typeof xhr.setRequestHeader == 'function').toBe(true);
        });

        it("XMLHttpRequest.spec.2 should be able to load the current page", function (done) {
            createXHR("index.html", true, done, errorHandler.onError.bind(null, done));
        });

        it("XMLHttpRequest.spec.9 calls onload from successful http get", function (done) {
            createXHR("http://google.com", true, done, errorHandler.onError.bind(null, done));
        });

        it("XMLHttpRequest.spec.3 should be able to load the current page", function (done) {
            createXHR(window.location.href, true, done, errorHandler.onError.bind(null, done));
        });

        it("XMLHttpRequest.spec.4 should be able to load the parent folder page ../index.html", function (done) {
            if (isIOSWKWebView) {
                pending();
            }
           
            createXHR("../index.html", true, done, errorHandler.onError.bind(null, done));
        });

        it("XMLHttpRequest.spec.5 should be able to load the current page ./???.html", function (done) {
            var fileName = window.location.href.split('#')[0].split('/').pop();
            createXHR("./" + fileName, true, done, errorHandler.onError.bind(null, done));
        });

        it("XMLHttpRequest.spec.6 adds hash-path and loads file okay", function (done) {
            var fileName = window.location.href + "#asd/asd/asdasd";
            createXHR(fileName, true, done, errorHandler.onError.bind(null, done));
        });

        describe("XMLHttpRequest", function () {
            var order = "",
                originalTimeout;

            var createXHR = function (url, bAsync, win, lose) {
                var xhr = new XMLHttpRequest();
                xhr.open("GET", url, bAsync);
                xhr.onload = win;
                xhr.onerror = lose;
                xhr.send();
                return xhr;
            }

            beforeEach(function (done) {
                var isAcalled = false;
                var isBCalled = false;

                originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
                jasmine.DEFAULT_TIMEOUT_INTERVAL = 7500;

                winA = jasmine.createSpy("spyWinA").and.callFake(function () {
                    order += "A";
                    isAcalled = true;
                    if (isBCalled)
                        done();
                });
                winB = jasmine.createSpy("spyWinB").and.callFake(function () {
                    order += "B";
                    isBCalled = true;
                    if (isAcalled)
                        done();
                });

                var fileName = window.location.href.split('#')[0].split('/').pop();
                createXHR(fileName, true, winA, errorHandler.onError);
                createXHR(fileName, false, winB, errorHandler.onError);
            });

            afterEach(function () {
                expect(errorHandler.onError).not.toHaveBeenCalled();
                jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
            });

            it("XMLHttpRequest.spec.10 overlapping async calls are not muxed", function (done) {
                expect(winA).toHaveBeenCalled();
                expect(winB).toHaveBeenCalled();
                console.log("order = " + order);
                done();
            }, "Expecting both callbacks to be called.");
        });
    });


    // only add these tests if we are testing on windows phone

    if (isWp8) {
        describe("XMLHttpRequest Windows Phone", function () {

            var errorHandler = { onError: function () { } };

            beforeEach(function () {
                spyOn(errorHandler, 'onError');
            });

            afterEach(function () {
                expect(errorHandler.onError).not.toHaveBeenCalled();
            });

            var createXHR = function (url, bAsync, win, lose) {
                var xhr = new XMLHttpRequest();
                xhr.open("GET", url, bAsync);
                xhr.onload = win;
                xhr.onerror = lose;
                xhr.send();
                return xhr;
            };

            it("XMLHttpRequest.spec.7 should be able to load the (WP8 backwards compatability) root page www/index.html", function (done) {
                expect(function () {
                    createXHR("www/index.html", true, done, errorHandler.onError)
                }).not.toThrow();
            });

            it("XMLHttpRequest.spec.8 should be able to load the (WP7 backwards compatability) root page app/www/index.html", function (done) {
                expect(function () {
                    createXHR("app/www/index.html", true, done, errorHandler.onError)
                }).not.toThrow();
            });

            it("XMLHttpRequest.spec.11 should be able to load the current page using window.location with extra / [CB-6299]", function (done) {
                var path = window.location.protocol + "/" + window.location.toString().substr(window.location.protocol.length);
                createXHR(path, true, done, errorHandler.onError);
            });
        });
    }
}
