var config = {
    baseUrl: '../',
    paths: {
        "console-reporter":         "tests/console-reporter",

        "IPv6":                     "node_modules/urijs/src/IPv6",
        "SecondLevelDomains":       "node_modules/urijs/src/SecondLevelDomains",
        "almond":                   "node_modules/almond/almond",
        "awesomplete":              "node_modules/awesomplete-avoid-xss/awesomplete",
        "babel":                    "node_modules/requirejs-babel/babel-5.8.34.min",
        "backbone":                 "node_modules/backbone/backbone",
        "backbone.browserStorage":  "node_modules/backbone.browserStorage/backbone.browserStorage",
        "backbone.nativeview":      "node_modules/backbone.nativeview/backbone.nativeview",
        "backbone.noconflict":      "src/backbone.noconflict",
        "backbone.orderedlistview": "node_modules/backbone.overview/dist/backbone.orderedlistview",
        "backbone.overview":        "node_modules/backbone.overview/dist/backbone.overview",
        "backbone.vdomview":        "node_modules/backbone.vdomview/dist/backbone.vdomview",
        "bootstrap":                "node_modules/bootstrap.native/dist/bootstrap-native-v4",
        "emojione":                 "node_modules/emojione/lib/js/emojione",
        "es6-promise":              "node_modules/es6-promise/dist/es6-promise.auto",
        "eventemitter":             "node_modules/otr/build/dep/eventemitter",
        "filesize":                 "node_modules/filesize/lib/filesize",
        "form-utils":               "src/utils/form",
        "i18n":                     "src/i18n",
        "jed":                      "node_modules/jed/jed",
        "jquery":                   "src/jquery-stub",
        "lodash":                   "node_modules/lodash/lodash",
        "lodash.converter":         "3rdparty/lodash.fp",
        "lodash.fp":                "src/lodash.fp",
        "lodash.noconflict":        "src/lodash.noconflict",
        "message-utils":            "src/utils/message",
        "muc-utils":                "src/utils/muc",
        "pluggable":                "node_modules/pluggable.js/dist/pluggable",
        "polyfill":                 "src/polyfill",
        "punycode":                 "node_modules/urijs/src/punycode",
        "sizzle":                   "node_modules/sizzle/dist/sizzle",
        "snabbdom":                 "node_modules/snabbdom/dist/snabbdom",
        "snabbdom-attributes":      "node_modules/snabbdom/dist/snabbdom-attributes",
        "snabbdom-class":           "node_modules/snabbdom/dist/snabbdom-class",
        "snabbdom-dataset":         "node_modules/snabbdom/dist/snabbdom-dataset",
        "snabbdom-eventlisteners":  "node_modules/snabbdom/dist/snabbdom-eventlisteners",
        "snabbdom-props":           "node_modules/snabbdom/dist/snabbdom-props",
        "snabbdom-style":           "node_modules/snabbdom/dist/snabbdom-style",
        "strophe":                  "node_modules/strophe.js/strophe",
        "strophe.ping":             "node_modules/strophejs-plugin-ping/strophe.ping",
        "strophe.rsm":              "node_modules/strophejs-plugin-rsm/strophe.rsm",
        "text":                     "node_modules/text/text",
        "tovnode":                  "node_modules/snabbdom/dist/tovnode",
        "tpl":                      "node_modules/lodash-template-loader/loader",
        "underscore":               "src/underscore-shim",
        "uri":                      "node_modules/urijs/src/URI",
        "utils":                    "src/utils/core",
        "vdom-parser":              "node_modules/vdom-parser/dist",
        "xss":                      "node_modules/xss/dist/xss",
        "xss.noconflict":           "src/xss.noconflict",

        // Converse
        "converse":                 "src/converse",

        "converse-bookmarks":       "src/converse-bookmarks",
        "converse-chatboxes":       "src/converse-chatboxes",
        "converse-caps":           "src/converse-caps",
        "converse-chatview":        "src/converse-chatview",
        "converse-controlbox":      "src/converse-controlbox",
        "converse-core":            "src/converse-core",
        "converse-disco":           "src/converse-disco",
        "converse-dragresize":      "src/converse-dragresize",
        "converse-embedded":        "src/converse-embedded",
        "converse-fullscreen":      "src/converse-fullscreen",
        "converse-headline":        "src/converse-headline",
        "converse-mam":             "src/converse-mam",
        "converse-message-view":    "src/converse-message-view",
        "converse-minimize":        "src/converse-minimize",
        "converse-modal":           "src/converse-modal",
        "converse-muc":             "src/converse-muc",
        "converse-muc-views":       "src/converse-muc-views",
        "converse-notification":    "src/converse-notification",
        "converse-otr":             "src/converse-otr",
        "converse-ping":            "src/converse-ping",
        "converse-profile":         "src/converse-profile",
        "converse-register":        "src/converse-register",
        "converse-roomslist":       "src/converse-roomslist",
        "converse-roster":          "src/converse-roster",
        "converse-rosterview":      "src/converse-rosterview",
        "converse-singleton":       "src/converse-singleton",
        "converse-vcard":           "src/converse-vcard",

        // Off-the-record-encryption
        // "bigint":               "node_modules/otr/build/dep/bigint",
        "bigint":               "3rdparty/bigint",
        "crypto":               "node_modules/otr/build/dep/crypto",
        "salsa20":              "node_modules/otr/build/dep/salsa20",
        "otr":                  "node_modules/otr/build/otr",
    },

    packages: [{
        'name': 'moment',
        'location': 'node_modules/moment',
        'main': 'moment'
    }],

    map: {
        // '*' means all modules will get the '*.noconflict' version
        // as their dependency.
        '*': {
            'backbone': 'backbone.noconflict',
            'lodash': 'lodash.noconflict'
         },
        // '*.noconflict' wants the real module
        // If this line was not here, there would
        // be an unresolvable cyclic dependency.
        'backbone.noconflict': { 'backbone': 'backbone' },
        'lodash.noconflict': { 'lodash': 'lodash' }
    },

    lodashLoader: {
        // Configuration for requirejs-tpl
        // Use Mustache style syntax for variable interpolation
        root: "src/templates/",
        templateSettings: {
            "escape": /\{\{\{([\s\S]+?)\}\}\}/g,
            "evaluate": /\{\[([\s\S]+?)\]\}/g,
            "interpolate": /\{\{([\s\S]+?)\}\}/g,
            // By default, template places the values from your data in the
            // local scope via the with statement. However, you can specify
            // a single variable name with the variable setting. This can
            // significantly improve the speed at which a template is able
            // to render.
            "variable": 'o'
        }
    },

    // define module dependencies for modules not using define
    shim: {
        'backbone.orderedlistview': { deps: ['backbone.nativeview'] },
        'backbone.overview':        { deps: ['backbone.nativeview'] },
        'backbone.vdomview':        { deps: ['backbone.nativeview'] },
        'awesomplete':              { exports: 'Awesomplete'},
        'emojione':                 { exports: 'emojione'},
        'xss':  {
            'init': function (xss_noconflict) {
                return {
                    filterXSS: window.filterXSS,
                    filterCSS: window.filterCSS
                }
            }
        }
    }
};

