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"