From patchwork Sun Jan 6 02:33:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 158 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id C9EC560B30 for ; Sun, 6 Jan 2019 03:32:29 +0100 (CET) Received: from avalon.bb.dnainternet.fi (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 65AA7513 for ; Sun, 6 Jan 2019 03:32:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1546741949; bh=BGU7tHjIBA/1Zl5jndxrWB7NtF1QU/eQzxggY2N68Wk=; h=From:To:Subject:Date:In-Reply-To:References:From; b=DFb/hZaIDEh+sClsyFyp6+EMRtZNYkc0zgW5S8x32ZmqTicDrtZ9x009McKmVJnOn k7kyRYLBxcQ2K1PwDL8/5coRCAf5NFvvfFsvEYRaBlIVPWU0RBrhuH2JMauSL2VTqh KtPMfFTFFk9LgN8ixNlVCzZ0TLCilk9jZNJoH/HE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Jan 2019 04:33:26 +0200 Message-Id: <20190106023328.10989-9-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190106023328.10989-1-laurent.pinchart@ideasonboard.com> References: <20190106023328.10989-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 09/11] test: Add signal/slot test X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Jan 2019 02:32:30 -0000 Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- test/meson.build | 1 + test/signal.cpp | 149 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 test/signal.cpp diff --git a/test/meson.build b/test/meson.build index 638e8d51c131..4d334025f3d3 100644 --- a/test/meson.build +++ b/test/meson.build @@ -4,6 +4,7 @@ subdir('media_device') public_tests = [ ['list-cameras', 'list.cpp'], + ['signal', 'signal.cpp'], ] internal_tests = [ diff --git a/test/signal.cpp b/test/signal.cpp new file mode 100644 index 000000000000..5d96958c6d4c --- /dev/null +++ b/test/signal.cpp @@ -0,0 +1,149 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * signal.cpp - Signal test + */ + +#include +#include + +#include + +#include "test.h" + +using namespace std; +using namespace libcamera; + +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_)); + signalInt_.connect(this, &SignalTest::slotInteger1); + signalInt_.connect(this, &SignalTest::slotInteger2); + signalInt_.emit(42); + + if (values_[0] != 42 || values_[1] != 42 || values_[2] != 0) { + 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 signalInt_; + Signal signalMultiArgs_; + + bool called_; + int values_[3]; + std::string name_; +}; + +TEST_REGISTER(SignalTest)