|
@@ -993,6 +993,40 @@ TEST(Element, preprocessor) {
|
|
|
EXPECT_THROW(Element::fromJSON(dbl_tail_comment), JSONError);
|
|
|
}
|
|
|
|
|
|
+// This test checks whether positions are stored properly is possible to ignore comments. It also checks
|
|
|
+// that the comments are ignored only when told to.
|
|
|
+TEST(Element, preprocessorLocation) {
|
|
|
+
|
|
|
+ string commented = "# this is a comment, ignore me\n"
|
|
|
+ "{ \"a\": 1,\n"
|
|
|
+ "# this is a comment, ignore me\n"
|
|
|
+ " \"b\": 2}\n"
|
|
|
+ "# this is a comment, ignore me\n";
|
|
|
+
|
|
|
+ // This is what we expect in all cases.
|
|
|
+ ElementPtr exp = Element::fromJSON(commented);
|
|
|
+
|
|
|
+ // Let's convert them all and see that the result it the same every time
|
|
|
+ ElementPtr a = cfg->get("a");
|
|
|
+ ElementPtr b = cfg->get("b");
|
|
|
+ EXPECT_RQ(
|
|
|
+ EXPECT_TRUE(exp->equals(*Element::fromJSON(head_comment, true)));
|
|
|
+ EXPECT_TRUE(exp->equals(*Element::fromJSON(mid_comment, true)));
|
|
|
+ EXPECT_TRUE(exp->equals(*Element::fromJSON(tail_comment, true)));
|
|
|
+ EXPECT_TRUE(exp->equals(*Element::fromJSON(dbl_head_comment, true)));
|
|
|
+ EXPECT_TRUE(exp->equals(*Element::fromJSON(dbl_mid_comment, true)));
|
|
|
+ EXPECT_TRUE(exp->equals(*Element::fromJSON(dbl_tail_comment, true)));
|
|
|
+
|
|
|
+ // With preprocessing disabled, it should fail all around
|
|
|
+ EXPECT_THROW(Element::fromJSON(head_comment), JSONError);
|
|
|
+ EXPECT_THROW(Element::fromJSON(mid_comment), JSONError);
|
|
|
+ EXPECT_THROW(Element::fromJSON(tail_comment), JSONError);
|
|
|
+ EXPECT_THROW(Element::fromJSON(dbl_head_comment), JSONError);
|
|
|
+ EXPECT_THROW(Element::fromJSON(dbl_mid_comment), JSONError);
|
|
|
+ EXPECT_THROW(Element::fromJSON(dbl_tail_comment), JSONError);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
TEST(Element, getPosition) {
|
|
|
std::istringstream ss("{\n"
|
|
|
" \"a\": 2,\n"
|
|
@@ -1087,4 +1121,59 @@ TEST(Element, getPosition) {
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+// Tests whether position is returned properly for a commented input JSON text.
|
|
|
+TEST(Element, getPositionCommented) {
|
|
|
+ std::istringstream ss("{\n"
|
|
|
+ " \"a\": 2,\n"
|
|
|
+ "# comment\n"
|
|
|
+ " \"cy\": \"a string\",\n"
|
|
|
+ " \"dyz\": {\n"
|
|
|
+ "# another comment\n"
|
|
|
+ " \"e\": 3,\n"
|
|
|
+ " \"f\": null\n"
|
|
|
+ "\n"
|
|
|
+ " } }\n");
|
|
|
+
|
|
|
+ // Create a JSON string holding different type of values. Some of the
|
|
|
+ // values in the config string are not aligned, so as we can check that
|
|
|
+ // the position is set correctly for the elements.
|
|
|
+ ElementPtr top = Element::fromJSON(ss, "kea.conf");
|
|
|
+ ASSERT_TRUE(top);
|
|
|
+
|
|
|
+ // Element "a"
|
|
|
+ ConstElementPtr level1_el = top->get("a");
|
|
|
+ ASSERT_TRUE(level1_el);
|
|
|
+ EXPECT_EQ(2, level1_el->getPosition().line_);
|
|
|
+ EXPECT_EQ(11, level1_el->getPosition().pos_);
|
|
|
+ EXPECT_EQ("kea.conf", level1_el->getPosition().file_);
|
|
|
+
|
|
|
+ // Element "cy"
|
|
|
+ level1_el = top->get("cy");
|
|
|
+ ASSERT_TRUE(level1_el);
|
|
|
+ EXPECT_EQ(4, level1_el->getPosition().line_);
|
|
|
+ EXPECT_EQ(11, level1_el->getPosition().pos_);
|
|
|
+ EXPECT_EQ("kea.conf", level1_el->getPosition().file_);
|
|
|
+
|
|
|
+ // Element "dyz"
|
|
|
+ level1_el = top->get("dyz");
|
|
|
+ ASSERT_TRUE(level1_el);
|
|
|
+ EXPECT_EQ(5, level1_el->getPosition().line_);
|
|
|
+ EXPECT_EQ(13, level1_el->getPosition().pos_);
|
|
|
+ EXPECT_EQ("kea.conf", level1_el->getPosition().file_);
|
|
|
+
|
|
|
+ // Element "e" is a sub element of "dyz".
|
|
|
+ ConstElementPtr level2_el = level1_el->get("e");
|
|
|
+ ASSERT_TRUE(level2_el);
|
|
|
+ EXPECT_EQ(7, level2_el->getPosition().line_);
|
|
|
+ EXPECT_EQ(12, level2_el->getPosition().pos_);
|
|
|
+ EXPECT_EQ("kea.conf", level2_el->getPosition().file_);
|
|
|
+
|
|
|
+ // Element "f" is also a sub element of "dyz"
|
|
|
+ level2_el = level1_el->get("f");
|
|
|
+ ASSERT_TRUE(level2_el);
|
|
|
+ EXPECT_EQ(8, level2_el->getPosition().line_);
|
|
|
+ EXPECT_EQ(14, level2_el->getPosition().pos_);
|
|
|
+ EXPECT_EQ("kea.conf", level2_el->getPosition().file_);
|
|
|
+}
|
|
|
}
|