OLD | NEW |
| (Empty) |
1 // Copyright 2010 The Ginsu Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can | |
3 // be found in the LICENSE file. | |
4 | |
5 #include <cmath> | |
6 #include <iostream> | |
7 #include <limits> | |
8 #include <string> | |
9 | |
10 #include "c_salt/variant.h" | |
11 #include "gmock/gmock.h" | |
12 #include "gtest/gtest.h" | |
13 | |
14 using c_salt::Variant; | |
15 | |
16 namespace { | |
17 const char* kTestBoolTrueString = "true"; | |
18 const double kTestDoubleValue = 3.141592653589793; | |
19 const char* kTestDoubleAsString = "3.1415926535897"; | |
20 const int32_t kTestIntValue = 42; | |
21 const char* kTestIntAsString = "42"; | |
22 const char* kTestString = "this is a test string"; | |
23 // |kTestTruncatedIntValue| is the integer equivalent to | |
24 // floor(kTestDoubleValue). | |
25 const int32_t kTestTruncatedIntValue = 3; | |
26 } // namespace | |
27 | |
28 class VariantTest : public ::testing::Test { | |
29 protected: | |
30 virtual void SetUp() {} | |
31 }; | |
32 | |
33 // Create a Variant from string. Tests all the typed return values. | |
34 TEST_F(VariantTest, CreateFromStr) { | |
35 Variant str_var(kTestString); | |
36 EXPECT_EQ(Variant::kStringVariantType, str_var.variant_type()); | |
37 EXPECT_EQ(kTestString, str_var.StringValue()); | |
38 // BoolValue() should return |true| because the test string begins with a | |
39 // 't'. | |
40 EXPECT_TRUE(str_var.BoolValue()); | |
41 EXPECT_EQ(0, str_var.Int32Value()); | |
42 EXPECT_EQ(0.0, str_var.DoubleValue()); | |
43 } | |
44 | |
45 // Create a Variant from an int32. Tests all the typed return values. | |
46 TEST_F(VariantTest, CreateFromInt) { | |
47 Variant int_var(kTestIntValue); | |
48 EXPECT_EQ(Variant::kInt32VariantType, int_var.variant_type()); | |
49 EXPECT_EQ(kTestIntAsString, int_var.StringValue()); | |
50 EXPECT_TRUE(int_var.BoolValue()); | |
51 EXPECT_EQ(kTestIntValue, int_var.Int32Value()); | |
52 EXPECT_TRUE(std::fabs(int_var.DoubleValue() - kTestIntValue) <= | |
53 std::numeric_limits<double>::epsilon()); | |
54 // TODO(dspringer): Add this test when ObjectValue() is implemented. | |
55 // EXPECT_EQ(NULL, int_var.ObjectValue()); | |
56 } | |
57 | |
58 // Create a Variant from a double. Tests all the typed return values. | |
59 TEST_F(VariantTest, CreateFromDouble) { | |
60 Variant dbl_var(kTestDoubleValue); | |
61 EXPECT_EQ(Variant::kDoubleVariantType, dbl_var.variant_type()); | |
62 EXPECT_EQ(0, strncmp(dbl_var.StringValue().c_str(), | |
63 kTestDoubleAsString, | |
64 strlen(kTestDoubleAsString))); | |
65 EXPECT_TRUE(dbl_var.BoolValue()); | |
66 EXPECT_EQ(kTestTruncatedIntValue, dbl_var.Int32Value()); | |
67 EXPECT_TRUE(std::fabs(dbl_var.DoubleValue() - kTestDoubleValue) <= | |
68 std::numeric_limits<double>::epsilon()); | |
69 } | |
70 | |
71 // Create a Variant from an bool. Tests all the typed return values. | |
72 TEST_F(VariantTest, CreateFromBoolNPVariant) { | |
73 Variant bool_var(true); | |
74 EXPECT_EQ(Variant::kBoolVariantType, bool_var.variant_type()); | |
75 EXPECT_EQ("true", bool_var.StringValue()); | |
76 EXPECT_TRUE(bool_var.BoolValue()); | |
77 EXPECT_EQ(1, bool_var.Int32Value()); | |
78 EXPECT_TRUE(std::fabs(bool_var.DoubleValue() - 1) <= | |
79 std::numeric_limits<double>::epsilon()); | |
80 } | |
81 | |
82 // Make sure well-known string values convert correctly to bool types, and | |
83 // bool types convert to the known string values. | |
84 TEST_F(VariantTest, TypeConvertStringToBool) { | |
85 Variant bool_var(true); | |
86 EXPECT_EQ(Variant::kBoolVariantType, bool_var.variant_type()); | |
87 // Convert bool to string and back. | |
88 Variant str_from_bool(bool_var.StringValue()); | |
89 EXPECT_EQ(0, strncmp(str_from_bool.StringValue().c_str(), | |
90 kTestBoolTrueString, | |
91 strlen(kTestBoolTrueString))); | |
92 Variant bool_from_str(str_from_bool.BoolValue()); | |
93 EXPECT_TRUE(bool_from_str.BoolValue()); | |
94 // Step 2: Convert certain well-known strings to bools. | |
95 Variant str_true("true"); | |
96 EXPECT_TRUE(str_true.BoolValue()); | |
97 Variant str_yes("Yes"); | |
98 EXPECT_TRUE(str_yes.BoolValue()); | |
99 Variant str_1("1"); | |
100 EXPECT_TRUE(str_1.BoolValue()); | |
101 Variant str_0("0"); | |
102 EXPECT_FALSE(str_0.BoolValue()); | |
103 Variant str_false("hello?"); | |
104 EXPECT_FALSE(str_false.BoolValue()); | |
105 } | |
106 | |
107 // Make sure the conversion from a double type to string works both ways. | |
108 TEST_F(VariantTest, TypeConverStringToDouble) { | |
109 Variant dbl_var(kTestDoubleValue); | |
110 EXPECT_EQ(Variant::kDoubleVariantType, dbl_var.variant_type()); | |
111 // Convert double to string and back. | |
112 Variant str_from_dbl(dbl_var.StringValue()); | |
113 EXPECT_EQ(0, strncmp(str_from_dbl.StringValue().c_str(), | |
114 kTestDoubleAsString, | |
115 strlen(kTestDoubleAsString))); | |
116 Variant dbl_from_str(str_from_dbl.DoubleValue()); | |
117 EXPECT_TRUE(std::fabs(dbl_from_str.DoubleValue() - kTestDoubleValue) <= | |
118 std::numeric_limits<double>::epsilon()); | |
119 } | |
120 | |
121 // Make sure the coinversion from an int type to string works both ways. | |
122 TEST_F(VariantTest, TypeConvertIntToString) { | |
123 Variant int_var(kTestIntValue); | |
124 EXPECT_EQ(Variant::kInt32VariantType, int_var.variant_type()); | |
125 // Convert int to string and back. | |
126 Variant str_from_int(int_var.StringValue()); | |
127 EXPECT_EQ(kTestIntAsString, str_from_int.StringValue()); | |
128 Variant int_from_str(str_from_int.Int32Value()); | |
129 EXPECT_EQ(kTestIntValue, int_from_str.Int32Value()); | |
130 } | |
OLD | NEW |