added test of json reader

pull/87/head
Falk Werner 4 years ago
parent 860757ea4c
commit fa5f272e53

@ -22,7 +22,7 @@ wf_impl_json_reader_skip_whitespace(
struct wf_json_reader * reader)
{
char c = wf_impl_json_reader_peek(reader);
if ((' ' == c) || ('\n' == c) || ('\t' == c) || ('\r' == c))
while ((' ' == c) || ('\n' == c) || ('\t' == c) || ('\r' == c))
{
reader->pos++;
c = wf_impl_json_reader_peek(reader);
@ -126,7 +126,7 @@ wf_impl_json_reader_read_string(
size_t p = reader->pos;
*value = &(reader->contents[p]);
c = wf_impl_json_reader_get_char(reader);
while (('\"' != c) && ('\"' != c))
while (('\"' != c) && ('\0' != c))
{
if ('\\' != c)
{
@ -135,7 +135,7 @@ wf_impl_json_reader_read_string(
else
{
char unescaped = wf_impl_json_unescape(wf_impl_json_reader_get_char(reader));
if ('\0' != c)
if ('\0' != unescaped)
{
reader->contents[p++] = unescaped;

@ -124,6 +124,7 @@ alltests = executable('alltests',
'test/webfuse/json/test_writer.cc',
'test/webfuse/json/test_doc.cc',
'test/webfuse/json/test_node.cc',
'test/webfuse/json/test_reader.cc',
'test/webfuse/jsonrpc/mock_timer_callback.cc',
'test/webfuse/jsonrpc/mock_timer.cc',
'test/webfuse/jsonrpc/test_is_request.cc',

@ -0,0 +1,207 @@
#include "webfuse/impl/json/reader.h"
#include <gtest/gtest.h>
#include <climits>
TEST(json_reader, skip_whitespace)
{
char text[] = " \t\r\n*";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 5);
char c = wf_impl_json_reader_skip_whitespace(&reader);
ASSERT_EQ('*', c);
ASSERT_STREQ("*", &reader.contents[reader.pos]);
}
TEST(json_reader, skip_whitespace_eof)
{
char text[] = " ";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 1);
char c = wf_impl_json_reader_skip_whitespace(&reader);
ASSERT_EQ('\0', c);
}
TEST(json_reader, peek)
{
char text[] = "*";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 1);
char c = wf_impl_json_reader_peek(&reader);
ASSERT_EQ('*', c);
}
TEST(json_reader, peek_eof)
{
wf_json_reader reader;
wf_impl_json_reader_init(&reader, nullptr, 0);
char c = wf_impl_json_reader_peek(&reader);
ASSERT_EQ('\0', c);
}
TEST(json_reader, get_char)
{
char text[] = "*";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 1);
ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader));
ASSERT_EQ('\0', wf_impl_json_reader_get_char(&reader));
ASSERT_EQ('\0', wf_impl_json_reader_get_char(&reader));
}
TEST(json_reader, unget_char)
{
char text[] = "*";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 1);
ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader));
wf_impl_json_reader_unget_char(&reader);
ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader));
wf_impl_json_reader_unget_char(&reader);
wf_impl_json_reader_unget_char(&reader);
ASSERT_EQ('*', wf_impl_json_reader_get_char(&reader));
}
TEST(json_reader, read_const)
{
char text[] = "value";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 5);
ASSERT_TRUE(wf_impl_json_reader_read_const(&reader, "value", 5));
}
TEST(json_reader, read_const_fail_out_of_bounds)
{
char text[] = "value";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 2);
ASSERT_FALSE(wf_impl_json_reader_read_const(&reader, "value", 5));
}
TEST(json_reader, read_const_fail_no_match)
{
char text[] = "hello";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 5);
ASSERT_FALSE(wf_impl_json_reader_read_const(&reader, "value", 5));
}
TEST(json_reader, read_positive_int)
{
char text[] = "42";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 5);
int value;
ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value));
ASSERT_EQ(42, value);
}
TEST(json_reader, read_negative_int)
{
char text[] = "-1234";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, text, 5);
int value;
ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value));
ASSERT_EQ(-1234, value);
}
TEST(json_reader, read_int_max)
{
std::string text = std::to_string(INT_MAX);
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
int value;
ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value));
ASSERT_EQ(INT_MAX, value);
}
TEST(json_reader, read_int_min)
{
std::string text = std::to_string(INT_MIN);
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
int value;
ASSERT_TRUE(wf_impl_json_reader_read_int(&reader, &value));
ASSERT_EQ(INT_MIN, value);
}
TEST(json_reader, read_int_fail_invalid)
{
std::string text = "brummni";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
int value;
ASSERT_FALSE(wf_impl_json_reader_read_int(&reader, &value));
}
TEST(json_reader, read_int_fail_sign_only)
{
std::string text = "-";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
int value;
ASSERT_FALSE(wf_impl_json_reader_read_int(&reader, &value));
}
TEST(json_reader, read_string)
{
std::string text = "\"brummni\"";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
char * value;
ASSERT_TRUE(wf_impl_json_reader_read_string(&reader, &value));
ASSERT_STREQ("brummni", value);
}
TEST(json_reader, read_string_escaped)
{
std::string text = "\"_\\\"_\\\\_\\/_\\b_\\f_\\n_\\r_\\t_\"";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
char * value;
ASSERT_TRUE(wf_impl_json_reader_read_string(&reader, &value));
ASSERT_STREQ("_\"_\\_/_\b_\f_\n_\r_\t_", value);
}
TEST(json_reader, read_string_fail_missig_start_quot)
{
std::string text = "brummni\"";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
char * value;
ASSERT_FALSE(wf_impl_json_reader_read_string(&reader, &value));
}
TEST(json_reader, read_string_fail_missig_end_quot)
{
std::string text = "\"brummni";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
char * value;
ASSERT_FALSE(wf_impl_json_reader_read_string(&reader, &value));
}
TEST(json_reader, read_string_fail_invalid_escape_seq)
{
std::string text = "\"\\i\"";
wf_json_reader reader;
wf_impl_json_reader_init(&reader, const_cast<char*>(text.data()), text.size());
char * value;
ASSERT_FALSE(wf_impl_json_reader_read_string(&reader, &value));
}
Loading…
Cancel
Save