| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include <QSignalSpy> | ||
| 4 | |||
| 5 | #include "mock_i3ipc.h" | ||
| 6 | #include "../qi3pc.h" | ||
| 7 | |||
| 8 | Q_DECLARE_LOGGING_CATEGORY(TestQi3pcLogger); | ||
| 9 | |||
| 10 | class TestQi3pc : public QObject { | ||
| 11 | Q_OBJECT | ||
| 12 | |||
| 13 | private slots: | ||
| 14 | void initTestCase(); | ||
| 15 | void cleanupTestCase(); | ||
| 16 | void init(); | ||
| 17 | void cleanup(); | ||
| 18 | |||
| 19 | void test_connection(); | ||
| 20 | // void test_subscription(); | ||
| 21 | void test_fetchWorkspaces(); | ||
| 22 | void test_fetchTree(); | ||
| 23 | void test_fetchOutputs(); | ||
| 24 | void test_fetchMarks(); | ||
| 25 | void test_fetchBarConfigs(); | ||
| 26 | void test_fetchVersion(); | ||
| 27 | void test_fetchBindingModes(); | ||
| 28 | void test_fetchConfig(); | ||
| 29 | void test_fetchBindingState(); | ||
| 30 | |||
| 31 | private: | ||
| 32 | template<typename Data, typename Fetch, typename Get, typename Signal> | ||
| 33 | void fetchTest( | ||
| 34 | qi3pc& ipc, const Data& test_data, | ||
| 35 | Fetch fetch, Get get, Signal notification, | ||
| 36 | const char* signalName, | ||
| 37 | int timeout = 1000, qsizetype expectedEmissions = 1); | ||
| 38 | |||
| 39 | template<typename Data> | ||
| 40 | static | ||
| 41 | QString prettify(const Data& data); | ||
| 42 | |||
| 43 | template<typename Data> | ||
| 44 | static | ||
| 45 | void check_equal(const Data& expected, const Data& actual, const QString& logPrefix); | ||
| 46 | |||
| 47 | private: | ||
| 48 | qi3pc* m_qi3pc; | ||
| 49 | MockI3Server* m_mockServer; | ||
| 50 | QString m_socketPath; | ||
| 51 | std::vector<QMetaObject::Connection> m_connections; | ||
| 52 | }; | ||
| 53 | |||
| 54 | template<typename Data, typename Fetch, typename Get, typename Signal> | ||
| 55 | void | ||
| 56 | 8 | TestQi3pc::fetchTest( | |
| 57 | qi3pc& ipc, | ||
| 58 | const Data& test_data, | ||
| 59 | Fetch fetch, Get get, Signal notification, | ||
| 60 | const char* signalName, | ||
| 61 | int timeout, | ||
| 62 | qsizetype expectedEmissions) | ||
| 63 | { | ||
| 64 |
1/2✓ Branch 0 (2→3) taken 8 times.
✗ Branch 1 (2→235) not taken.
|
8 | ipc.connect(); |
| 65 | |||
| 66 |
1/2✓ Branch 0 (3→4) taken 8 times.
✗ Branch 1 (3→235) not taken.
|
8 | QSignalSpy spy(&ipc, notification); |
| 67 | m_connections.push_back | ||
| 68 |
2/4✓ Branch 0 (4→5) taken 8 times.
✗ Branch 1 (4→138) not taken.
✓ Branch 2 (5→6) taken 8 times.
✗ Branch 3 (5→136) not taken.
|
16 | (connect(&ipc, notification, [&](std::optional<std::pair<Data, qint64>> data) { |
| 69 |
18/66✓ Branch 0 (3→4) taken 1 times.
✗ Branch 1 (3→17) not taken.
✓ Branch 2 (4→5) taken 1 times.
✗ Branch 3 (4→46) not taken.
✓ Branch 4 (6→7) taken 1 times.
✗ Branch 5 (6→43) not taken.
✓ Branch 6 (8→9) taken 1 times.
✗ Branch 7 (8→41) not taken.
✓ Branch 8 (10→11) taken 1 times.
✗ Branch 9 (10→39) not taken.
✗ Branch 10 (14→15) not taken.
✓ Branch 11 (14→30) taken 1 times.
✗ Branch 12 (17→18) not taken.
✗ Branch 13 (17→56) not taken.
✗ Branch 14 (19→20) not taken.
✗ Branch 15 (19→53) not taken.
✗ Branch 16 (21→22) not taken.
✗ Branch 17 (21→51) not taken.
✗ Branch 18 (23→24) not taken.
✗ Branch 19 (23→49) not taken.
✗ Branch 20 (27→28) not taken.
✗ Branch 21 (27→30) not taken.
✓ Branch 22 (3→4) taken 3 times.
✗ Branch 23 (3→17) not taken.
✓ Branch 24 (4→5) taken 3 times.
✗ Branch 25 (4→46) not taken.
✓ Branch 26 (6→7) taken 3 times.
✗ Branch 27 (6→43) not taken.
✓ Branch 28 (8→9) taken 3 times.
✗ Branch 29 (8→41) not taken.
✓ Branch 30 (10→11) taken 3 times.
✗ Branch 31 (10→39) not taken.
✗ Branch 32 (14→15) not taken.
✓ Branch 33 (14→30) taken 3 times.
✗ Branch 34 (17→18) not taken.
✗ Branch 35 (17→56) not taken.
✗ Branch 36 (19→20) not taken.
✗ Branch 37 (19→53) not taken.
✗ Branch 38 (21→22) not taken.
✗ Branch 39 (21→51) not taken.
✗ Branch 40 (23→24) not taken.
✗ Branch 41 (23→49) not taken.
✗ Branch 42 (27→28) not taken.
✗ Branch 43 (27→30) not taken.
✓ Branch 44 (3→4) taken 4 times.
✗ Branch 45 (3→17) not taken.
✓ Branch 46 (4→5) taken 4 times.
✗ Branch 47 (4→46) not taken.
✓ Branch 48 (6→7) taken 4 times.
✗ Branch 49 (6→43) not taken.
✓ Branch 50 (8→9) taken 4 times.
✗ Branch 51 (8→41) not taken.
✓ Branch 52 (10→11) taken 4 times.
✗ Branch 53 (10→39) not taken.
✗ Branch 54 (14→15) not taken.
✓ Branch 55 (14→30) taken 4 times.
✗ Branch 56 (17→18) not taken.
✗ Branch 57 (17→56) not taken.
✗ Branch 58 (19→20) not taken.
✗ Branch 59 (19→53) not taken.
✗ Branch 60 (21→22) not taken.
✗ Branch 61 (21→51) not taken.
✗ Branch 62 (23→24) not taken.
✗ Branch 63 (23→49) not taken.
✗ Branch 64 (27→28) not taken.
✗ Branch 65 (27→30) not taken.
|
16 | QVERIFY2(data.has_value(), |
| 70 | qPrintable(QString("::%1 emitted with empty data.") | ||
| 71 | .arg(signalName))); | ||
| 72 | |||
| 73 |
3/6✓ Branch 0 (34→35) taken 1 times.
✗ Branch 1 (34→59) not taken.
✓ Branch 2 (34→35) taken 3 times.
✗ Branch 3 (34→59) not taken.
✓ Branch 4 (34→35) taken 4 times.
✗ Branch 5 (34→59) not taken.
|
8 | check_equal(test_data, data->first, |
| 74 |
3/6✓ Branch 0 (30→31) taken 1 times.
✗ Branch 1 (30→64) not taken.
✓ Branch 2 (30→31) taken 3 times.
✗ Branch 3 (30→64) not taken.
✓ Branch 4 (30→31) taken 4 times.
✗ Branch 5 (30→64) not taken.
|
8 | QString("::%1 emitted with unexpected data.") |
| 75 |
3/6✓ Branch 0 (32→33) taken 1 times.
✗ Branch 1 (32→61) not taken.
✓ Branch 2 (32→33) taken 3 times.
✗ Branch 3 (32→61) not taken.
✓ Branch 4 (32→33) taken 4 times.
✗ Branch 5 (32→61) not taken.
|
16 | .arg(signalName)); |
| 76 | }) | ||
| 77 | ); | ||
| 78 | |||
| 79 |
2/4✗ Branch 0 (7→8) not taken.
✓ Branch 1 (7→9) taken 8 times.
✓ Branch 2 (10→11) taken 8 times.
✗ Branch 3 (10→233) not taken.
|
8 | (ipc.*fetch)(); |
| 80 |
8/32✓ Branch 0 (11→12) taken 8 times.
✗ Branch 1 (11→233) not taken.
✓ Branch 2 (12→13) taken 8 times.
✗ Branch 3 (12→29) not taken.
✓ Branch 4 (13→14) taken 8 times.
✗ Branch 5 (13→150) not taken.
✓ Branch 6 (15→16) taken 8 times.
✗ Branch 7 (15→147) not taken.
✓ Branch 8 (17→18) taken 8 times.
✗ Branch 9 (17→144) not taken.
✓ Branch 10 (19→20) taken 8 times.
✗ Branch 11 (19→142) not taken.
✓ Branch 12 (21→22) taken 8 times.
✗ Branch 13 (21→140) not taken.
✗ Branch 14 (26→27) not taken.
✓ Branch 15 (26→45) taken 8 times.
✗ Branch 16 (27→28) not taken.
✗ Branch 17 (27→233) not taken.
✗ Branch 18 (29→30) not taken.
✗ Branch 19 (29→164) not taken.
✗ Branch 20 (31→32) not taken.
✗ Branch 21 (31→161) not taken.
✗ Branch 22 (33→34) not taken.
✗ Branch 23 (33→158) not taken.
✗ Branch 24 (35→36) not taken.
✗ Branch 25 (35→156) not taken.
✗ Branch 26 (37→38) not taken.
✗ Branch 27 (37→154) not taken.
✗ Branch 28 (42→43) not taken.
✗ Branch 29 (42→45) not taken.
✗ Branch 30 (43→44) not taken.
✗ Branch 31 (43→233) not taken.
|
24 | QVERIFY2(spy.wait(timeout), |
| 81 | qPrintable(QString("::%1 was not emitted (%2ms timeout).") | ||
| 82 | .arg(signalName) | ||
| 83 | .arg(timeout))); | ||
| 84 | |||
| 85 | 8 | auto count = spy.count(); | |
| 86 |
8/34✓ Branch 0 (46→47) taken 8 times.
✗ Branch 1 (46→66) not taken.
✓ Branch 2 (47→48) taken 8 times.
✗ Branch 3 (47→181) not taken.
✓ Branch 4 (49→50) taken 8 times.
✗ Branch 5 (49→178) not taken.
✓ Branch 6 (51→52) taken 8 times.
✗ Branch 7 (51→175) not taken.
✓ Branch 8 (53→54) taken 8 times.
✗ Branch 9 (53→172) not taken.
✓ Branch 10 (55→56) taken 8 times.
✗ Branch 11 (55→170) not taken.
✓ Branch 12 (57→58) taken 8 times.
✗ Branch 13 (57→168) not taken.
✗ Branch 14 (63→64) not taken.
✓ Branch 15 (63→85) taken 8 times.
✗ Branch 16 (64→65) not taken.
✗ Branch 17 (64→233) not taken.
✗ Branch 18 (66→67) not taken.
✗ Branch 19 (66→199) not taken.
✗ Branch 20 (68→69) not taken.
✗ Branch 21 (68→196) not taken.
✗ Branch 22 (70→71) not taken.
✗ Branch 23 (70→193) not taken.
✗ Branch 24 (72→73) not taken.
✗ Branch 25 (72→190) not taken.
✗ Branch 26 (74→75) not taken.
✗ Branch 27 (74→188) not taken.
✗ Branch 28 (76→77) not taken.
✗ Branch 29 (76→186) not taken.
✗ Branch 30 (82→83) not taken.
✗ Branch 31 (82→85) not taken.
✗ Branch 32 (83→84) not taken.
✗ Branch 33 (83→233) not taken.
|
32 | QVERIFY2(count == expectedEmissions, |
| 87 | qPrintable(QString("::%1 emitted %2 times - expected %3 emissions.") | ||
| 88 | .arg(signalName) | ||
| 89 | .arg(count) | ||
| 90 | .arg(expectedEmissions))); | ||
| 91 | |||
| 92 |
2/4✗ Branch 0 (85→86) not taken.
✓ Branch 1 (85→87) taken 8 times.
✓ Branch 2 (88→89) taken 8 times.
✗ Branch 3 (88→233) not taken.
|
8 | auto data = (ipc.*get)(); |
| 93 |
6/26✓ Branch 0 (91→92) taken 8 times.
✗ Branch 1 (91→105) not taken.
✓ Branch 2 (92→93) taken 8 times.
✗ Branch 3 (92→211) not taken.
✓ Branch 4 (94→95) taken 8 times.
✗ Branch 5 (94→208) not taken.
✓ Branch 6 (96→97) taken 8 times.
✗ Branch 7 (96→206) not taken.
✓ Branch 8 (98→99) taken 8 times.
✗ Branch 9 (98→204) not taken.
✗ Branch 10 (102→103) not taken.
✓ Branch 11 (102→118) taken 8 times.
✗ Branch 12 (103→104) not taken.
✗ Branch 13 (103→231) not taken.
✗ Branch 14 (105→106) not taken.
✗ Branch 15 (105→221) not taken.
✗ Branch 16 (107→108) not taken.
✗ Branch 17 (107→218) not taken.
✗ Branch 18 (109→110) not taken.
✗ Branch 19 (109→216) not taken.
✗ Branch 20 (111→112) not taken.
✗ Branch 21 (111→214) not taken.
✗ Branch 22 (115→116) not taken.
✗ Branch 23 (115→118) not taken.
✗ Branch 24 (116→117) not taken.
✗ Branch 25 (116→231) not taken.
|
16 | QVERIFY2(data.has_value(), |
| 94 | qPrintable(QString("::%1 emitted with empty data.") | ||
| 95 | .arg(signalName))); | ||
| 96 |
1/2✓ Branch 0 (122→123) taken 8 times.
✗ Branch 1 (122→224) not taken.
|
8 | check_equal(test_data, data->first, |
| 97 |
1/2✓ Branch 0 (118→119) taken 8 times.
✗ Branch 1 (118→229) not taken.
|
8 | QString("::%1 emitted with unexpected data.") |
| 98 |
1/2✓ Branch 0 (120→121) taken 8 times.
✗ Branch 1 (120→226) not taken.
|
16 | .arg(signalName)); |
| 99 |
2/4✓ Branch 0 (127→128) taken 8 times.
✗ Branch 1 (127→129) not taken.
✓ Branch 2 (131→132) taken 8 times.
✗ Branch 3 (131→134) not taken.
|
8 | } |
| 100 | |||
| 101 | template<typename Data> | ||
| 102 | QString | ||
| 103 | 37 | TestQi3pc::prettify(const Data& data) { | |
| 104 | if constexpr(std::is_same_v<Data, QString>) { | ||
| 105 | 4 | return data; | |
| 106 | } else { | ||
| 107 |
3/6✓ Branch 0 (2→3) taken 33 times.
✗ Branch 1 (2→14) not taken.
✓ Branch 2 (3→4) taken 33 times.
✗ Branch 3 (3→12) not taken.
✓ Branch 4 (4→5) taken 33 times.
✗ Branch 5 (4→10) not taken.
|
33 | return QString::fromUtf8(QJsonDocument(data).toJson()); |
| 108 | } | ||
| 109 | } | ||
| 110 | |||
| 111 | template<typename Data> | ||
| 112 | void | ||
| 113 | 16 | TestQi3pc::check_equal(const Data& expected, const Data& actual, const QString& logPrefix) { | |
| 114 | if constexpr(std::is_same_v<Data, QJsonArray>) { | ||
| 115 |
10/38✓ Branch 0 (4→5) taken 8 times.
✗ Branch 1 (4→26) not taken.
✓ Branch 2 (5→6) taken 8 times.
✗ Branch 3 (5→109) not taken.
✓ Branch 4 (7→8) taken 8 times.
✗ Branch 5 (7→106) not taken.
✓ Branch 6 (9→10) taken 8 times.
✗ Branch 7 (9→103) not taken.
✓ Branch 8 (10→11) taken 8 times.
✗ Branch 9 (10→103) not taken.
✓ Branch 10 (12→13) taken 8 times.
✗ Branch 11 (12→100) not taken.
✓ Branch 12 (13→14) taken 8 times.
✗ Branch 13 (13→100) not taken.
✓ Branch 14 (15→16) taken 8 times.
✗ Branch 15 (15→98) not taken.
✓ Branch 16 (17→18) taken 8 times.
✗ Branch 17 (17→96) not taken.
✗ Branch 18 (23→24) not taken.
✓ Branch 19 (23→47) taken 8 times.
✗ Branch 20 (26→27) not taken.
✗ Branch 21 (26→127) not taken.
✗ Branch 22 (28→29) not taken.
✗ Branch 23 (28→124) not taken.
✗ Branch 24 (30→31) not taken.
✗ Branch 25 (30→121) not taken.
✗ Branch 26 (31→32) not taken.
✗ Branch 27 (31→121) not taken.
✗ Branch 28 (33→34) not taken.
✗ Branch 29 (33→118) not taken.
✗ Branch 30 (34→35) not taken.
✗ Branch 31 (34→118) not taken.
✗ Branch 32 (36→37) not taken.
✗ Branch 33 (36→116) not taken.
✗ Branch 34 (38→39) not taken.
✗ Branch 35 (38→114) not taken.
✗ Branch 36 (44→45) not taken.
✗ Branch 37 (44→47) not taken.
|
32 | QVERIFY2(expected.count() == actual.count(), |
| 116 | qPrintable(QString("%1 Expected .count#%2 - Found .count#%3") | ||
| 117 | .arg(logPrefix) | ||
| 118 | .arg(expected.count()) | ||
| 119 | .arg(actual.count()) | ||
| 120 | )); | ||
| 121 | } | ||
| 122 | |||
| 123 |
11/38✓ Branch 0 (3→4) taken 16 times.
✗ Branch 1 (3→27) not taken.
✓ Branch 2 (4→5) taken 16 times.
✗ Branch 3 (4→70) not taken.
✓ Branch 4 (6→7) taken 16 times.
✗ Branch 5 (6→67) not taken.
✓ Branch 6 (9→10) taken 16 times.
✗ Branch 7 (9→61) not taken.
✓ Branch 8 (12→13) taken 16 times.
✗ Branch 9 (12→55) not taken.
✓ Branch 10 (14→15) taken 16 times.
✗ Branch 11 (14→53) not taken.
✓ Branch 12 (16→17) taken 16 times.
✗ Branch 13 (16→51) not taken.
✓ Branch 14 (24→25) taken 14 times.
✓ Branch 15 (24→50) taken 2 times.
✓ Branch 16 (27→28) taken 14 times.
✗ Branch 17 (27→94) not taken.
✗ Branch 18 (29→30) not taken.
✓ Branch 19 (29→91) taken 14 times.
✗ Branch 20 (32→33) not taken.
✗ Branch 21 (32→85) not taken.
✗ Branch 22 (35→36) not taken.
✗ Branch 23 (35→79) not taken.
✗ Branch 24 (37→38) not taken.
✗ Branch 25 (37→77) not taken.
✗ Branch 26 (39→40) not taken.
✗ Branch 27 (39→75) not taken.
✗ Branch 28 (47→48) not taken.
✗ Branch 29 (47→50) not taken.
✗ Branch 30 (35→36) not taken.
✗ Branch 31 (35→79) not taken.
✗ Branch 32 (37→38) not taken.
✗ Branch 33 (37→77) not taken.
✗ Branch 34 (39→40) not taken.
✗ Branch 35 (39→75) not taken.
✗ Branch 36 (47→48) not taken.
✗ Branch 37 (47→50) not taken.
|
64 | QVERIFY2(expected == actual, |
| 124 | qPrintable(QString("%1\n" | ||
| 125 | "Expected:\n====\n%2\n====\n" | ||
| 126 | "Found:\n====\n%3\n====\n") | ||
| 127 | .arg(logPrefix) | ||
| 128 | .arg(prettify(expected)) | ||
| 129 | .arg(prettify(actual)) | ||
| 130 | )); | ||
| 131 | } | ||
| 132 |