Skip to content

Commit ae71879

Browse files
committed
Merge pull request #179 from cdunn2001/drop-null
Fix failures for `allowDroppedNullPlaceholders`.
2 parents 30d923f + 7b3683c commit ae71879

File tree

2 files changed

+160
-4
lines changed

2 files changed

+160
-4
lines changed

src/lib_json/json_reader.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,8 @@ bool Reader::readValue() {
200200
}
201201
break;
202202
case tokenArraySeparator:
203+
case tokenObjectEnd:
204+
case tokenArrayEnd:
203205
if (features_.allowDroppedNullPlaceholders_) {
204206
// "Un-read" the current token and mark the current value as a null
205207
// token.
@@ -209,8 +211,7 @@ bool Reader::readValue() {
209211
currentValue().setOffsetStart(current_ - begin_ - 1);
210212
currentValue().setOffsetLimit(current_ - begin_);
211213
break;
212-
}
213-
// Else, fall through...
214+
} // Else, fall through...
214215
default:
215216
currentValue().setOffsetStart(token.start_ - begin_);
216217
currentValue().setOffsetLimit(token.end_ - begin_);
@@ -1160,6 +1161,8 @@ bool OurReader::readValue() {
11601161
}
11611162
break;
11621163
case tokenArraySeparator:
1164+
case tokenObjectEnd:
1165+
case tokenArrayEnd:
11631166
if (features_.allowDroppedNullPlaceholders_) {
11641167
// "Un-read" the current token and mark the current value as a null
11651168
// token.
@@ -1169,8 +1172,7 @@ bool OurReader::readValue() {
11691172
currentValue().setOffsetStart(current_ - begin_ - 1);
11701173
currentValue().setOffsetLimit(current_ - begin_);
11711174
break;
1172-
}
1173-
// Else, fall through...
1175+
} // else, fall through ...
11741176
default:
11751177
currentValue().setOffsetStart(token.start_ - begin_);
11761178
currentValue().setOffsetLimit(token.end_ - begin_);

src/test_lib_json/main.cpp

+154
Original file line numberDiff line numberDiff line change
@@ -1862,6 +1862,158 @@ JSONTEST_FIXTURE(CharReaderFailIfExtraTest, commentAfterBool) {
18621862
delete reader;
18631863
}
18641864

