2018-07-10 17:08:40 +02:00
|
|
|
set_global('blueslip', global.make_zblueslip());
|
2018-02-09 21:38:53 +01:00
|
|
|
set_global('pm_conversations', {
|
|
|
|
recent: {},
|
|
|
|
});
|
2017-05-24 02:16:47 +02:00
|
|
|
|
2017-11-08 19:55:08 +01:00
|
|
|
zrequire('muting');
|
|
|
|
zrequire('unread');
|
|
|
|
zrequire('stream_data');
|
|
|
|
zrequire('topic_data');
|
|
|
|
zrequire('stream_sort');
|
2019-11-02 00:06:25 +01:00
|
|
|
const tg = zrequire('topic_generator');
|
2017-04-06 05:40:40 +02:00
|
|
|
|
|
|
|
function is_even(i) { return i % 2 === 0; }
|
|
|
|
function is_odd(i) { return i % 2 === 1; }
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
run_test('basics', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
let gen = tg.list_generator([10, 20, 30]);
|
2017-04-06 05:40:40 +02:00
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), 20);
|
|
|
|
assert.equal(gen.next(), 30);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const gen1 = tg.list_generator([100, 200]);
|
|
|
|
const gen2 = tg.list_generator([300, 400]);
|
|
|
|
const outers = [gen1, gen2];
|
2017-04-06 05:40:40 +02:00
|
|
|
gen = tg.chain(outers);
|
|
|
|
assert.equal(gen.next(), 100);
|
|
|
|
assert.equal(gen.next(), 200);
|
|
|
|
assert.equal(gen.next(), 300);
|
|
|
|
assert.equal(gen.next(), 400);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.wrap([5, 15, 25, 35], 25);
|
|
|
|
assert.equal(gen.next(), 25);
|
|
|
|
assert.equal(gen.next(), 35);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
assert.equal(gen.next(), 15);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.wrap_exclude([5, 15, 25, 35], 25);
|
|
|
|
assert.equal(gen.next(), 35);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
assert.equal(gen.next(), 15);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.wrap([5, 15, 25, 35], undefined);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
|
|
|
|
gen = tg.wrap_exclude([5, 15, 25, 35], undefined);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
|
|
|
|
gen = tg.wrap([5, 15, 25, 35], 17);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
|
|
|
|
gen = tg.wrap([], 42);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let ints = tg.list_generator([1, 2, 3, 4, 5]);
|
2017-04-06 05:40:40 +02:00
|
|
|
gen = tg.filter(ints, is_even);
|
|
|
|
assert.equal(gen.next(), 2);
|
|
|
|
assert.equal(gen.next(), 4);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
ints = tg.list_generator([]);
|
|
|
|
gen = tg.filter(ints, is_even);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
2017-04-21 17:26:40 +02:00
|
|
|
ints = tg.list_generator([10, 20, 30]);
|
|
|
|
|
|
|
|
function mult10(x) { return x * 10; }
|
|
|
|
|
|
|
|
gen = tg.map(ints, mult10);
|
|
|
|
assert.equal(gen.next(), 100);
|
|
|
|
assert.equal(gen.next(), 200);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-04-06 05:40:40 +02:00
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
run_test('reverse', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
let gen = tg.reverse_list_generator([10, 20, 30]);
|
2017-08-16 22:37:05 +02:00
|
|
|
assert.equal(gen.next(), 30);
|
|
|
|
assert.equal(gen.next(), 20);
|
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
// If second parameter is not in the list, we just traverse the list
|
|
|
|
// in reverse.
|
|
|
|
gen = tg.reverse_wrap_exclude([10, 20, 30]);
|
|
|
|
assert.equal(gen.next(), 30);
|
|
|
|
assert.equal(gen.next(), 20);
|
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.reverse_wrap_exclude([10, 20, 30], 'whatever');
|
|
|
|
assert.equal(gen.next(), 30);
|
|
|
|
assert.equal(gen.next(), 20);
|
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
// Witness the mostly typical cycling behavior.
|
|
|
|
gen = tg.reverse_wrap_exclude([5, 10, 20, 30], 20);
|
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
assert.equal(gen.next(), 30);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.reverse_wrap_exclude([5, 10, 20, 30], 5);
|
|
|
|
assert.equal(gen.next(), 30);
|
|
|
|
assert.equal(gen.next(), 20);
|
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.reverse_wrap_exclude([5, 10, 20, 30], 30);
|
|
|
|
assert.equal(gen.next(), 20);
|
|
|
|
assert.equal(gen.next(), 10);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
// Test small lists.
|
|
|
|
gen = tg.reverse_wrap_exclude([], 5);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.reverse_wrap_exclude([5], 5);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
gen = tg.reverse_wrap_exclude([5], 10);
|
|
|
|
assert.equal(gen.next(), 5);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-08-16 22:37:05 +02:00
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
run_test('fchain', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
const mults = function (n) {
|
|
|
|
let ret = 0;
|
2017-04-06 05:40:40 +02:00
|
|
|
return {
|
|
|
|
next: function () {
|
|
|
|
ret += n;
|
2018-06-06 18:19:09 +02:00
|
|
|
return ret <= 100 ? ret : undefined;
|
2017-04-06 05:40:40 +02:00
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let ints = tg.list_generator([29, 43]);
|
|
|
|
let gen = tg.fchain(ints, mults);
|
2017-04-06 05:40:40 +02:00
|
|
|
assert.equal(gen.next(), 29);
|
|
|
|
assert.equal(gen.next(), 58);
|
|
|
|
assert.equal(gen.next(), 87);
|
|
|
|
assert.equal(gen.next(), 43);
|
|
|
|
assert.equal(gen.next(), 86);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
|
|
|
ints = tg.wrap([33, 34, 37], 37);
|
|
|
|
ints = tg.filter(ints, is_odd);
|
|
|
|
gen = tg.fchain(ints, mults);
|
|
|
|
assert.equal(gen.next(), 37);
|
|
|
|
assert.equal(gen.next(), 74);
|
|
|
|
assert.equal(gen.next(), 33);
|
|
|
|
assert.equal(gen.next(), 66);
|
|
|
|
assert.equal(gen.next(), 99);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
assert.equal(gen.next(), undefined);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const undef = function () {
|
2018-03-13 13:04:16 +01:00
|
|
|
return;
|
2017-05-24 02:16:47 +02:00
|
|
|
};
|
|
|
|
|
2018-07-10 17:08:40 +02:00
|
|
|
blueslip.set_test_data('error', 'Invalid generator returned.');
|
2017-05-24 02:16:47 +02:00
|
|
|
ints = tg.list_generator([29, 43]);
|
|
|
|
gen = tg.fchain(ints, undef);
|
|
|
|
gen.next();
|
2018-07-10 17:08:40 +02:00
|
|
|
assert.equal(blueslip.get_test_logs('error').length, 1);
|
|
|
|
blueslip.clear_test_data();
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-04-06 05:40:40 +02:00
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
run_test('streams', () => {
|
2017-08-16 19:06:07 +02:00
|
|
|
function assert_next_stream(curr_stream, expected) {
|
2019-11-02 00:06:25 +01:00
|
|
|
const actual = tg.get_next_stream(curr_stream);
|
2017-08-16 19:06:07 +02:00
|
|
|
assert.equal(actual, expected);
|
|
|
|
}
|
|
|
|
|
|
|
|
global.stream_sort.get_streams = function () {
|
|
|
|
return ['announce', 'muted', 'devel', 'test here'];
|
|
|
|
};
|
|
|
|
|
|
|
|
assert_next_stream(undefined, 'announce');
|
|
|
|
assert_next_stream('NOT THERE', 'announce');
|
|
|
|
|
|
|
|
assert_next_stream('announce', 'muted');
|
|
|
|
assert_next_stream('test here', 'announce');
|
|
|
|
|
|
|
|
function assert_prev_stream(curr_stream, expected) {
|
2019-11-02 00:06:25 +01:00
|
|
|
const actual = tg.get_prev_stream(curr_stream);
|
2017-08-16 19:06:07 +02:00
|
|
|
assert.equal(actual, expected);
|
|
|
|
}
|
|
|
|
|
|
|
|
assert_prev_stream(undefined, 'test here');
|
|
|
|
assert_prev_stream('test here', 'devel');
|
|
|
|
assert_prev_stream('announce', 'test here');
|
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-04-06 05:40:40 +02:00
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
run_test('topics', () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
const streams = [1, 2, 3, 4];
|
|
|
|
const topics = {};
|
2017-04-06 05:40:40 +02:00
|
|
|
|
|
|
|
topics[1] = ['read', 'read', '1a', '1b', 'read', '1c'];
|
|
|
|
topics[2] = [];
|
|
|
|
topics[3] = ['3a', 'read', 'read', '3b', 'read'];
|
|
|
|
topics[4] = ['4a'];
|
|
|
|
|
|
|
|
function has_unread_messages(stream, topic) {
|
|
|
|
return topic !== 'read';
|
|
|
|
}
|
|
|
|
|
|
|
|
function get_topics(stream) {
|
|
|
|
return topics[stream];
|
|
|
|
}
|
|
|
|
|
|
|
|
function next_topic(curr_stream, curr_topic) {
|
|
|
|
return tg.next_topic(
|
|
|
|
streams,
|
|
|
|
get_topics,
|
|
|
|
has_unread_messages,
|
|
|
|
curr_stream,
|
|
|
|
curr_topic);
|
|
|
|
}
|
|
|
|
|
2017-04-21 17:37:20 +02:00
|
|
|
assert.deepEqual(next_topic(1, '1a'),
|
|
|
|
{stream: 1, topic: '1b'});
|
|
|
|
assert.deepEqual(next_topic(1, undefined),
|
|
|
|
{stream: 1, topic: '1a'});
|
|
|
|
assert.deepEqual(next_topic(2, 'bogus'),
|
|
|
|
{stream: 3, topic: '3a'});
|
|
|
|
assert.deepEqual(next_topic(3, '3b'),
|
|
|
|
{stream: 3, topic: '3a'});
|
|
|
|
assert.deepEqual(next_topic(4, '4a'),
|
|
|
|
{stream: 1, topic: '1a'});
|
|
|
|
assert.deepEqual(next_topic(undefined, undefined),
|
|
|
|
{stream: 1, topic: '1a'});
|
2017-04-21 20:36:12 +02:00
|
|
|
|
|
|
|
|
|
|
|
// Now test the deeper function that is wired up to
|
|
|
|
// real functions stream_data/stream_sort/unread.
|
|
|
|
|
|
|
|
global.stream_sort.get_streams = function () {
|
2017-05-17 16:58:06 +02:00
|
|
|
return ['announce', 'muted', 'devel', 'test here'];
|
2017-04-21 20:36:12 +02:00
|
|
|
};
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const muted_stream_id = 400;
|
|
|
|
const devel_stream_id = 401;
|
2017-04-21 20:36:12 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const stream_id_dct = {
|
2017-07-24 15:15:28 +02:00
|
|
|
muted: muted_stream_id,
|
|
|
|
devel: devel_stream_id,
|
|
|
|
};
|
2017-05-13 19:26:54 +02:00
|
|
|
|
2017-07-24 18:22:37 +02:00
|
|
|
topic_data.get_recent_names = function (stream_id) {
|
2017-07-24 15:15:28 +02:00
|
|
|
switch (stream_id) {
|
2018-05-07 03:30:13 +02:00
|
|
|
case muted_stream_id:
|
|
|
|
return ['ms-topic1', 'ms-topic2'];
|
|
|
|
case devel_stream_id:
|
|
|
|
return ['muted', 'python'];
|
2017-05-13 19:26:54 +02:00
|
|
|
}
|
|
|
|
|
2017-07-24 15:15:28 +02:00
|
|
|
return [];
|
|
|
|
};
|
|
|
|
|
|
|
|
global.stream_data.get_stream_id = function (stream_name) {
|
|
|
|
return stream_id_dct[stream_name];
|
2017-05-13 19:26:54 +02:00
|
|
|
};
|
|
|
|
|
2019-05-21 09:33:21 +02:00
|
|
|
global.stream_data.is_stream_muted_by_name = function (stream_name) {
|
|
|
|
return stream_name === 'muted';
|
2017-05-17 16:58:06 +02:00
|
|
|
};
|
|
|
|
|
2017-05-17 16:33:41 +02:00
|
|
|
global.unread.topic_has_any_unread = function (stream_id) {
|
2017-08-17 10:27:47 +02:00
|
|
|
return _.contains([devel_stream_id, muted_stream_id], stream_id);
|
2017-05-17 16:33:41 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
global.muting.is_topic_muted = function (stream_name, topic) {
|
2018-06-06 18:19:09 +02:00
|
|
|
return topic === 'muted';
|
2017-04-21 20:36:12 +02:00
|
|
|
};
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let next_item = tg.get_next_topic('announce', 'whatever');
|
2017-04-21 20:36:12 +02:00
|
|
|
assert.deepEqual(next_item, {
|
|
|
|
stream: 'devel',
|
|
|
|
topic: 'python',
|
|
|
|
});
|
2017-08-17 10:27:47 +02:00
|
|
|
|
|
|
|
next_item = tg.get_next_topic('muted', undefined);
|
|
|
|
assert.deepEqual(next_item, {
|
|
|
|
stream: 'muted',
|
|
|
|
topic: 'ms-topic1',
|
|
|
|
});
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-02-09 21:38:53 +01:00
|
|
|
|
2018-05-15 12:40:07 +02:00
|
|
|
run_test('get_next_unread_pm_string', () => {
|
2018-02-09 21:38:53 +01:00
|
|
|
pm_conversations.recent.get_strings = function () {
|
|
|
|
return ['1', 'read', '2,3', '4', 'unk'];
|
|
|
|
};
|
|
|
|
|
|
|
|
unread.num_unread_for_person = function (user_ids_string) {
|
|
|
|
if (user_ids_string === 'unk') {
|
2018-03-13 13:04:16 +01:00
|
|
|
return;
|
2018-02-09 21:38:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (user_ids_string === 'read') {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 5; // random non-zero value
|
|
|
|
};
|
|
|
|
|
|
|
|
assert.equal(tg.get_next_unread_pm_string(), '1');
|
|
|
|
assert.equal(tg.get_next_unread_pm_string('4'), '1');
|
|
|
|
assert.equal(tg.get_next_unread_pm_string('unk'), '1');
|
|
|
|
assert.equal(tg.get_next_unread_pm_string('4'), '1');
|
|
|
|
assert.equal(tg.get_next_unread_pm_string('1'), '2,3');
|
|
|
|
assert.equal(tg.get_next_unread_pm_string('read'), '2,3');
|
|
|
|
assert.equal(tg.get_next_unread_pm_string('2,3'), '4');
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|