X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Ftest%2FDynamicConverterTest.cpp;h=1d45e67d787ad2ec9a5525c21599e47bb28a62c8;hb=e88735c87c71aaffd33d559af6aa1a1247dd253d;hp=47e87dc078ed6de254306f17836cdd3482523676;hpb=333ed393c83190fc6935837c3e61e4f9bc38e2bc;p=folly.git diff --git a/folly/test/DynamicConverterTest.cpp b/folly/test/DynamicConverterTest.cpp index 47e87dc0..1d45e67d 100644 --- a/folly/test/DynamicConverterTest.cpp +++ b/folly/test/DynamicConverterTest.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2012 Facebook, Inc. + * Copyright 2016 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,12 @@ // @author Nicholas Ormrod -#include "folly/DynamicConverter.h" +#include + +#include #include -#include -#include "folly/Benchmark.h" +#include +#include using namespace folly; using namespace folly::dynamicconverter_detail; @@ -30,17 +32,41 @@ TEST(DynamicConverter, template_metaprogramming) { bool c1f = is_container::value; bool c2f = is_container>::value; bool c3f = is_container::value; + bool c4f = class_is_container::value; bool c1t = is_container>::value; bool c2t = is_container>::value; bool c3t = is_container>::value; + bool c4t = class_is_container>::value; EXPECT_EQ(c1f, false); EXPECT_EQ(c2f, false); EXPECT_EQ(c3f, false); + EXPECT_EQ(c4f, false); EXPECT_EQ(c1t, true); EXPECT_EQ(c2t, true); EXPECT_EQ(c3t, true); + EXPECT_EQ(c4t, true); + + + bool m1f = is_map::value; + bool m2f = is_map>::value; + + bool m1t = is_map>::value; + + EXPECT_EQ(m1f, false); + EXPECT_EQ(m2f, false); + EXPECT_EQ(m1t, true); + + + bool r1f = is_range::value; + + bool r1t = is_range>::value; + bool r2t = is_range>::value; + + EXPECT_EQ(r1f, false); + EXPECT_EQ(r1t, true); + EXPECT_EQ(r2t, true); } TEST(DynamicConverter, arithmetic_types) { @@ -52,10 +78,6 @@ TEST(DynamicConverter, arithmetic_types) { auto i2 = convertTo(d2); EXPECT_EQ(i2, 123456789012345); - dynamic d3 = 123456789012345; - auto i3 = convertTo(d3); - EXPECT_EQ(i3, 121); - dynamic d4 = 3.141; auto i4 = convertTo(d4); EXPECT_EQ((int)(i4*100), 314); @@ -77,6 +99,28 @@ TEST(DynamicConverter, arithmetic_types) { EXPECT_EQ(i8, false); } +TEST(DynamicConverter, enums) { + enum enum1 { foo = 1, bar = 2 }; + + dynamic d1 = 1; + auto i1 = convertTo(d1); + EXPECT_EQ(i1, foo); + + dynamic d2 = 2; + auto i2 = convertTo(d2); + EXPECT_EQ(i2, bar); + + enum class enum2 { FOO = 1, BAR = 2 }; + + dynamic d3 = 1; + auto i3 = convertTo(d3); + EXPECT_EQ(i3, enum2::FOO); + + dynamic d4 = 2; + auto i4 = convertTo(d4); + EXPECT_EQ(i4, enum2::BAR); +} + TEST(DynamicConverter, simple_builtins) { dynamic d1 = "Haskell"; auto i1 = convertTo(d1); @@ -86,7 +130,7 @@ TEST(DynamicConverter, simple_builtins) { auto i2 = convertTo(d2); EXPECT_EQ(i2, "13"); - dynamic d3 = { 12, "Scala" }; + dynamic d3 = dynamic::array(12, "Scala"); auto i3 = convertTo>(d3); EXPECT_EQ(i3.first, 12); EXPECT_EQ(i3.second, "Scala"); @@ -98,19 +142,19 @@ TEST(DynamicConverter, simple_builtins) { } TEST(DynamicConverter, simple_fbvector) { - dynamic d1 = { 1, 2, 3 }; + dynamic d1 = dynamic::array(1, 2, 3); auto i1 = convertTo>(d1); decltype(i1) i1b = { 1, 2, 3 }; EXPECT_EQ(i1, i1b); } TEST(DynamicConverter, simple_container) { - dynamic d1 = { 1, 2, 3 }; + dynamic d1 = dynamic::array(1, 2, 3); auto i1 = convertTo>(d1); decltype(i1) i1b = { 1, 2, 3 }; EXPECT_EQ(i1, i1b); - dynamic d2 = { 1, 3, 5, 2, 4 }; + dynamic d2 = dynamic::array(1, 3, 5, 2, 4); auto i2 = convertTo>(d2); decltype(i2) i2b = { 1, 2, 3, 5, 4 }; EXPECT_EQ(i2, i2b); @@ -122,7 +166,8 @@ TEST(DynamicConverter, simple_map) { decltype(i1) i1b = { { 1, "one" }, { 2, "two" } }; EXPECT_EQ(i1, i1b); - dynamic d2 = { { 3, "three" }, { 4, "four" } }; + dynamic d2 = dynamic::array(dynamic::array(3, "three"), + dynamic::array(4, "four")); auto i2 = convertTo>(d2); decltype(i2) i2b = { { 3, "three" }, { 4, "four" } }; EXPECT_EQ(i2, i2b); @@ -134,7 +179,8 @@ TEST(DynamicConverter, map_keyed_by_string) { decltype(i1) i1b = { { "1", "one" }, { "2", "two" } }; EXPECT_EQ(i1, i1b); - dynamic d2 = { { "3", "three" }, { "4", "four" } }; + dynamic d2 = dynamic::array(dynamic::array("3", "three"), + dynamic::array("4", "four")); auto i2 = convertTo>(d2); decltype(i2) i2b = { { "3", "three" }, { "4", "four" } }; EXPECT_EQ(i2, i2b); @@ -143,18 +189,21 @@ TEST(DynamicConverter, map_keyed_by_string) { TEST(DynamicConverter, map_to_vector_of_pairs) { dynamic d1 = dynamic::object("1", "one")("2", "two"); auto i1 = convertTo>>(d1); + std::sort(i1.begin(), i1.end()); decltype(i1) i1b = { { "1", "one" }, { "2", "two" } }; EXPECT_EQ(i1, i1b); } TEST(DynamicConverter, nested_containers) { - dynamic d1 = { { 1 }, { }, { 2, 3 } }; + dynamic d1 = dynamic::array(dynamic::array(1), + dynamic::array(), + dynamic::array(2, 3)); auto i1 = convertTo>>(d1); decltype(i1) i1b = { { 1 }, { }, { 2, 3 } }; EXPECT_EQ(i1, i1b); - dynamic h2a = { "3", ".", "1", "4" }; - dynamic h2b = { "2", ".", "7", "2" }; + dynamic h2a = dynamic::array("3", ".", "1", "4"); + dynamic h2b = dynamic::array("2", ".", "7", "2"); dynamic d2 = dynamic::object(3.14, h2a)(2.72, h2b); auto i2 = convertTo>>(d2); decltype(i2) i2b = @@ -179,7 +228,8 @@ TEST(DynamicConverter, custom_class) { auto i1 = convertTo(d1); EXPECT_EQ(i1.i, 17); - dynamic d2 = { dynamic::object("i", 18), dynamic::object("i", 19) }; + dynamic d2 = dynamic::array(dynamic::object("i", 18), + dynamic::object("i", 19)); auto i2 = convertTo>(d2); decltype(i2) i2b = { { 18 }, { 19 } }; EXPECT_EQ(i2, i2b); @@ -210,21 +260,21 @@ TEST(DynamicConverter, crazy) { dynamic - ds1 = { "a", "e", "i", "o", "u" }, - ds2 = { "2", "3", "5", "7" }, - ds3 = { "Hello", "World" }; + ds1 = dynamic::array("a", "e", "i", "o", "u"), + ds2 = dynamic::array("2", "3", "5", "7"), + ds3 = dynamic::array("Hello", "World"); dynamic - dv1 = {}, - dv2 = { ds1, ds2 }, - dv3 = { ds3 }; + dv1 = dynamic::array, + dv2 = dynamic::array(ds1, ds2), + dv3(dynamic::array(ds3)); dynamic dm1 = dynamic::object(true, dv1)(false, dv2), - dm2 = { { true, dv3 } }; + dm2 = dynamic::array(dynamic::array(true, dv3)); dynamic - df1 = { dm1, dm2 }; + df1 = dynamic::array(dm1, dm2); auto i = convertTo(d4); EXPECT_EQ(true, i4); - dynamic d5 = { 1, 2 }; + dynamic d5 = dynamic::array(1, 2); auto i5 = convertTo>(d5); decltype(i5) i5b = { 1, 2 }; EXPECT_EQ(i5b, i5); @@ -264,6 +314,7 @@ struct Token { explicit Token(int kind, const fbstring& lexeme) : kind_(kind), lexeme_(lexeme) {} }; + namespace folly { template <> struct DynamicConverter { static Token convert(const dynamic& d) { @@ -273,6 +324,7 @@ template <> struct DynamicConverter { } }; } + TEST(DynamicConverter, example) { dynamic d1 = dynamic::object("KIND", 2)("LEXEME", "a token"); auto i1 = convertTo(d1); @@ -280,12 +332,66 @@ TEST(DynamicConverter, example) { EXPECT_EQ(i1.lexeme_, "a token"); } -int main(int argc, char ** argv) { - testing::InitGoogleTest(&argc, argv); - google::ParseCommandLineFlags(&argc, &argv, true); - if (FLAGS_benchmark) { - folly::runBenchmarks(); +TEST(DynamicConverter, construct) { + using std::vector; + using std::map; + using std::pair; + using std::string; + { + vector c { 1, 2, 3 }; + dynamic d = dynamic::array(1, 2, 3); + EXPECT_EQ(d, toDynamic(c)); + } + + { + vector c{1.0f, 2.0f, 4.0f}; + dynamic d = dynamic::array(1.0, 2.0, 4.0); + EXPECT_EQ(d, toDynamic(c)); + } + + { + map c { { 2, 4 }, { 3, 9 } }; + dynamic d = dynamic::object(2, 4)(3, 9); + EXPECT_EQ(d, toDynamic(c)); + } + + { + map c { { "a", "b" } }; + dynamic d = dynamic::object("a", "b"); + EXPECT_EQ(d, toDynamic(c)); + } + + { + map> c { { "a", { "b", 3 } } }; + dynamic d = dynamic::object("a", dynamic::array("b", 3)); + EXPECT_EQ(d, toDynamic(c)); + } + + { + map> c { { "a", { "b", 3 } } }; + dynamic d = dynamic::object("a", dynamic::array("b", 3)); + EXPECT_EQ(d, toDynamic(c)); + } + + { + vector vi { 2, 3, 4, 5 }; + auto c = std::make_pair(range(vi.begin(), vi.begin() + 3), + range(vi.begin() + 1, vi.begin() + 4)); + dynamic d = dynamic::array(dynamic::array(2, 3, 4), + dynamic::array(3, 4, 5)); + EXPECT_EQ(d, toDynamic(c)); } - return RUN_ALL_TESTS(); } +TEST(DynamicConverter, errors) { + const auto int32Over = + static_cast(std::numeric_limits().max()) + 1; + const auto floatOver = + static_cast(std::numeric_limits().max()) * 2; + + dynamic d1 = int32Over; + EXPECT_THROW(convertTo(d1), std::range_error); + + dynamic d2 = floatOver; + EXPECT_THROW(convertTo(d2), std::range_error); +}