summaryrefslogtreecommitdiffstats
path: root/base/json
diff options
context:
space:
mode:
authorzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-13 00:14:15 +0000
committerzelidrag@chromium.org <zelidrag@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-13 00:14:15 +0000
commit038cf35cb46df9ef18abb976f53ca8c259e89979 (patch)
treebfb6df165a2746b8be8b04a2718c7bf8549d72f1 /base/json
parent3863d40647b218dc51127754ae0b24749781fea9 (diff)
downloadchromium_src-038cf35cb46df9ef18abb976f53ca8c259e89979.zip
chromium_src-038cf35cb46df9ef18abb976f53ca8c259e89979.tar.gz
chromium_src-038cf35cb46df9ef18abb976f53ca8c259e89979.tar.bz2
JSONValueConverter changes for custom base::Value filed parsing.
chanegs approved in http://codereview.chromium.org/10006023/ BUG=chromium-os:29052 TEST=JSONValueConverterTest.* TBR=willchan Review URL: https://chromiumcodereview.appspot.com/10066031 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132101 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/json')
-rw-r--r--base/json/json_value_converter.h30
-rw-r--r--base/json/json_value_converter_unittest.cc17
2 files changed, 46 insertions, 1 deletions
diff --git a/base/json/json_value_converter.h b/base/json/json_value_converter.h
index 7764632..d296b66 100644
--- a/base/json/json_value_converter.h
+++ b/base/json/json_value_converter.h
@@ -205,6 +205,25 @@ class BasicValueConverter<bool> : public ValueConverter<bool> {
};
template <typename FieldType>
+class ValueFieldConverter : public ValueConverter<FieldType> {
+ public:
+ typedef bool(*ConvertFunc)(const base::Value* value, FieldType* field);
+
+ ValueFieldConverter(ConvertFunc convert_func)
+ : convert_func_(convert_func) {}
+
+ virtual bool Convert(const base::Value& value,
+ FieldType* field) const OVERRIDE {
+ return convert_func_(&value, field);
+ }
+
+ private:
+ ConvertFunc convert_func_;
+
+ DISALLOW_COPY_AND_ASSIGN(ValueFieldConverter);
+};
+
+template <typename FieldType>
class CustomFieldConverter : public ValueConverter<FieldType> {
public:
typedef bool(*ConvertFunc)(const StringPiece& value, FieldType* field);
@@ -368,6 +387,17 @@ class JSONValueConverter {
new internal::CustomFieldConverter<FieldType>(convert_func)));
}
+ template <typename FieldType>
+ void RegisterCustomValueField(
+ const std::string& field_name,
+ FieldType StructType::* field,
+ bool (*convert_func)(const base::Value*, FieldType*)) {
+ fields_.push_back(new internal::FieldConverter<StructType, FieldType>(
+ field_name,
+ field,
+ new internal::ValueFieldConverter<FieldType>(convert_func)));
+ }
+
void RegisterRepeatedInt(const std::string& field_name,
ScopedVector<int> StructType::* field) {
fields_.push_back(
diff --git a/base/json/json_value_converter_unittest.cc b/base/json/json_value_converter_unittest.cc
index 46b06ed..120dd48 100644
--- a/base/json/json_value_converter_unittest.cc
+++ b/base/json/json_value_converter_unittest.cc
@@ -25,9 +25,10 @@ struct SimpleMessage {
int foo;
std::string bar;
bool baz;
+ bool bstruct;
SimpleEnum simple_enum;
ScopedVector<int> ints;
- SimpleMessage() : foo(0), baz(false) {}
+ SimpleMessage() : foo(0), baz(false), bstruct(false) {}
static bool ParseSimpleEnum(const StringPiece& value, SimpleEnum* field) {
if (value == "foo") {
@@ -40,6 +41,11 @@ struct SimpleMessage {
return false;
}
+ static bool HasFieldPresent(const base::Value* value, bool* result) {
+ *result = value != NULL;
+ return true;
+ }
+
static void RegisterJSONConverter(
base::JSONValueConverter<SimpleMessage>* converter) {
converter->RegisterIntField("foo", &SimpleMessage::foo);
@@ -48,6 +54,9 @@ struct SimpleMessage {
converter->RegisterCustomField<SimpleEnum>(
"simple_enum", &SimpleMessage::simple_enum, &ParseSimpleEnum);
converter->RegisterRepeatedInt("ints", &SimpleMessage::ints);
+ converter->RegisterCustomValueField<bool>("bstruct",
+ &SimpleMessage::bstruct,
+ &HasFieldPresent);
}
};
@@ -75,6 +84,7 @@ TEST(JSONValueConverterTest, ParseSimpleMessage) {
" \"foo\": 1,\n"
" \"bar\": \"bar\",\n"
" \"baz\": true,\n"
+ " \"bstruct\": {},\n"
" \"simple_enum\": \"foo\","
" \"ints\": [1, 2]"
"}\n";
@@ -100,11 +110,13 @@ TEST(JSONValueConverterTest, ParseNestedMessage) {
" \"child\": {\n"
" \"foo\": 1,\n"
" \"bar\": \"bar\",\n"
+ " \"bstruct\": {},\n"
" \"baz\": true\n"
" },\n"
" \"children\": [{\n"
" \"foo\": 2,\n"
" \"bar\": \"foobar\",\n"
+ " \"bstruct\": \"\",\n"
" \"baz\": true\n"
" },\n"
" {\n"
@@ -123,6 +135,7 @@ TEST(JSONValueConverterTest, ParseNestedMessage) {
EXPECT_EQ(1, message.child.foo);
EXPECT_EQ("bar", message.child.bar);
EXPECT_TRUE(message.child.baz);
+ EXPECT_TRUE(message.child.bstruct);
EXPECT_EQ(2, static_cast<int>(message.children.size()));
const SimpleMessage* first_child = message.children[0];
@@ -130,12 +143,14 @@ TEST(JSONValueConverterTest, ParseNestedMessage) {
EXPECT_EQ(2, first_child->foo);
EXPECT_EQ("foobar", first_child->bar);
EXPECT_TRUE(first_child->baz);
+ EXPECT_TRUE(first_child->bstruct);
const SimpleMessage* second_child = message.children[1];
ASSERT_TRUE(second_child);
EXPECT_EQ(3, second_child->foo);
EXPECT_EQ("barbaz", second_child->bar);
EXPECT_FALSE(second_child->baz);
+ EXPECT_FALSE(second_child->bstruct);
}
TEST(JSONValueConverterTest, ParseFailures) {