/ test / tst_callallmethods.cpp
tst_callallmethods.cpp
  1  #include <QLocalSocket>
  2  #include <QMetaMethod>
  3  #include <QtTest/QtTest>
  4  #include <neovimconnector.h>
  5  #include "common.h"
  6  
  7  /**
  8   * This is the closest I can get to writing a 5 minute unit test without
  9   * putting any effort into this - basically we call all API methods that
 10   * have no arguments.
 11   *
 12   * -- Don't take this too seriously, I just wanted to trigger some unpacking
 13   *    bugs :D
 14   */
 15  
 16  class TestCallAllMethods: public QObject
 17  {
 18  	Q_OBJECT
 19  
 20  private slots:
 21  	void initTestCase();
 22  	void vim_get_current_buffer();
 23  	void vim_list_runtime_paths();
 24  	void vim_call_function();
 25  	void callAll();
 26  
 27  	void buffer_line_count();
 28  	void vim_var();
 29  	void tabpage();
 30  private:
 31  	template <typename API>
 32  	void buffer_line_count(API*);
 33  	template <typename API>
 34  	void vim_var(API*);
 35  	template <typename API>
 36  	void tabpage(API*);
 37  
 38  	void call_metaobject_slots(QObject *obj);
 39  	NeovimQt::NeovimConnector *m_c;
 40  };
 41  
 42  void TestCallAllMethods::initTestCase()
 43  {
 44  	m_c = NeovimQt::NeovimConnector::spawn({"-u", "NONE"});
 45  	QSignalSpy onReady(m_c, SIGNAL(ready()));
 46  	QVERIFY(onReady.isValid());
 47  
 48  	QVERIFY(SPYWAIT(onReady));
 49  }
 50  
 51  void TestCallAllMethods::vim_get_current_buffer()
 52  {
 53  	QVERIFY(m_c->neovimObject());
 54  	auto *obj = m_c->neovimObject();
 55  
 56  	QSignalSpy result(obj, SIGNAL(on_vim_get_current_buffer(int64_t)));
 57  	QVERIFY(result.isValid());
 58  
 59  	obj->vim_get_current_buffer();
 60  	QVERIFY(SPYWAIT(result));
 61  }
 62  
 63  void TestCallAllMethods::vim_list_runtime_paths()
 64  {
 65  	QVERIFY(m_c->neovimObject());
 66  	auto *obj = m_c->neovimObject();
 67  
 68  	QSignalSpy result(obj, SIGNAL(on_vim_list_runtime_paths(QList<QByteArray>)));
 69  	QVERIFY(result.isValid());
 70  
 71  	obj->vim_list_runtime_paths();
 72  	QVERIFY(SPYWAIT(result));
 73  }
 74  
 75  void TestCallAllMethods::callAll()
 76  {
 77  	call_metaobject_slots(m_c->neovimObject());
 78  	call_metaobject_slots(m_c->api0());
 79  	call_metaobject_slots(m_c->api1());
 80  	call_metaobject_slots(m_c->api2());
 81  	call_metaobject_slots(m_c->api3());
 82  	call_metaobject_slots(m_c->api4());
 83  	call_metaobject_slots(m_c->api5());
 84  	call_metaobject_slots(m_c->api6());
 85  }
 86  
 87  void TestCallAllMethods::call_metaobject_slots(QObject *obj)
 88  {
 89  	QVERIFY(obj);
 90  	const QMetaObject *meta = obj->metaObject();
 91  	QSignalSpy neovimErrors(m_c, SIGNAL(error(NeovimError)));
 92  	QVERIFY(neovimErrors.isValid());
 93  	for (int i=0; i<meta->methodCount(); i++) {
 94  		QMetaMethod meth = meta->method(i);
 95  		if ( meth.methodType() != QMetaMethod::Slot ||
 96  				meth.access() != QMetaMethod::Public) {
 97  			continue;
 98  		}
 99  
100  		if (meth.parameterNames().size() == 0 && meth.name() != "deleteLater") {
101  			meth.invoke(obj);
102  		}
103  		else if (meth.parameterNames().size() == 1) {
104  			if ( meth.parameterTypes().at(0) == "Window" ) {
105  				meth.invoke(obj, Q_ARG(int64_t, 1));
106  			}
107  		}
108  	}
109  
110  	// Test Performance: timeout expected, set value carefully.
111  	QVERIFY2(!SPYWAIT(neovimErrors, 250 /*msec*/), "Fatal errors");
112  }
113  
114  /// vim_call_functions() was the first API function
115  /// to use the Array type
116  void TestCallAllMethods::vim_call_function()
117  {
118  	QVERIFY(m_c->neovimObject());
119  	auto *obj = m_c->neovimObject();
120  
121  	QSignalSpy result(obj, SIGNAL(on_vim_call_function(QVariant)));
122  	QVERIFY(result.isValid());
123  
124  	QVariantList args;
125  	args << -2;
126  	obj->vim_call_function("abs", args);
127  	QVERIFY(SPYWAIT(result));
128  	QCOMPARE(result.at(0).at(0), QVariant(2));
129  }
130  
131  #define call_test_all_api(NAME) \
132  	NAME(m_c->neovimObject());	\
133  	NAME(m_c->api0());			\
134  	NAME(m_c->api1());			\
135  	NAME(m_c->api2());			\
136  	NAME(m_c->api3());			\
137  	NAME(m_c->api4());			\
138  	NAME(m_c->api5());			\
139  	NAME(m_c->api6());			\
140  
141  void TestCallAllMethods::buffer_line_count()
142  {
143  	call_test_all_api(buffer_line_count);
144  }
145  template <typename API>
146  void TestCallAllMethods::buffer_line_count(API* obj)
147  {
148  	QVERIFY(obj);
149  
150  	QSignalSpy result(obj, SIGNAL(on_buffer_line_count(int64_t)));
151  	QVERIFY(result.isValid());
152  
153  	obj->buffer_line_count(0);
154  	QVERIFY(SPYWAIT(result));
155  }
156  
157  void TestCallAllMethods::vim_var()
158  {
159  	call_test_all_api(vim_var);
160  }
161  /// Set/get/del variable
162  template <typename API>
163  void TestCallAllMethods::vim_var(API* obj)
164  {
165  	auto varname = "vim_test_var";
166  	auto varvalue = "testvalue";
167  
168  	QVERIFY(obj);
169  
170  	obj->vim_set_var(varname, QString(varvalue));
171  
172  	QSignalSpy result(obj, SIGNAL(on_vim_get_var(QVariant)));
173  	QVERIFY(result.isValid());
174  	obj->vim_get_var(varname);
175  
176  	QVERIFY(SPYWAIT(result));
177  
178  	QVERIFY(result.at(0).at(0) == QByteArray(varvalue));
179  
180  	QSignalSpy result2(obj, SIGNAL(on_vim_del_var(QVariant)));
181  	QVERIFY(result2.isValid());
182  	obj->vim_del_var(varname);
183  	QVERIFY(SPYWAIT(result2));
184  }
185  
186  void TestCallAllMethods::tabpage()
187  {
188  	call_test_all_api(tabpage);
189  }
190  
191  template <typename API>
192  void TestCallAllMethods::tabpage(API* obj)
193  {
194  	auto varname = "tabpage-testvar";
195  	QVERIFY(obj);
196  	obj->tabpage_is_valid(0);
197  	obj->tabpage_get_window(0);
198  	obj->tabpage_get_windows(0);
199  	obj->tabpage_set_var(0, varname, "testval");
200  	obj->tabpage_get_var(0, varname);
201  
202  	QSignalSpy result(obj, SIGNAL(on_tabpage_del_var(QVariant)));
203  	QVERIFY(result.isValid());
204  	obj->tabpage_del_var(0, varname);
205  	QVERIFY(SPYWAIT(result));
206  }
207  
208  QTEST_MAIN(TestCallAllMethods)
209  #include "tst_callallmethods.moc"