test: Add signal/slot test
The test covers signal connection, disconnection through all the provided methods, emission, parameters, and connection of a signal to multiple slots. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
03815afdc8
commit
f151895c3f
2 changed files with 160 additions and 0 deletions
159
test/signal.cpp
Normal file
159
test/signal.cpp
Normal file
|
@ -0,0 +1,159 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (C) 2019, Google Inc.
|
||||
*
|
||||
* signal.cpp - Signal test
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
|
||||
#include <libcamera/signal.h>
|
||||
|
||||
#include "test.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace libcamera;
|
||||
|
||||
static int valueStatic_ = 0;
|
||||
|
||||
static void slotStatic(int value)
|
||||
{
|
||||
valueStatic_ = value;
|
||||
}
|
||||
|
||||
class SignalTest : public Test
|
||||
{
|
||||
protected:
|
||||
void slotVoid()
|
||||
{
|
||||
called_ = true;
|
||||
}
|
||||
|
||||
void slotDisconnect()
|
||||
{
|
||||
called_ = true;
|
||||
signalVoid_.disconnect(this, &SignalTest::slotDisconnect);
|
||||
}
|
||||
|
||||
void slotInteger1(int value)
|
||||
{
|
||||
values_[0] = value;
|
||||
}
|
||||
|
||||
void slotInteger2(int value)
|
||||
{
|
||||
values_[1] = value;
|
||||
}
|
||||
|
||||
void slotMultiArgs(int value, const std::string &name)
|
||||
{
|
||||
values_[2] = value;
|
||||
name_ = name;
|
||||
}
|
||||
|
||||
int init()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int run()
|
||||
{
|
||||
/* Test signal emission and reception. */
|
||||
called_ = false;
|
||||
signalVoid_.connect(this, &SignalTest::slotVoid);
|
||||
signalVoid_.emit();
|
||||
|
||||
if (!called_) {
|
||||
cout << "Signal emission test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/* Test signal with parameters. */
|
||||
values_[2] = 0;
|
||||
name_.clear();
|
||||
signalMultiArgs_.connect(this, &SignalTest::slotMultiArgs);
|
||||
signalMultiArgs_.emit(42, "H2G2");
|
||||
|
||||
if (values_[2] != 42 || name_ != "H2G2") {
|
||||
cout << "Signal parameters test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/* Test signal connected to multiple slots. */
|
||||
memset(values_, 0, sizeof(values_));
|
||||
valueStatic_ = 0;
|
||||
signalInt_.connect(this, &SignalTest::slotInteger1);
|
||||
signalInt_.connect(this, &SignalTest::slotInteger2);
|
||||
signalInt_.connect(&slotStatic);
|
||||
signalInt_.emit(42);
|
||||
|
||||
if (values_[0] != 42 || values_[1] != 42 || values_[2] != 0 ||
|
||||
valueStatic_ != 42) {
|
||||
cout << "Signal multi slot test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/* Test disconnection of a single slot. */
|
||||
memset(values_, 0, sizeof(values_));
|
||||
signalInt_.disconnect(this, &SignalTest::slotInteger2);
|
||||
signalInt_.emit(42);
|
||||
|
||||
if (values_[0] != 42 || values_[1] != 0 || values_[2] != 0) {
|
||||
cout << "Signal slot disconnection test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/* Test disconnection of a whole object. */
|
||||
memset(values_, 0, sizeof(values_));
|
||||
signalInt_.disconnect(this);
|
||||
signalInt_.emit(42);
|
||||
|
||||
if (values_[0] != 0 || values_[1] != 0 || values_[2] != 0) {
|
||||
cout << "Signal object disconnection test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/* Test disconnection of a whole signal. */
|
||||
memset(values_, 0, sizeof(values_));
|
||||
signalInt_.connect(this, &SignalTest::slotInteger1);
|
||||
signalInt_.connect(this, &SignalTest::slotInteger2);
|
||||
signalInt_.disconnect();
|
||||
signalInt_.emit(42);
|
||||
|
||||
if (values_[0] != 0 || values_[1] != 0 || values_[2] != 0) {
|
||||
cout << "Signal object disconnection test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
/* Test disconnection from slot. */
|
||||
signalVoid_.disconnect();
|
||||
signalVoid_.connect(this, &SignalTest::slotDisconnect);
|
||||
|
||||
signalVoid_.emit();
|
||||
called_ = false;
|
||||
signalVoid_.emit();
|
||||
|
||||
if (called_) {
|
||||
cout << "Signal disconnection from slot test failed" << endl;
|
||||
return TestFail;
|
||||
}
|
||||
|
||||
return TestPass;
|
||||
}
|
||||
|
||||
void cleanup()
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
Signal<> signalVoid_;
|
||||
Signal<int> signalInt_;
|
||||
Signal<int, const std::string &> signalMultiArgs_;
|
||||
|
||||
bool called_;
|
||||
int values_[3];
|
||||
std::string name_;
|
||||
};
|
||||
|
||||
TEST_REGISTER(SignalTest)
|
Loading…
Add table
Add a link
Reference in a new issue