mirror of
				https://github.com/slint-ui/slint.git
				synced 2025-11-04 13:39:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			178 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright © SixtyFPS GmbH <info@slint-ui.com>
 | 
						|
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-commercial
 | 
						|
 | 
						|
#define CATCH_CONFIG_MAIN
 | 
						|
#include "catch2/catch.hpp"
 | 
						|
 | 
						|
#include <slint.h>
 | 
						|
#include <thread>
 | 
						|
 | 
						|
TEST_CASE("C++ Singleshot Timers")
 | 
						|
{
 | 
						|
    using namespace slint;
 | 
						|
    int called = 0;
 | 
						|
    Timer testTimer(std::chrono::milliseconds(16), [&]() {
 | 
						|
        slint::quit_event_loop();
 | 
						|
        called += 10;
 | 
						|
    });
 | 
						|
    REQUIRE(called == 0);
 | 
						|
    slint::run_event_loop();
 | 
						|
    REQUIRE(called == 10);
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("C++ Repeated Timer")
 | 
						|
{
 | 
						|
    int timer_triggered = 0;
 | 
						|
    slint::Timer timer;
 | 
						|
 | 
						|
    timer.start(slint::TimerMode::Repeated, std::chrono::milliseconds(30),
 | 
						|
                [&]() { timer_triggered++; });
 | 
						|
 | 
						|
    REQUIRE(timer_triggered == 0);
 | 
						|
 | 
						|
    bool timer_was_running = false;
 | 
						|
 | 
						|
    slint::Timer::single_shot(std::chrono::milliseconds(500), [&]() {
 | 
						|
        timer_was_running = timer.running();
 | 
						|
        slint::quit_event_loop();
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
 | 
						|
    REQUIRE(timer_triggered > 1);
 | 
						|
    REQUIRE(timer_was_running);
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("C++ Restart Singleshot Timer")
 | 
						|
{
 | 
						|
    int timer_triggered = 0;
 | 
						|
    slint::Timer timer;
 | 
						|
 | 
						|
    timer.start(slint::TimerMode::SingleShot, std::chrono::milliseconds(30),
 | 
						|
                [&]() { timer_triggered++; });
 | 
						|
 | 
						|
    REQUIRE(timer_triggered == 0);
 | 
						|
 | 
						|
    bool timer_was_running = false;
 | 
						|
 | 
						|
    slint::Timer::single_shot(std::chrono::milliseconds(500), [&]() {
 | 
						|
        timer_was_running = timer.running();
 | 
						|
        slint::quit_event_loop();
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
 | 
						|
    REQUIRE(timer_triggered == 1);
 | 
						|
    REQUIRE(timer_was_running);
 | 
						|
    timer_triggered = 0;
 | 
						|
    timer.restart();
 | 
						|
    slint::Timer::single_shot(std::chrono::milliseconds(500), [&]() {
 | 
						|
        timer_was_running = timer.running();
 | 
						|
        slint::quit_event_loop();
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
 | 
						|
    REQUIRE(timer_triggered == 1);
 | 
						|
    REQUIRE(timer_was_running);
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("C++ Restart Repeated Timer")
 | 
						|
{
 | 
						|
    int timer_triggered = 0;
 | 
						|
    slint::Timer timer;
 | 
						|
 | 
						|
    timer.start(slint::TimerMode::Repeated, std::chrono::milliseconds(30),
 | 
						|
                [&]() { timer_triggered++; });
 | 
						|
 | 
						|
    REQUIRE(timer_triggered == 0);
 | 
						|
 | 
						|
    bool timer_was_running = false;
 | 
						|
 | 
						|
    slint::Timer::single_shot(std::chrono::milliseconds(500), [&]() {
 | 
						|
        timer_was_running = timer.running();
 | 
						|
        slint::quit_event_loop();
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
 | 
						|
    REQUIRE(timer_triggered > 1);
 | 
						|
    REQUIRE(timer_was_running);
 | 
						|
 | 
						|
    timer_was_running = false;
 | 
						|
    timer_triggered = 0;
 | 
						|
    timer.stop();
 | 
						|
    slint::Timer::single_shot(std::chrono::milliseconds(500), [&]() {
 | 
						|
        timer_was_running = timer.running();
 | 
						|
        slint::quit_event_loop();
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
 | 
						|
    REQUIRE(timer_triggered == 0);
 | 
						|
    REQUIRE(!timer_was_running);
 | 
						|
 | 
						|
    timer_was_running = false;
 | 
						|
    timer_triggered = 0;
 | 
						|
 | 
						|
    timer.restart();
 | 
						|
 | 
						|
    slint::Timer::single_shot(std::chrono::milliseconds(500), [&]() {
 | 
						|
        timer_was_running = timer.running();
 | 
						|
        slint::quit_event_loop();
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
 | 
						|
    REQUIRE(timer_triggered > 1);
 | 
						|
    REQUIRE(timer_was_running);
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("Quit from event")
 | 
						|
{
 | 
						|
    int called = 0;
 | 
						|
    slint::invoke_from_event_loop([&] {
 | 
						|
        slint::quit_event_loop();
 | 
						|
        called += 10;
 | 
						|
    });
 | 
						|
    REQUIRE(called == 0);
 | 
						|
    slint::run_event_loop();
 | 
						|
    REQUIRE(called == 10);
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("Event from thread")
 | 
						|
{
 | 
						|
    std::atomic<int> called = 0;
 | 
						|
    auto t = std::thread([&] {
 | 
						|
        called += 10;
 | 
						|
        slint::invoke_from_event_loop([&] {
 | 
						|
            called += 100;
 | 
						|
            slint::quit_event_loop();
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
    REQUIRE(called == 110);
 | 
						|
    t.join();
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("Blocking Event from thread")
 | 
						|
{
 | 
						|
    std::atomic<int> called = 0;
 | 
						|
    auto t = std::thread([&] {
 | 
						|
        // test returning a, unique_ptr because it is movable-only
 | 
						|
        std::unique_ptr foo =
 | 
						|
                slint::blocking_invoke_from_event_loop([&] { return std::make_unique<int>(42); });
 | 
						|
        called = *foo;
 | 
						|
        int xxx = 123;
 | 
						|
        slint::blocking_invoke_from_event_loop([&] {
 | 
						|
            slint::quit_event_loop();
 | 
						|
            xxx = 888999;
 | 
						|
        });
 | 
						|
        REQUIRE(xxx == 888999);
 | 
						|
    });
 | 
						|
 | 
						|
    slint::run_event_loop();
 | 
						|
    REQUIRE(called == 42);
 | 
						|
    t.join();
 | 
						|
}
 |