Skip to content

Commit 7e9308a

Browse files
committed
Improved reading yaml (docker-compose example) and prepared unit-tests for tagnames
1 parent db87a3b commit 7e9308a

File tree

6 files changed

+236
-4
lines changed

6 files changed

+236
-4
lines changed

src/wsjcpp_yaml.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ std::vector<std::string> WsjcppYamlItem::getKeys() {
274274
std::vector<std::string> vKeys;
275275
for (int i = 0; i < m_vObjects.size(); i++) {
276276
WsjcppYamlItem *pItem = m_vObjects[i];
277-
if (pItem->isValue() || pItem->isMap() || pItem->isArray()) {
277+
if (pItem->isValue() || pItem->isMap() || pItem->isArray() || pItem->isUndefined()) {
278278
std::string sName = pItem->getName();
279279
vKeys.push_back(sName);
280280
}
@@ -783,6 +783,7 @@ bool WsjcppYamlParsebleLine::parseLine(const std::string &sLine, std::string &sE
783783
state = WSJCPP_YAML_PARSER_LINE_STATE_VALUE;
784784
m_sValue += c;
785785
} else if (c == ':' && state == WSJCPP_YAML_PARSER_LINE_STATE_VALUE) {
786+
std::cout << m_sValue << std::endl;
786787
if (m_sName.length() == 0) {
787788
m_sName = m_sValue;
788789
m_sValue = ""; // reset value it was param name
@@ -848,6 +849,12 @@ bool WsjcppYamlParsebleLine::parseLine(const std::string &sLine, std::string &sE
848849

849850
// ---------------------------------------------------------------------
850851

852+
bool WsjcppYamlParsebleLine::canTagName(const std::string &sVal) {
853+
return true;
854+
}
855+
856+
// ---------------------------------------------------------------------
857+
851858
std::string WsjcppYamlParsebleLine::removeStringDoubleQuotes(const std::string &sValue) {
852859
if (sValue.size() > 0 && sValue[0] != '"') {
853860
return sValue;

src/wsjcpp_yaml.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ class WsjcppYamlParsebleLine {
160160
bool parseLine(const std::string &sLine, std::string &sError);
161161

162162
private:
163+
163164
std::string TAG;
164165
int m_nLineNumber;
165166

@@ -173,6 +174,7 @@ class WsjcppYamlParsebleLine {
173174
bool m_bHasComment;
174175
bool m_bEmptyLine;
175176

177+
bool canTagName(const std::string &sVal);
176178
std::string removeStringDoubleQuotes(const std::string &sValue);
177179
std::string removeStringSingleQuotes(const std::string &sValue);
178180
};

unit-tests.wsjcpp/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_memory_leaks.cpp
4848
list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_read_yaml.cpp")
4949
list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_read_write_file.cpp")
5050
list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_cursor.cpp")
51+
list (APPEND WSJCPP_SOURCES "../unit-tests.wsjcpp/src/unit_test_tag_names.cpp")
5152

5253
include(${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.user-custom.txt)
5354

unit-tests.wsjcpp/src/unit_test_read_yaml.cpp

Lines changed: 173 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,182 @@ void UnitTestReadYaml::executeTest() {
3939
}
4040

4141
compare("has version", yaml.getRoot()->hasElement("version"), true);
42-
compare("has volumes", yaml.getRoot()->hasElement("volumes"), true);
43-
compare("has networks", yaml.getRoot()->hasElement("networks"), true);
42+
compare("has version is value", yaml.getRoot()->getElement("version")->isValue(), true);
43+
compare("version-value", yaml.getRoot()->getElement("version")->getValue(), "3");
44+
4445
compare("has services", yaml.getRoot()->hasElement("services"), true);
46+
compare("has services is map", yaml.getRoot()->getElement("services")->isMap(), true);
47+
48+
49+
WsjcppYamlItem *pServices = yaml.getRoot()->getElement("services");
50+
51+
compare("has services.vote", pServices->hasElement("vote"), true);
52+
compare("has services.vote is map", pServices->getElement("vote")->isMap(), true);
53+
54+
55+
/*
56+
57+
services:
58+
vote:
59+
build: ./vote
60+
command: python app.py
61+
volumes:
62+
- ./vote:/app
63+
ports:
64+
- "5000:80"
65+
networks:
66+
- front-tier
67+
- back-tier
68+
69+
result:
70+
build: ./result
71+
command: nodemon server.js
72+
volumes:
73+
- ./result:/app
74+
*/
75+
76+
// services.result
77+
{
78+
compare("has services.result", pServices->hasElement("result"), true);
79+
compare("services.result is map", pServices->getElement("result")->isMap(), true);
80+
compare("services.result keys size 5", pServices->getElement("result")->getKeys().size(), 5);
81+
82+
WsjcppYamlItem *pResult = pServices->getElement("result");
83+
84+
WsjcppYamlItem *pResultVolumes = pResult->getElement("volumes");
85+
compare("services.result.volumes is array", pResultVolumes->isArray(), true);
86+
compare("services.result.volumes size 1", pResultVolumes->getLength(), 1);
87+
compare("services.result.volumes val 0", pResultVolumes->getElement(0)->getValue(), "./result:/app");
88+
89+
WsjcppYamlItem *pResultPorts = pResult->getElement("ports");
90+
compare("services.result.ports is array", pResultPorts->isArray(), true);
91+
compare("services.result.ports size 2", pResultPorts->getLength(), 2);
92+
compare("services.result.ports val 0", pResultPorts->getElement(0)->getValue(), "5001:80");
93+
compare("services.result.ports val 1", pResultPorts->getElement(1)->getValue(), "5858:5858");
94+
95+
WsjcppYamlItem *pResultNetworks = pResult->getElement("networks");
96+
compare("services.result.networks size 2", pResultNetworks->getLength(), 2);
97+
compare("services.result.networks val 0", pResultNetworks->getElement(0)->getValue(), "front-tier");
98+
compare("services.result.networks val 1", pResultNetworks->getElement(1)->getValue(), "back-tier");
99+
}
45100

46-
compare("version-value", yaml.getRoot()->getElement("version")->getValue(), "3");
101+
// services.worker
102+
{
103+
compare("has services.worker", pServices->hasElement("worker"), true);
104+
compare("has services.worker is map", pServices->getElement("worker")->isMap(), true);
105+
compare("services.worker keys size 3", pServices->getElement("worker")->getKeys().size(), 3);
106+
WsjcppYamlItem *pWorker = pServices->getElement("worker");
107+
108+
compare("has services.worker.build", pWorker->hasElement("build"), true);
109+
110+
compare("has services.worker.depends_on", pWorker->hasElement("depends_on"), true);
111+
compare("has services.worker.networks", pWorker->hasElement("networks"), true);
112+
113+
WsjcppYamlItem *pWorkerBuild = pWorker->getElement("build");
114+
compare("services.worker.build is map", pWorkerBuild->isMap(), true);
115+
compare("has services.worker.build.context", pWorkerBuild->hasElement("context"), true);
116+
compare("services.worker.build.context val", pWorkerBuild->getElement("context")->getValue(), "./worker");
117+
118+
WsjcppYamlItem *pWorkerDependsOn = pWorker->getElement("depends_on");
119+
compare("has services.worker.depends_on", pWorkerDependsOn->isArray(), true);
120+
compare("services.worker.depends_on size 2", pWorkerDependsOn->getLength(), 2);
121+
compare("services.worker.depends_on val 0", pWorkerDependsOn->getElement(0)->getValue(), "redis");
122+
compare("services.worker.depends_on val 1", pWorkerDependsOn->getElement(1)->getValue(), "db");
123+
124+
WsjcppYamlItem *pWorkerNetworks = pWorker->getElement("networks");
125+
compare("services.worker.networks size 1", pWorkerNetworks->getLength(), 1);
126+
compare("services.worker.networks val 0", pWorkerNetworks->getElement(0)->getValue(), "back-tier");
127+
}
128+
129+
// services.redis
130+
{
131+
compare("has services.redis", pServices->hasElement("redis"), true);
132+
compare("services.redis is map", pServices->getElement("redis")->isMap(), true);
133+
compare("services.redis keys size 4", pServices->getElement("redis")->getKeys().size(), 4);
134+
135+
WsjcppYamlItem *pRedis = pServices->getElement("redis");
136+
compare("has services.redis.image", pRedis->hasElement("image"), true);
137+
compare("has services.redis.container_name", pRedis->hasElement("container_name"), true);
138+
compare("has services.redis.ports", pRedis->hasElement("ports"), true);
139+
compare("has services.redis.networks", pRedis->hasElement("networks"), true);
140+
141+
compare("services.redis.image value", pRedis->getElement("image")->getValue(), "redis:alpine");
142+
compare("services.redis.container_name", pRedis->getElement("container_name")->getValue(), "redis");
143+
144+
WsjcppYamlItem *pRedisPorts = pRedis->getElement("ports");
145+
// TODO bug #17
146+
compare("services.redis.ports is value", pRedisPorts->isValue(), true);
147+
compare("services.redis.ports value", pRedisPorts->getValue(), "[\"6379\"]");
148+
149+
WsjcppYamlItem *pRedisNetworks = pRedis->getElement("networks");
150+
compare("services.redis.networks size 1", pRedisNetworks->getLength(), 1);
151+
compare("services.redis.networks val 0", pRedisNetworks->getElement(0)->getValue(), "back-tier");
152+
}
153+
154+
// services.db
155+
{
156+
compare("has services.db", pServices->hasElement("db"), true);
157+
compare("has services.db is map", pServices->getElement("db")->isMap(), true);
158+
compare("services.db keys size 5", pServices->getElement("db")->getKeys().size(), 5);
159+
160+
WsjcppYamlItem *pServicesDb = pServices->getElement("db");
161+
162+
compare("has services.db.image", pServicesDb->hasElement("image"), true);
163+
compare("services.db.image value", pServicesDb->getElement("image")->getValue(), "postgres:9.4");
164+
compare("services.db.container_name", pServicesDb->getElement("container_name")->getValue(), "db");
165+
166+
compare("has services.db.environment", pServicesDb->hasElement("environment"), true);
167+
compare("services.db.environment is map", pServicesDb->getElement("environment")->isMap(), true);
168+
169+
WsjcppYamlItem *pDbEnvironment = pServicesDb->getElement("environment");
170+
171+
compare("has services.db.environment.POSTGRES_USER", pDbEnvironment->hasElement("POSTGRES_USER"), true);
172+
compare("services.db.environment.POSTGRES_USER", pDbEnvironment->getElement("POSTGRES_USER")->getValue(), "postgres");
47173

174+
compare("has services.db.environment.POSTGRES_PASSWORD", pDbEnvironment->hasElement("POSTGRES_PASSWORD"), true);
175+
compare("services.db.environment.POSTGRES_PASSWORD", pDbEnvironment->getElement("POSTGRES_PASSWORD")->getValue(), "postgres");
176+
177+
compare("has services.db.volumes", pServicesDb->hasElement("volumes"), true);
178+
compare("services.db.volumes is array", pServicesDb->getElement("volumes")->isArray(), true);
179+
180+
WsjcppYamlItem *pDbVolumes = pServicesDb->getElement("volumes");
181+
compare("services.db.volumes size 1", pDbVolumes->getLength(), 1);
182+
compare("services.db.volumes val 0", pDbVolumes->getElement(0)->getValue(), "db-data:/var/lib/postgresql/data");
183+
184+
compare("has services.db.networks", pServicesDb->hasElement("networks"), true);
185+
compare("services.db.networks is array", pServicesDb->getElement("networks")->isArray(), true);
186+
187+
WsjcppYamlItem *pDbNetworks = pServicesDb->getElement("networks");
188+
compare("services.db.networks size 1", pDbNetworks->getLength(), 1);
189+
compare("services.db.networks val 0", pDbNetworks->getElement(0)->getValue(), "back-tier");
190+
}
191+
192+
// volumes
193+
{
194+
compare("has volumes", yaml.getRoot()->hasElement("volumes"), true);
195+
compare("has volumes is map", yaml.getRoot()->getElement("volumes")->isMap(), true);
196+
197+
WsjcppYamlItem *pVolumes = yaml.getRoot()->getElement("volumes");
198+
199+
compare("has volumes.db-data", pVolumes->hasElement("db-data"), true);
200+
compare("has volumes.db-data is undefined", pVolumes->getElement("db-data")->isUndefined(), true);
201+
compare("has volumes keys size 1", pVolumes->getKeys().size(), 1);
202+
}
203+
204+
// networks
205+
{
206+
compare("has networks", yaml.getRoot()->hasElement("networks"), true);
207+
compare("has networks is map", yaml.getRoot()->getElement("networks")->isMap(), true);
208+
209+
WsjcppYamlItem *pNeworks = yaml.getRoot()->getElement("networks");
210+
compare("has networks keys size 2", pNeworks->getKeys().size(), 2);
211+
212+
compare("has networks.front-tier", pNeworks->hasElement("front-tier"), true);
213+
compare("has networks.front-tier is undefined", pNeworks->getElement("front-tier")->isUndefined(), true);
214+
215+
compare("has networks.back-tier", pNeworks->hasElement("back-tier"), true);
216+
compare("has networks.back-tier is undefined", pNeworks->getElement("back-tier")->isUndefined(), true);
217+
}
48218
}
49219

50220
// ---------------------------------------------------------------------
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
#include <wsjcpp_core.h>
3+
#include <wsjcpp_unit_tests.h>
4+
#include <wsjcpp_yaml.h>
5+
6+
// ---------------------------------------------------------------------
7+
// UnitTestTagNames
8+
9+
class UnitTestTagNames : public WsjcppUnitTestBase {
10+
public:
11+
UnitTestTagNames();
12+
virtual bool doBeforeTest() override;
13+
virtual void executeTest() override;
14+
virtual bool doAfterTest() override;
15+
};
16+
17+
REGISTRY_WSJCPP_UNIT_TEST(UnitTestTagNames)
18+
19+
UnitTestTagNames::UnitTestTagNames()
20+
: WsjcppUnitTestBase("UnitTestTagNames") {
21+
}
22+
23+
// ---------------------------------------------------------------------
24+
25+
bool UnitTestTagNames::doBeforeTest() {
26+
// do something before test
27+
return true;
28+
}
29+
30+
// ---------------------------------------------------------------------
31+
32+
void UnitTestTagNames::executeTest() {
33+
34+
std::string sTestYaml = "./test10: one";
35+
WsjcppYaml yaml;
36+
std::string sError;
37+
// wrong
38+
compare("wrong name", yaml.loadFromString("wrong name", "./test10: one", sError), false);
39+
compare("name use quotes", yaml.loadFromString("name use quotes", "\"./test10\": one", sError), true);
40+
41+
}
42+
43+
// ---------------------------------------------------------------------
44+
45+
bool UnitTestTagNames::doAfterTest() {
46+
// do somethig after test
47+
return true;
48+
}
49+
50+

wsjcpp.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,5 @@ unit-tests:
6363
description: ""
6464
- name: "Cursor"
6565
description: ""
66+
- name: "TagNames"
67+
description: ""

0 commit comments

Comments
 (0)