Skip to content

Commit 1c2e767

Browse files
authored
Fix YAML::Newline in a sequence or map.
Inside of a sequence or map, `YAML::Newline` wouldn't reset the collection state, which would cause behavior like this: ``` nodeA: k: [{i: 0}, {i:1}, ]NodeB: k: [{i: 0}, {i:1}, ] ```
1 parent 3f381f1 commit 1c2e767

File tree

2 files changed

+221
-0
lines changed

2 files changed

+221
-0
lines changed

src/emitterstate.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,9 @@ void EmitterState::EndedGroup(GroupType::value type) {
179179
m_globalModifiedSettings.restore();
180180

181181
ClearModifiedSettings();
182+
m_hasAnchor = false;
183+
m_hasTag = false;
184+
m_hasNonContent = false;
182185
}
183186

184187
EmitterNodeType::value EmitterState::CurGroupNodeType() const {

test/integration/emitter_test.cpp

Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,224 @@ TEST_F(EmitterTest, NaN) {
12511251
"bar: .nan");
12521252
}
12531253

1254+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapWithNewLine) {
1255+
out << YAML::BeginMap;
1256+
1257+
out << YAML::Key << "NodeA" << YAML::Value << YAML::BeginMap;
1258+
out << YAML::Key << "k" << YAML::Value << YAML::Flow << YAML::BeginSeq;
1259+
out << YAML::BeginMap << YAML::Key << "i" << YAML::Value << 0 << YAML::EndMap
1260+
<< YAML::Newline;
1261+
out << YAML::BeginMap << YAML::Key << "i" << YAML::Value << 1 << YAML::EndMap
1262+
<< YAML::Newline;
1263+
out << YAML::EndSeq;
1264+
out << YAML::EndMap;
1265+
1266+
out << YAML::Key << "NodeB" << YAML::Value << YAML::BeginMap;
1267+
out << YAML::Key << "k" << YAML::Value << YAML::Flow << YAML::BeginSeq;
1268+
out << YAML::BeginMap << YAML::Key << "i" << YAML::Value << 0 << YAML::EndMap
1269+
<< YAML::Newline;
1270+
out << YAML::BeginMap << YAML::Key << "i" << YAML::Value << 1 << YAML::EndMap
1271+
<< YAML::Newline;
1272+
out << YAML::EndSeq;
1273+
out << YAML::EndMap;
1274+
1275+
out << YAML::EndMap;
1276+
1277+
ExpectEmit(R"(NodeA:
1278+
k: [{i: 0},
1279+
{i: 1},
1280+
]
1281+
NodeB:
1282+
k: [{i: 0},
1283+
{i: 1},
1284+
])");
1285+
}
1286+
1287+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapWithNewLineUsingAliases) {
1288+
out << BeginMap;
1289+
1290+
out << Key << "Node" << Anchor("Node") << Value << BeginMap;
1291+
out << Key << "k" << Value << Flow << BeginSeq;
1292+
out << BeginMap << Key << "i" << Value << 0 << EndMap;
1293+
out << YAML::Newline;
1294+
out << BeginMap << Key << "i" << Value << 1 << EndMap;
1295+
out << YAML::Newline;
1296+
out << EndSeq << EndMap;
1297+
1298+
out << Key << "NodeA" << Alias("Node");
1299+
out << Key << "NodeB" << Alias("Node");
1300+
1301+
out << EndMap;
1302+
1303+
ExpectEmit(R"(Node: &Node
1304+
k: [{i: 0},
1305+
{i: 1},
1306+
]
1307+
NodeA: *Node
1308+
NodeB: *Node)");
1309+
}
1310+
1311+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapUsingAliases) {
1312+
out << BeginMap;
1313+
1314+
out << Key << "Node" << Anchor("Node") << Value << BeginMap;
1315+
out << Key << "k" << Value << Flow << BeginSeq;
1316+
out << BeginMap << Key << "i" << Value << 0 << EndMap;
1317+
out << BeginMap << Key << "i" << Value << 1 << EndMap;
1318+
out << EndSeq << EndMap;
1319+
1320+
out << Key << "NodeA" << Alias("Node");
1321+
out << Key << "NodeB" << Alias("Node");
1322+
1323+
out << EndMap;
1324+
1325+
ExpectEmit(R"(Node: &Node
1326+
k: [{i: 0}, {i: 1}]
1327+
NodeA: *Node
1328+
NodeB: *Node)");
1329+
}
1330+
1331+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapWithNewLineUsingAliases2) {
1332+
out << BeginMap;
1333+
1334+
out << Key << "Seq" << Anchor("Seq") << Flow << BeginSeq;
1335+
out << BeginMap << Key << "i" << Value << 0 << EndMap;
1336+
out << YAML::Newline;
1337+
out << BeginMap << Key << "i" << Value << 1 << EndMap;
1338+
out << YAML::Newline;
1339+
out << EndSeq;
1340+
1341+
out << Key << "NodeA" << Value << BeginMap;
1342+
out << Key << "k" << Value << Alias("Seq") << EndMap;
1343+
out << Key << "NodeB" << Value << BeginMap;
1344+
out << Key << "k" << Value << Alias("Seq") << EndMap;
1345+
1346+
out << EndMap;
1347+
1348+
ExpectEmit(R"(Seq: &Seq [{i: 0},
1349+
{i: 1},
1350+
]
1351+
NodeA:
1352+
k: *Seq
1353+
NodeB:
1354+
k: *Seq)");
1355+
}
1356+
1357+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapUsingAliases2) {
1358+
out << BeginMap;
1359+
1360+
out << Key << "Seq" << Anchor("Seq") << Value << Flow << BeginSeq;
1361+
out << BeginMap << Key << "i" << Value << 0 << EndMap;
1362+
out << BeginMap << Key << "i" << Value << 1 << EndMap;
1363+
out << EndSeq;
1364+
1365+
out << Key << "NodeA" << Value << BeginMap;
1366+
out << Key << "k" << Value << Alias("Seq") << EndMap;
1367+
out << Key << "NodeB" << Value << BeginMap;
1368+
out << Key << "k" << Value << Alias("Seq") << EndMap;
1369+
1370+
out << EndMap;
1371+
1372+
ExpectEmit(R"(Seq: &Seq [{i: 0}, {i: 1}]
1373+
NodeA:
1374+
k: *Seq
1375+
NodeB:
1376+
k: *Seq)");
1377+
}
1378+
1379+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapWithNewLineUsingAliases3) {
1380+
out << BeginMap;
1381+
1382+
out << Key << "Keys" << Value << Flow << BeginSeq;
1383+
out << Anchor("k0") << BeginMap << Key << "i" << Value << 0 << EndMap
1384+
<< Newline;
1385+
out << Anchor("k1") << BeginMap << Key << "i" << Value << 1 << EndMap
1386+
<< Newline;
1387+
out << EndSeq;
1388+
1389+
out << Key << "NodeA" << Value << BeginMap;
1390+
out << Key << "k" << Value << Flow << BeginSeq;
1391+
out << Alias("k0") << Newline << Alias("k1") << Newline;
1392+
out << EndSeq << EndMap;
1393+
1394+
out << Key << "NodeB" << Value << BeginMap;
1395+
out << Key << "k" << Value << Flow << BeginSeq;
1396+
out << Alias("k0") << Newline << Alias("k1") << Newline;
1397+
out << EndSeq << EndMap;
1398+
1399+
out << EndMap;
1400+
1401+
ExpectEmit(R"(Keys: [&k0 {i: 0},
1402+
&k1 {i: 1},
1403+
]
1404+
NodeA:
1405+
k: [*k0,
1406+
*k1,
1407+
]
1408+
NodeB:
1409+
k: [*k0,
1410+
*k1,
1411+
])");
1412+
}
1413+
1414+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapUsingAliases3a) {
1415+
out << BeginMap;
1416+
1417+
out << Key << "Keys" << Value << BeginSeq;
1418+
out << Anchor("k0") << BeginMap << Key << "i" << Value << 0 << EndMap;
1419+
out << Anchor("k1") << BeginMap << Key << "i" << Value << 1 << EndMap;
1420+
out << EndSeq;
1421+
1422+
out << Key << "NodeA" << Value << BeginMap;
1423+
out << Key << "k" << Value << Flow << BeginSeq;
1424+
out << Alias("k0") << Alias("k1");
1425+
out << EndSeq << EndMap;
1426+
1427+
out << Key << "NodeB" << Value << BeginMap;
1428+
out << Key << "k" << Value << Flow << BeginSeq;
1429+
out << Alias("k0") << Alias("k1");
1430+
out << EndSeq << EndMap;
1431+
1432+
out << EndMap;
1433+
1434+
ExpectEmit(R"(Keys:
1435+
- &k0
1436+
i: 0
1437+
- &k1
1438+
i: 1
1439+
NodeA:
1440+
k: [*k0, *k1]
1441+
NodeB:
1442+
k: [*k0, *k1])");
1443+
}
1444+
1445+
TEST_F(EmitterTest, ComplexFlowSeqEmbeddingAMapUsingAliases3b) {
1446+
out << BeginMap;
1447+
1448+
out << Key << "Keys" << Value << Flow << BeginSeq;
1449+
out << Anchor("k0") << BeginMap << Key << "i" << Value << 0 << EndMap;
1450+
out << Anchor("k1") << BeginMap << Key << "i" << Value << 1 << EndMap;
1451+
out << EndSeq;
1452+
1453+
out << Key << "NodeA" << Value << BeginMap;
1454+
out << Key << "k" << Value << Flow << BeginSeq;
1455+
out << Alias("k0") << Alias("k1");
1456+
out << EndSeq << EndMap;
1457+
1458+
out << Key << "NodeB" << Value << BeginMap;
1459+
out << Key << "k" << Value << Flow << BeginSeq;
1460+
out << Alias("k0") << Alias("k1");
1461+
out << EndSeq << EndMap;
1462+
1463+
out << EndMap;
1464+
1465+
ExpectEmit(R"(Keys: [&k0 {i: 0}, &k1 {i: 1}]
1466+
NodeA:
1467+
k: [*k0, *k1]
1468+
NodeB:
1469+
k: [*k0, *k1])");
1470+
}
1471+
12541472
class EmitterErrorTest : public ::testing::Test {
12551473
protected:
12561474
void ExpectEmitError(const std::string& expectedError) {

0 commit comments

Comments
 (0)