(function (root, factory) {
    define(["jasmine", "mock", "test-utils"], factory);
} (this, function (jasmine, mock, test_utils) {
    var _ = converse.env._;
    var $iq = converse.env.$iq;
    var u = converse.env.utils;

    describe("Profiling", function() {
        xit("adds hundreds of contacts to the roster",
                mock.initConverseWithPromises(
                    null, ['rosterGroupsFetched'], {},
                    function (done, _converse) {

            _converse.roster_groups = false;
            test_utils.openControlBox();

            expect(_converse.roster.pluck('jid').length).toBe(0);
            var stanza = $iq({
                to: _converse.connection.jid,
                type: 'result',
                id: 'roster_1'
            }).c('query', {
                xmlns: 'jabber:iq:roster'
            });
            _.each(['Friends', 'Colleagues', 'Family', 'Acquaintances'], function (group) {
                var i;
                for (i=0; i<50; i++) {
                    stanza = stanza.c('item', {
                        jid: Math.random().toString().replace('0.', '')+'@example.net',
                        subscription:'both'
                    }).c('group').t(group).up().up();
                }
            });
            _converse.roster.onReceivedFromServer(stanza.tree());

            return test_utils.waitUntil(function () {
                var $group = _converse.rosterview.$el.find('.roster-group')
                return $group.length && u.isVisible($group[0]);
            }).then(function () {
                var count = 0;
                _converse.roster.each(function (contact) {
                    if (count < 10) {
                        contact.set('chat_status', 'online');
                        count += 1;
                    }
                });
                return test_utils.waitUntil(function () {
                    return _converse.rosterview.$el.find('li.online').length
                })
            }).then(done);
        }));

        xit("adds hundreds of contacts to the roster, with roster groups",
                mock.initConverseWithPromises(
                    null, ['rosterGroupsFetched'], {},
                    function (done, _converse) {
            
            // _converse.show_only_online_users = true;
            _converse.roster_groups = true;
            test_utils.openControlBox();

            expect(_converse.roster.pluck('jid').length).toBe(0);
            var stanza = $iq({
                to: _converse.connection.jid,
                type: 'result',
                id: 'roster_1'
            }).c('query', {
                xmlns: 'jabber:iq:roster'
            });
            _.each(['Friends', 'Colleagues', 'Family', 'Acquaintances'], function (group) {
                var i;
                for (i=0; i<100; i++) {
                    stanza = stanza.c('item', {
                        jid: Math.random().toString().replace('0.', '')+'@example.net',
                        subscription:'both'
                    }).c('group').t(group).up().up();
                }
            });
            _converse.roster.onReceivedFromServer(stanza.tree());

            return test_utils.waitUntil(function () {
                var $group = _converse.rosterview.$el.find('.roster-group')
                return $group.length && u.isVisible($group[0]);
            }).then(function () {
                _.each(['Friends', 'Colleagues', 'Family', 'Acquaintances'], function (group) {
                    var count = 0;
                    _converse.roster.each(function (contact) {
                        if (_.includes(contact.get('groups'), group)) {
                            if (count < 10) {
                                contact.set('chat_status', 'online');
                                count += 1;
                            }
                        }
                    });
                });
                return test_utils.waitUntil(function () {
                    return _converse.rosterview.$el.find('li.online').length
                })
            }).then(done);
        }));
    });
}));
