Esempio n. 1
0
	void futureWatcher()
	{
		std::mutex mutex;
		mutex.lock();
		Future<int> future = async(std::launch::async, [&mutex](Notifier notifier)
		{
			notifier.status("asdf");
			notifier.progress(1, 100);
			mutex.lock();
			mutex.unlock();
			notifier.progress(99, 100);
			notifier.status("fdsa");
			return 42;
		});

		FutureWatcher<int> watcher(future);
		QSignalSpy started(&watcher, SIGNAL(started()));
		QSignalSpy finished(&watcher, SIGNAL(finished()));
		QSignalSpy canceled(&watcher, SIGNAL(canceled()));
		QSignalSpy exception(&watcher, SIGNAL(exception()));
		QSignalSpy progress(&watcher, SIGNAL(progress(std::size_t, std::size_t)));
		QSignalSpy status(&watcher, SIGNAL(status(QString)));

		future.start();
		std::this_thread::sleep_for(1ms);
		QCOMPARE(started.size(), 1);
		QVERIFY(started.first().isEmpty());
		QVERIFY(finished.isEmpty());
		QVERIFY(canceled.isEmpty());
		QVERIFY(exception.isEmpty());
		QCOMPARE(progress.size(), 1);
		QCOMPARE(progress.first(), QList<QVariant>() << 1 << 100);
		QCOMPARE(status.size(), 1);
		QCOMPARE(status.first(), QList<QVariant>() << "asdf");

		mutex.unlock();
		future.result();

		QCOMPARE(started.size(), 1); // stays the same
		QVERIFY(started.first().isEmpty()); // stays the same
		QCOMPARE(finished.size(), 1); // incremented
		QVERIFY(finished.first().isEmpty());
		QVERIFY(canceled.isEmpty()); // stays the same
		QVERIFY(exception.isEmpty()); // stays the same
		QCOMPARE(progress.size(), 2);
		QCOMPARE(progress.at(0), QList<QVariant>() << 1 << 100);
		QCOMPARE(progress.at(1), QList<QVariant>() << 99 << 100);
		QCOMPARE(status.size(), 2);
		QCOMPARE(status.at(0), QList<QVariant>() << "asdf");
		QCOMPARE(status.at(1), QList<QVariant>() << "fdsa");
	}