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