bigintegertest.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. // Tencent is pleased to support the open source community by making RapidJSON available.
  2. //
  3. // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
  4. //
  5. // Licensed under the MIT License (the "License"); you may not use this file except
  6. // in compliance with the License. You may obtain a copy of the License at
  7. //
  8. // http://opensource.org/licenses/MIT
  9. //
  10. // Unless required by applicable law or agreed to in writing, software distributed
  11. // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  12. // CONDITIONS OF ANY KIND, either express or implied. See the License for the
  13. // specific language governing permissions and limitations under the License.
  14. #include "unittest.h"
  15. #include "rapidjson/internal/biginteger.h"
  16. using namespace rapidjson::internal;
  17. #define BIGINTEGER_LITERAL(s) BigInteger(s, sizeof(s) - 1)
  18. static const BigInteger kZero(0);
  19. static const BigInteger kOne(1);
  20. static const BigInteger kUint64Max = BIGINTEGER_LITERAL("18446744073709551615");
  21. static const BigInteger kTwo64 = BIGINTEGER_LITERAL("18446744073709551616");
  22. TEST(BigInteger, Constructor) {
  23. EXPECT_TRUE(kZero.IsZero());
  24. EXPECT_TRUE(kZero == kZero);
  25. EXPECT_TRUE(kZero == BIGINTEGER_LITERAL("0"));
  26. EXPECT_TRUE(kZero == BIGINTEGER_LITERAL("00"));
  27. const BigInteger a(123);
  28. EXPECT_TRUE(a == a);
  29. EXPECT_TRUE(a == BIGINTEGER_LITERAL("123"));
  30. EXPECT_TRUE(a == BIGINTEGER_LITERAL("0123"));
  31. EXPECT_EQ(2u, kTwo64.GetCount());
  32. EXPECT_EQ(0u, kTwo64.GetDigit(0));
  33. EXPECT_EQ(1u, kTwo64.GetDigit(1));
  34. }
  35. TEST(BigInteger, AddUint64) {
  36. BigInteger a = kZero;
  37. a += 0u;
  38. EXPECT_TRUE(kZero == a);
  39. a += 1u;
  40. EXPECT_TRUE(kOne == a);
  41. a += 1u;
  42. EXPECT_TRUE(BigInteger(2) == a);
  43. EXPECT_TRUE(BigInteger(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF)) == kUint64Max);
  44. BigInteger b = kUint64Max;
  45. b += 1u;
  46. EXPECT_TRUE(kTwo64 == b);
  47. b += RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF);
  48. EXPECT_TRUE(BIGINTEGER_LITERAL("36893488147419103231") == b);
  49. }
  50. TEST(BigInteger, MultiplyUint64) {
  51. BigInteger a = kZero;
  52. a *= static_cast <uint64_t>(0);
  53. EXPECT_TRUE(kZero == a);
  54. a *= static_cast <uint64_t>(123);
  55. EXPECT_TRUE(kZero == a);
  56. BigInteger b = kOne;
  57. b *= static_cast<uint64_t>(1);
  58. EXPECT_TRUE(kOne == b);
  59. b *= static_cast<uint64_t>(0);
  60. EXPECT_TRUE(kZero == b);
  61. BigInteger c(123);
  62. c *= static_cast<uint64_t>(456u);
  63. EXPECT_TRUE(BigInteger(123u * 456u) == c);
  64. c *= RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF);
  65. EXPECT_TRUE(BIGINTEGER_LITERAL("1034640981606221330982120") == c);
  66. c *= RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0xFFFFFFFF);
  67. EXPECT_TRUE(BIGINTEGER_LITERAL("19085757395861596536664473018420572782123800") == c);
  68. }
  69. TEST(BigInteger, MultiplyUint32) {
  70. BigInteger a = kZero;
  71. a *= static_cast <uint32_t>(0);
  72. EXPECT_TRUE(kZero == a);
  73. a *= static_cast <uint32_t>(123);
  74. EXPECT_TRUE(kZero == a);
  75. BigInteger b = kOne;
  76. b *= static_cast<uint32_t>(1);
  77. EXPECT_TRUE(kOne == b);
  78. b *= static_cast<uint32_t>(0);
  79. EXPECT_TRUE(kZero == b);
  80. BigInteger c(123);
  81. c *= static_cast<uint32_t>(456u);
  82. EXPECT_TRUE(BigInteger(123u * 456u) == c);
  83. c *= 0xFFFFFFFFu;
  84. EXPECT_TRUE(BIGINTEGER_LITERAL("240896125641960") == c);
  85. c *= 0xFFFFFFFFu;
  86. EXPECT_TRUE(BIGINTEGER_LITERAL("1034640981124429079698200") == c);
  87. }
  88. TEST(BigInteger, LeftShift) {
  89. BigInteger a = kZero;
  90. a <<= 1;
  91. EXPECT_TRUE(kZero == a);
  92. a <<= 64;
  93. EXPECT_TRUE(kZero == a);
  94. a = BigInteger(123);
  95. a <<= 0;
  96. EXPECT_TRUE(BigInteger(123) == a);
  97. a <<= 1;
  98. EXPECT_TRUE(BigInteger(246) == a);
  99. a <<= 64;
  100. EXPECT_TRUE(BIGINTEGER_LITERAL("4537899042132549697536") == a);
  101. a <<= 99;
  102. EXPECT_TRUE(BIGINTEGER_LITERAL("2876235222267216943024851750785644982682875244576768") == a);
  103. }
  104. TEST(BigInteger, Compare) {
  105. EXPECT_EQ(0, kZero.Compare(kZero));
  106. EXPECT_EQ(1, kOne.Compare(kZero));
  107. EXPECT_EQ(-1, kZero.Compare(kOne));
  108. EXPECT_EQ(0, kUint64Max.Compare(kUint64Max));
  109. EXPECT_EQ(0, kTwo64.Compare(kTwo64));
  110. EXPECT_EQ(-1, kUint64Max.Compare(kTwo64));
  111. EXPECT_EQ(1, kTwo64.Compare(kUint64Max));
  112. }