1+ @testset " eventloop" begin
2+ # make sure all shown widgets have been destroyed, otherwise the eventloop
3+ # won't stop automatically
4+ @test length (Gtk. shown_widgets) == 0
5+
6+ @testset " control" begin
7+ before = Gtk. auto_idle[]
8+
9+ @testset " basics" begin
10+ Gtk. auto_idle[] = true
11+ Gtk. enable_eventloop (false )
12+ @test ! Gtk. is_eventloop_running ()
13+ Gtk. enable_eventloop (true )
14+ @test Gtk. is_eventloop_running ()
15+ Gtk. enable_eventloop (false )
16+ @test ! Gtk. is_eventloop_running ()
17+ end
18+
19+ @testset " pause_eventloop" begin
20+
21+ @testset " pauses then restarts" begin
22+ Gtk. enable_eventloop (true )
23+ @test Gtk. is_eventloop_running ()
24+ Gtk. pause_eventloop () do
25+ @test ! Gtk. is_eventloop_running ()
26+ end
27+ @test Gtk. is_eventloop_running ()
28+ end
29+
30+ @testset " doesn't restart a stopping eventloop" begin
31+ Gtk. enable_eventloop (false )
32+ c = GtkCanvas ()
33+ win = GtkWindow (c)
34+ showall (win)
35+ sleep (1 )
36+ @test Gtk. is_eventloop_running ()
37+ destroy (win)
38+ # the eventloop is likely still stopping here
39+ Gtk. pause_eventloop () do
40+ @test ! Gtk. is_eventloop_running ()
41+ end
42+ @test ! Gtk. is_eventloop_running ()
43+ end
44+
45+ @testset " observes auto_idle = false" begin
46+ Gtk. auto_idle[] = false
47+ Gtk. enable_eventloop (true )
48+ Gtk. pause_eventloop () do
49+ @test Gtk. is_eventloop_running ()
50+ end
51+ @test Gtk. is_eventloop_running ()
52+ end
53+
54+ @testset " observes force = true" begin
55+ Gtk. auto_idle[] = false
56+ Gtk. enable_eventloop (true )
57+ Gtk. pause_eventloop (force = true ) do
58+ @test ! Gtk. is_eventloop_running ()
59+ end
60+ @test Gtk. is_eventloop_running ()
61+ end
62+
63+ # Note: Test disabled because this isn't true. The event loop takes some time to stop.
64+ # TODO : Figure out how to wait in the handle_auto_idle callbacks
65+
66+ # @testset "eventloop is stopped immediately after a destroy(win) completes" begin
67+ # c = GtkCanvas()
68+ # win = GtkWindow(c)
69+ # showall(win)
70+ # @test Gtk.is_eventloop_running()
71+ # destroy(win)
72+ # @test !Gtk.is_eventloop_running()
73+ # end
74+ end
75+
76+ Gtk. auto_idle[] = before
77+ end
78+
79+ @testset " Multithreading" begin
80+ @testset " no blocking when eventloop is paused" begin
81+ Gtk. auto_idle[] = true
82+ Threads. nthreads () < 1 && @warn " Threads.nthreads() == 1. Multithread blocking tests are not effective"
83+
84+ function multifoo ()
85+ Threads. @threads for _ in 1 : Threads. nthreads ()
86+ sleep (0.1 )
87+ end
88+ end
89+
90+ Gtk. enable_eventloop (false )
91+ win = Gtk. Window (" Multithread test" , 400 , 300 )
92+ showall (win)
93+ @test Gtk. is_eventloop_running ()
94+ for i in 1 : 10
95+ Gtk. pause_eventloop () do
96+ @test ! Gtk. is_eventloop_running ()
97+ t = @elapsed multifoo () # should take slightly more than 0.1 seconds
98+ @test t < 4.5 # given the Glib uv_prepare timeout is 5000 ms
99+ end
100+ end
101+ @test Gtk. is_eventloop_running ()
102+ destroy (win)
103+ end
104+ end
105+ end
0 commit comments