// Extra test dependencies
config.paths.jquery = "node_modules/jquery/dist/jquery";
config.paths.mock = "tests/mock";
config.paths['wait-until-promise'] = "node_modules/wait-until-promise/index";
config.paths['test-utils'] = "tests/utils";
config.paths.sinon = "node_modules/sinon/pkg/sinon";
config.paths.transcripts = "converse-logs/converse-logs";
config.paths["jasmine-core"] = "node_modules/jasmine-core/lib/jasmine-core/jasmine";
config.paths.jasmine = "node_modules/jasmine-core/lib/jasmine-core/boot";
config.paths["jasmine-console"] = "node_modules/jasmine-core/lib/console/console";
config.paths["jasmine-html"] = "node_modules/jasmine-core/lib/jasmine-core/jasmine-html";
config.shim.jasmine = {
    exports: 'window.jasmineRequire'
};
config.shim['jasmine-html'] = {
    deps: ['jasmine-core'],
    exports: 'window.jasmineRequire'
};
config.shim['jasmine-console'] = {
    deps: ['jasmine-core'],
    exports: 'window.jasmineRequire'
};
config.shim.jasmine = {
    deps: ['jasmine-core', 'jasmine-html', 'jasmine-console'],
    exports: 'window.jasmine'
};
require.config(config);

var specs = [
    "jasmine",
    //"spec/transcripts",
    //"spec/otr",
    "spec/spoilers",
    "spec/profiling",
    "spec/utils",
    "spec/converse",
    "spec/bookmarks",
    "spec/roomslist",
    "spec/headline",
    "spec/disco",
    "spec/protocol",
    "spec/presence",
    "spec/eventemitter",
    "spec/ping",
    "spec/push",
    "spec/xmppstatus",
    "spec/mam",
    "spec/omemo",
    "spec/controlbox",
    "spec/roster",
    "spec/chatbox",
    "spec/user-details-modal",
    "spec/messages",
    "spec/chatroom",
    "spec/room_registration",
    "spec/autocomplete",
    "spec/minchats",
    "spec/notification",
    "spec/login",
    "spec/register",
    "spec/http-file-upload"
];

require(['console-reporter', 'mock', 'sinon', 'wait-until-promise', 'pluggable'],
        function(ConsoleReporter, mock, sinon, waitUntilPromise, pluggable) {

    if (window.view_mode) {
        mock.view_mode = window.view_mode;
    }
    window.sinon = sinon;
    window.waitUntilPromise = waitUntilPromise.default;
    window.localStorage.clear();
    window.sessionStorage.clear();
    // Load the specs
    require(specs, function (jasmine) {
        var jasmineEnv = jasmine.getEnv();
        jasmineEnv.addReporter(new ConsoleReporter());
        window.onload();
    });
});
