浏览代码

Add specific tests for the JSON discarder.

Sam Jaffe 7 年之前
父节点
当前提交
4bbcf6af74
共有 3 个文件被更改,包括 78 次插入19 次删除
  1. 4 0
      json.xcodeproj/project.pbxproj
  2. 73 0
      test/json_binder_discard_test.cxx
  3. 1 19
      test/json_binder_object_test.cxx

+ 4 - 0
json.xcodeproj/project.pbxproj

@@ -26,6 +26,7 @@
 		CD6DC462219FA2420052CD08 /* json_binder_polymorphic_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD31E1E9219CE85A001C2AF1 /* json_binder_polymorphic_test.cxx */; };
 		CD6DC46421A083D40052CD08 /* json_exception.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD6DC46321A083D40052CD08 /* json_exception.cxx */; };
 		CD6DC46521A083D40052CD08 /* json_exception.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD6DC46321A083D40052CD08 /* json_exception.cxx */; };
+		CD6DC46721A0DAEF0052CD08 /* json_binder_discard_test.cxx in Sources */ = {isa = PBXBuildFile; fileRef = CD6DC46621A0DAEF0052CD08 /* json_binder_discard_test.cxx */; };
 		CDB2F7431C5D48090067C2EC /* json.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDB2F7411C5D48090067C2EC /* json.cpp */; };
 /* End PBXBuildFile section */
 
@@ -90,6 +91,7 @@
 		CD6DC44A219F8A360052CD08 /* json-direct-test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "json-direct-test.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
 		CD6DC44E219F8A360052CD08 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		CD6DC46321A083D40052CD08 /* json_exception.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = json_exception.cxx; sourceTree = "<group>"; };
+		CD6DC46621A0DAEF0052CD08 /* json_binder_discard_test.cxx */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = json_binder_discard_test.cxx; sourceTree = "<group>"; };
 		CD84C4EB1F68908F002014D3 /* json_binder_custom_test.cxx */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; indentWidth = 2; path = json_binder_custom_test.cxx; sourceTree = "<group>"; tabWidth = 2; };
 		CDB2F7331C5D47F70067C2EC /* libjson.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libjson.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
 		CDB2F7411C5D48090067C2EC /* json.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; path = json.cpp; sourceTree = "<group>"; tabWidth = 2; };
@@ -146,6 +148,7 @@
 				CD679D7C1E6273DB00F9F843 /* json_binder_value_double_test.cxx */,
 				CD2B098B1E63839A00D6D23A /* json_binder_tuple_test.cxx */,
 				CDECC7D61E65073E00BEE842 /* json_binder_object_test.cxx */,
+				CD6DC46621A0DAEF0052CD08 /* json_binder_discard_test.cxx */,
 				CDECC7D41E64E6A900BEE842 /* json_binder_collection_test.cxx */,
 				CD2B09881E6374F300D6D23A /* json_binder_terminate_test.cxx */,
 				CD84C4EB1F68908F002014D3 /* json_binder_custom_test.cxx */,
@@ -381,6 +384,7 @@
 				CD6DC45F219FA21E0052CD08 /* json_binder_collection_test.cxx in Sources */,
 				CD6DC460219FA2200052CD08 /* json_binder_terminate_test.cxx in Sources */,
 				CD6DC459219F8B210052CD08 /* json_binder_test_bool_test.cxx in Sources */,
+				CD6DC46721A0DAEF0052CD08 /* json_binder_discard_test.cxx in Sources */,
 				CD6DC45A219FA1AC0052CD08 /* json_binder_value_int_test.cxx in Sources */,
 				CD6DC45B219FA20E0052CD08 /* json_binder_value_string_test.cxx in Sources */,
 				CD6DC45D219FA2180052CD08 /* json_binder_tuple_test.cxx in Sources */,

+ 73 - 0
test/json_binder_discard_test.cxx

