geary/test/engine/util-idle-manager-test.vala
2020-06-30 17:31:07 +10:00

81 lines
2.2 KiB
Vala

/*
* Copyright 2017 Michael Gratton <mike@vee.net>
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
class Geary.IdleManagerTest : TestCase {
private class WeakRefTest : GLib.Object {
public IdleManager test { get; private set; }
public WeakRefTest() {
// Pass in an arg to ensure the closure is non-trivial
string arg = "my hovercraft is full of eels";
this.test = new IdleManager(
() => {
do_stuff(arg);
}
);
// Pass
this.test.schedule();
}
private void do_stuff(string arg) {
// This should never get called
GLib.assert(false);
}
}
public IdleManagerTest() {
base("Geary.IdleManagerTest");
add_test("weak_ref", callback_weak_ref);
add_test("start_reset", start_reset);
add_test("test_run", test_run);
}
public void callback_weak_ref() throws GLib.Error {
WeakRefTest? owner = new WeakRefTest();
GLib.WeakRef weak_ref = GLib.WeakRef(owner.test);
// Should make both objects null even though the even loop
// hasn't run and hence the callback hasn't been called.
owner = null;
assert_null(weak_ref.get());
// Pump the loop a few times so the callback can get called.
this.main_loop.iteration(false);
this.main_loop.iteration(false);
}
public void start_reset() throws Error {
IdleManager test = new IdleManager(() => { /* noop */ });
assert(!test.is_running);
test.schedule();
assert(test.is_running);
test.reset();
assert(!test.is_running);
}
public void test_run() throws Error {
bool did_run = false;
IdleManager test = new IdleManager(() => { did_run = true; });
test.schedule();
// There should be at least one event pending
assert(this.main_loop.pending());
// Execute the idle function
this.main_loop.iteration(true);
assert(did_run);
}
}