~indicator-applet-developers/hud/trunk.15.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 * Copyright (C) 2013 Canonical, Ltd.
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 3, as published
 * by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranties of
 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Author: Marcus Tomlinson <marcus.tomlinson@canonical.com>
 */

#include <service/VoiceImpl.h>

#include <common/DBusTypes.h>
#include <libqtdbusmock/DBusMock.h>

#include <QSignalSpy>
#include <gtest/gtest.h>

using namespace testing;
using namespace QtDBusTest;
using namespace QtDBusMock;
using namespace hud::common;
using namespace hud::service;

namespace {

class TestVoice: public Test {
protected:
	TestVoice() :
			mock(dbus) {
		mock.registerCustomMock(DBusTypes::UNITY_VOICE_DBUS_NAME,
				DBusTypes::UNITY_VOICE_DBUS_PATH,
				ComCanonicalUnityVoiceInterface::staticInterfaceName(),
				QDBusConnection::SessionBus);

		dbus.startServices();

		voice_interface.reset(
				new ComCanonicalUnityVoiceInterface(
						DBusTypes::UNITY_VOICE_DBUS_NAME,
						DBusTypes::UNITY_VOICE_DBUS_PATH,
						dbus.sessionConnection()));
	}

	virtual ~TestVoice() {
	}

	virtual OrgFreedesktopDBusMockInterface & unityVoiceMock() {
		return mock.mockInterface(DBusTypes::UNITY_VOICE_DBUS_NAME,
				DBusTypes::UNITY_VOICE_DBUS_PATH,
				ComCanonicalUnityVoiceInterface::staticInterfaceName(),
				QDBusConnection::SessionBus);
	}

	DBusTestRunner dbus;
	DBusMock mock;
	QSharedPointer<ComCanonicalUnityVoiceInterface> voice_interface;
};

TEST_F( TestVoice, Signals ) {
	// check that signals are patched through VoiceImpl

	VoiceImpl voice(voice_interface);

	QSignalSpy m_heard_something_spy(&voice, SIGNAL( HeardSomething() ));
	QSignalSpy m_listening_spy(&voice, SIGNAL( Listening() ));
	QSignalSpy m_loading_spy(&voice, SIGNAL( Loading() ));

	EXPECT_TRUE(m_heard_something_spy.empty());
	emit voice_interface->HeardSomething();
	EXPECT_FALSE(m_heard_something_spy.empty());

	EXPECT_TRUE(m_listening_spy.empty());
	emit voice_interface->Listening();
	EXPECT_FALSE(m_listening_spy.empty());

	EXPECT_TRUE(m_loading_spy.empty());
	emit voice_interface->Loading();
	EXPECT_FALSE(m_loading_spy.empty());
}

TEST_F( TestVoice, ListenNoCommands ) {
	// call listen() with an empty commands list

	VoiceImpl voice(voice_interface);
	QList<QStringList> commands;

	unityVoiceMock().AddMethod(DBusTypes::UNITY_VOICE_DBUS_NAME, "listen",
			"aas", "s", "ret = 'new file'").waitForFinished();

	EXPECT_NE("new file", voice.listen(commands));

	unityVoiceMock().AddMethod(DBusTypes::UNITY_VOICE_DBUS_NAME, "listen",
			"aas", "s", "ret = 'open file'").waitForFinished();

	EXPECT_NE("open file", voice.listen(commands));
}

TEST_F( TestVoice, Listen ) {
	// call listen() with a valid commands list

	VoiceImpl voice(voice_interface);

	QList<QStringList> commands;
	commands.append( { "new", "file" });
	commands.append( { "open", "file" });

	unityVoiceMock().AddMethod(DBusTypes::UNITY_VOICE_DBUS_NAME, "listen",
			"aas", "s", "ret = 'new file'").waitForFinished();

	EXPECT_EQ("new file", voice.listen(commands));

	unityVoiceMock().AddMethod(DBusTypes::UNITY_VOICE_DBUS_NAME, "listen",
			"aas", "s", "ret = 'open file'").waitForFinished();

	EXPECT_EQ("open file", voice.listen(commands));
}

} // namespace