Browse Source

reversed c1131

master
Artyom Beilis 14 years ago
parent
commit
7d8ebc96c4
2 changed files with 41 additions and 22 deletions
  1. +29
    -5
      json.cpp
  2. +12
    -17
      tests/json_test.cpp

+ 29
- 5
json.cpp View File

@@ -781,7 +781,7 @@ namespace json {

typedef enum {
st_init = 0,
st_object_or_array_expected = 0 ,
st_object_or_array_or_value_expected = 0 ,
st_object_key_or_close_expected,
st_object_colon_expected,
st_object_value_expected,
@@ -796,7 +796,7 @@ namespace json {
std::ostream &operator<<(std::ostream &out,state_type t)
{
static char const *names[] = {
"st_object_or_array_expected",
"st_object_or_array_or_value_expected",
"st_object_key_or_close_expected",
"st_object_colon_expected",
"st_object_value_expected",
@@ -816,8 +816,7 @@ namespace json {
tockenizer tock(in);
value result;
// RFC 4627 JSON is Object or Array, value is not allowed
state_type state=st_object_or_array_expected;
state_type state=st_init;
std::string key;

@@ -833,7 +832,7 @@ namespace json {
#endif

switch(state) {
case st_object_or_array_expected:
case st_object_or_array_or_value_expected:
if(c=='[') {
*stack.top().second=json::array();
state=st_array_value_or_close_expected;
@@ -842,6 +841,31 @@ namespace json {
*stack.top().second=json::object();
state=st_object_key_or_close_expected;
}
else if(c==tock_str) {
*stack.top().second=tock.str;
state=stack.top().first;
stack.pop();
}
else if(c==tock_true) {
*stack.top().second=true;
state=stack.top().first;
stack.pop();
}
else if(c==tock_false) {
*stack.top().second=false;
state=stack.top().first;
stack.pop();
}
else if(c==tock_null) {
*stack.top().second=null();
state=stack.top().first;
stack.pop();
}
else if(c==tock_number) {
*stack.top().second=tock.real;
state=stack.top().first;
stack.pop();
}
else
state = st_error;
break;


+ 12
- 17
tests/json_test.cpp View File

@@ -101,16 +101,11 @@ int main()
TEST(v.get<int>("x.y.z")==10);
TEST(parse("[]")==json::array());
TEST(parse("{}")==json::object());
THROWS(parse("true"));
THROWS(parse("false"));
THROWS(parse("10"));
THROWS(parse("\"hello\""));
THROWS(parse("null"));
TEST(parse("[true]")[0]==json::value(true));
TEST(parse("[false]")[0]==json::value(false));
TEST(parse("[10]")[0]==json::value(10));
TEST(parse("[\"hello\"]")[0]==json::value("hello"));
TEST(parse("[null]")[0]==json::null());
TEST(parse("true")==json::value(true));
TEST(parse("false")==json::value(false));
TEST(parse("10")==json::value(10));
TEST(parse("\"hello\"")==json::value("hello"));
TEST(parse("null")==json::null());
char const *s=
"{ \"t\" : [{},{},{},{ \"x\":1},[]],\"x\" : { \"o\" : { \"test\" : [ 10,20,true ], \"post\" : 13.01 }, \"yes\" : \"\\u05d0א\" }}";
v=parse(s);
@@ -124,13 +119,13 @@ int main()
TEST(v.type("x")==json::is_object);
TEST(v.get<std::string>("x.yes")=="אא");
// Test correct handing of surrogates
THROWS(parse("[\"\\ud834\"]"));
THROWS(parse("[\"\\udd1e\"]"));
THROWS(parse("[\"\\ud834 \\udd1e\"]"));
TEST(parse("[\"\\u05d0\\ud834\\udd1e x\"]")[0]=="א\xf0\x9d\x84\x9e x");
THROWS(parse("[\"\xFF\xFF\"]")); // Invalid UTF-8
TEST(parse("[\"\\u05d0 x\"]")[0]=="א x"); // Correct read of 4 bytes
THROWS(parse("[\"\\u05dx x\"]")); // Correct read of 4 bytes
THROWS(parse("\"\\ud834\""));
THROWS(parse("\"\\udd1e\""));
THROWS(parse("\"\\ud834 \\udd1e\""));
TEST(parse("\"\\u05d0\\ud834\\udd1e x\"")=="א\xf0\x9d\x84\x9e x");
THROWS(parse("\"\xFF\xFF\"")); // Invalid UTF-8
TEST(parse("\"\\u05d0 x\"")=="א x"); // Correct read of 4 bytes
THROWS(parse("\"\\u05dx x\"")); // Correct read of 4 bytes
TEST(parse("[//Hello\n]")==json::array());
TEST(format("test")=="\"test\"");
TEST(format(10)=="10");


Loading…
Cancel
Save