1865+
struct CharReaderAllowDropNullTest : JsonTest::TestCase {};
1866+
1867+
JSONTEST_FIXTURE(CharReaderAllowDropNullTest, issue178) {
1868+
Json::CharReaderBuilder b;
1869+
b.settings_["allowDroppedNullPlaceholders"] = true;
1870+
Json::Value root;
1871+
std::string errs;
1872+
Json::CharReader* reader(b.newCharReader());
1873+
{
1874+
char const doc[] = "{\"a\":,\"b\":true}";
1875+
bool ok = reader->parse(
1876+
doc, doc + std::strlen(doc),
1877+
&root, &errs);
1878+
JSONTEST_ASSERT(ok);
1879+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1880+
JSONTEST_ASSERT_EQUAL(2u, root.size());
1881+
JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
1882+
}
1883+
{
1884+
char const doc[] = "{\"a\":}";
1885+
bool ok = reader->parse(
1886+
doc, doc + std::strlen(doc),
1887+
&root, &errs);
1888+
JSONTEST_ASSERT(ok);
1889+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1890+
JSONTEST_ASSERT_EQUAL(1u, root.size());
1891+
JSONTEST_ASSERT_EQUAL(Json::nullValue, root.get("a", true));
1892+
}
1893+
{
1894+
char const doc[] = "[]";
1895+
bool ok = reader->parse(
1896+
doc, doc + std::strlen(doc),
1897+
&root, &errs);
1898+
JSONTEST_ASSERT(ok);
1899+
JSONTEST_ASSERT(errs == "");
1900+
JSONTEST_ASSERT_EQUAL(0u, root.size());
1901+
JSONTEST_ASSERT_EQUAL(Json::arrayValue, root);
1902+
}
1903+
{
1904+
char const doc[] = "[null]";
1905+
bool ok = reader->parse(
1906+
doc, doc + std::strlen(doc),
1907+
&root, &errs);
1908+
JSONTEST_ASSERT(ok);
1909+
JSONTEST_ASSERT(errs == "");
1910+
JSONTEST_ASSERT_EQUAL(1u, root.size());
1911+
}
1912+
{
1913+
char const doc[] = "[,]";
1914+
bool ok = reader->parse(
1915+
doc, doc + std::strlen(doc),
1916+
&root, &errs);
1917+
JSONTEST_ASSERT(ok);
1918+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1919+
JSONTEST_ASSERT_EQUAL(2u, root.size());
1920+
}
1921+
{
1922+
char const doc[] = "[,,,]";
1923+
bool ok = reader->parse(
1924+
doc, doc + std::strlen(doc),
1925+
&root, &errs);
1926+
JSONTEST_ASSERT(ok);
1927+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1928+
JSONTEST_ASSERT_EQUAL(4u, root.size());
1929+
}
1930+
{
1931+
char const doc[] = "[null,]";
1932+
bool ok = reader->parse(
1933+
doc, doc + std::strlen(doc),
1934+
&root, &errs);
1935+
JSONTEST_ASSERT(ok);
1936+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1937+
JSONTEST_ASSERT_EQUAL(2u, root.size());
1938+
}
1939+
{
1940+
char const doc[] = "[,null]";
1941+
bool ok = reader->parse(
1942+
doc, doc + std::strlen(doc),
1943+
&root, &errs);
1944+
JSONTEST_ASSERT(ok);
1945+
JSONTEST_ASSERT(errs == "");
1946+
JSONTEST_ASSERT_EQUAL(2u, root.size());
1947+
}
1948+
{
1949+
char const doc[] = "[,,]";
1950+
bool ok = reader->parse(
1951+
doc, doc + std::strlen(doc),
1952+
&root, &errs);
1953+
JSONTEST_ASSERT(ok);
1954+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1955+
JSONTEST_ASSERT_EQUAL(3u, root.size());
1956+
}
1957+
{
1958+
char const doc[] = "[null,,]";
1959+
bool ok = reader->parse(
1960+
doc, doc + std::strlen(doc),
1961+
&root, &errs);
1962+
JSONTEST_ASSERT(ok);
1963+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1964+
JSONTEST_ASSERT_EQUAL(3u, root.size());
1965+
}
1966+
{
1967+
char const doc[] = "[,null,]";
1968+
bool ok = reader->parse(
1969+
doc, doc + std::strlen(doc),
1970+
&root, &errs);
1971+
JSONTEST_ASSERT(ok);
1972+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1973+
JSONTEST_ASSERT_EQUAL(3u, root.size());
1974+
}
1975+
{
1976+
char const doc[] = "[,,null]";
1977+
bool ok = reader->parse(
1978+
doc, doc + std::strlen(doc),
1979+
&root, &errs);
1980+
JSONTEST_ASSERT(ok);
1981+
JSONTEST_ASSERT(errs == "");
1982+
JSONTEST_ASSERT_EQUAL(3u, root.size());
1983+
}
1984+
{
1985+
char const doc[] = "[[],,,]";
1986+
bool ok = reader->parse(
1987+
doc, doc + std::strlen(doc),
1988+
&root, &errs);
1989+
JSONTEST_ASSERT(ok);
1990+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
1991+
JSONTEST_ASSERT_EQUAL(4u, root.size());
1992+
JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[0u]);
1993+
}
1994+
{
1995+
char const doc[] = "[,[],,]";
1996+
bool ok = reader->parse(
1997+
doc, doc + std::strlen(doc),
1998+
&root, &errs);
1999+
JSONTEST_ASSERT(ok);
2000+
JSONTEST_ASSERT_STRING_EQUAL("", errs);
2001+
JSONTEST_ASSERT_EQUAL(4u, root.size());
2002+
JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[1u]);
2003+
}
2004+
{
2005+
char const doc[] = "[,,,[]]";
2006+
bool ok = reader->parse(
2007+
doc, doc + std::strlen(doc),
2008+
&root, &errs);
2009+
JSONTEST_ASSERT(ok);
2010+
JSONTEST_ASSERT(errs == "");
2011+
JSONTEST_ASSERT_EQUAL(4u, root.size());
2012+
JSONTEST_ASSERT_EQUAL(Json::arrayValue, root[3u]);
2013+
}
2014+
delete reader;
2015+
}
2016+
18652017
struct IteratorTest : JsonTest::TestCase {};
18662018

18672019
JSONTEST_FIXTURE(IteratorTest, distance) {
@@ -1925,6 +2077,8 @@ int main(int argc, const char* argv[]) {
19252077
JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterArray);
19262078
JSONTEST_REGISTER_FIXTURE(runner, CharReaderFailIfExtraTest, commentAfterBool);
19272079

2080+
JSONTEST_REGISTER_FIXTURE(runner, CharReaderAllowDropNullTest, issue178);
2081+
19282082
JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
19292083

19302084
return runner.runCommandLine(argc, argv);

0 commit comments

Comments
 (0)