@@ -0,0 +1,73 @@
+//
+//  json_binder_discard_test.cpp
+//  json-direct-test
+//
+//  Created by Sam Jaffe on 11/17/18.
+//  Copyright © 2018 Sam Jaffe. All rights reserved.
+//
+
+#include "json/json_binder.hpp"
+#include <gmock/gmock.h>
+
+using namespace json::binder;
+using namespace json::parser;
+
+TEST(JsonBinderDiscardTest, ParsesLargeNumberSuccessfully) {
+  char data[] = R"(10000000000)";
+  char const * ptr = data;
+  EXPECT_NO_THROW(json::parse_discard_token(ptr));
+  EXPECT_THAT(ptr, data + strlen(data));
+  EXPECT_THAT(*ptr, '\0');
+}
+
+TEST(JsonBinderDiscardTest, ParsesObjectSuccessfully) {
+  char data[] = R"({"key": "value"})";
+  char const * ptr = data;
+  EXPECT_NO_THROW(json::parse_discard_token(ptr));
+  EXPECT_THAT(ptr, data + strlen(data));
+  EXPECT_THAT(*ptr, '\0');
+}
+
+TEST(JsonBinderDiscardTest, ParsesArraySuccessfully) {
+  char data[] = R"([ 1.0 ])";
+  char const * ptr = data;
+  EXPECT_NO_THROW(json::parse_discard_token(ptr));
+  EXPECT_THAT(ptr, data + strlen(data));
+  EXPECT_THAT(*ptr, '\0');
+}
+
+TEST(JsonBinderDiscardTest, ParsesNullSuccessfully) {
+  char data[] = R"(null)";
+  char const * ptr = data;
+  EXPECT_NO_THROW(json::parse_discard_token(ptr));
+  EXPECT_THAT(ptr, data + strlen(data));
+  EXPECT_THAT(*ptr, '\0');
+}
+
+TEST(JsonBinderDiscardTest, ThrowsOnMissingValueForKey) {
+  char data[] = R"({"key": })";
+  char const * ptr = data;
+  EXPECT_THROW(json::parse_discard_token(ptr),
+               json::malformed_json_exception);
+}
+
+TEST(JsonBinderDiscardTest, ThrowsOnMissingAssoc) {
+  char data[] = R"({"key"="value"})";
+  char const * ptr = data;
+  EXPECT_THROW(json::parse_discard_token(ptr),
+               json::malformed_json_exception);
+}
+
+TEST(JsonBinderDiscardTest, ThrowsOnMissingArrayEndToken) {
+  char data[] = R"([1.0 )";
+  char const * ptr = data;
+  EXPECT_THROW(json::parse_discard_token(ptr),
+               json::unterminated_json_exception);
+}
+
+TEST(JsonBinderDiscardTest, ThrowsOnMissingObjectEndToken) {
+  char data[] = R"({"key": "value")";
+  char const * ptr = data;
+  EXPECT_THROW(json::parse_discard_token(ptr),
+               json::unterminated_json_exception);
+}

+ 1 - 19
test/json_binder_object_test.cxx

@@ -117,25 +117,7 @@ TEST_F(JsonBinderObjectTest, ThrowsOnMissingEndToken) {
                json::unterminated_json_exception);
 }
 
-TEST_F(JsonBinderObjectTest, ThrowsOnMissingValueForKeyEvenForUnknownKey) {
-  char data[] = "{ \"count\":10, \"average\":1.0, "
-                "\"data\":{ \"key1\":[1, 2], \"key2\":[3, 4] }, "
-                "\"lemon\":{\"key\": } }";
-  TestObject out = {0, 0.0, {}};
-  EXPECT_THROW(parse(json::binder::bind(out, GetBinder()), data, allow_all),
-               json::malformed_json_exception);
-}
-
-TEST_F(JsonBinderObjectTest, ThrowsOnMissingEndTokenEvenForUnknownKey) {
-  char data[] = "{ \"count\":10, \"average\":1.0, "
-                "\"data\":{ \"key1\":[1, 2], \"key2\":[3, 4] }, "
-                "\"lemon\":[1.0 }";
-  TestObject out = {0, 0.0, {}};
-  EXPECT_THROW(parse(json::binder::bind(out, GetBinder()), data, allow_all),
-               json::unterminated_json_exception);
-}
-
-TEST_F(JsonBinderObjectTest, ThrowsOnMissingEndTokenEvenForUnknownKey2) {
+TEST_F(JsonBinderObjectTest, ThrowsOnMissingEndTokenAfterUnknownKey) {
   char data[] = "{ \"count\":10, \"average\":1.0, "
                 "\"data\":{ \"key1\":[1, 2], \"key2\":[3, 4] }, "
                 "\"lemon\":{\"key\":false }";