methodcall.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #include <cxxreact/MethodCall.h>
  8. #include <folly/json.h>
  9. #pragma GCC diagnostic push
  10. #pragma GCC diagnostic ignored "-Wsign-compare"
  11. #include <gtest/gtest.h>
  12. #pragma GCC diagnostic pop
  13. using namespace facebook;
  14. using namespace facebook::react;
  15. using namespace folly;
  16. TEST(parseMethodCalls, SingleReturnCallNoArgs) {
  17. auto jsText = "[[7],[3],[[]]]";
  18. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  19. EXPECT_EQ(1, returnedCalls.size());
  20. auto returnedCall = returnedCalls[0];
  21. EXPECT_EQ(0, returnedCall.arguments.size());
  22. EXPECT_EQ(7, returnedCall.moduleId);
  23. EXPECT_EQ(3, returnedCall.methodId);
  24. }
  25. TEST(parseMethodCalls, InvalidReturnFormat) {
  26. try {
  27. auto input = dynamic::object("foo", 1);
  28. parseMethodCalls(std::move(input));
  29. ADD_FAILURE();
  30. } catch (const std::invalid_argument &) {
  31. // ignored
  32. }
  33. try {
  34. auto input = dynamic::array(dynamic::object("foo", 1));
  35. parseMethodCalls(std::move(input));
  36. ADD_FAILURE();
  37. } catch (const std::invalid_argument &) {
  38. // ignored
  39. }
  40. try {
  41. auto input = dynamic::array(1, 4, dynamic::object("foo", 2));
  42. parseMethodCalls(std::move(input));
  43. ADD_FAILURE();
  44. } catch (const std::invalid_argument &) {
  45. // ignored
  46. }
  47. try {
  48. auto input = dynamic::array(
  49. dynamic::array(1), dynamic::array(4), dynamic::object("foo", 2));
  50. parseMethodCalls(std::move(input));
  51. ADD_FAILURE();
  52. } catch (const std::invalid_argument &) {
  53. // ignored
  54. }
  55. try {
  56. auto input =
  57. dynamic::array(dynamic::array(1), dynamic::array(4), dynamic::array());
  58. parseMethodCalls(std::move(input));
  59. ADD_FAILURE();
  60. } catch (const std::invalid_argument &) {
  61. // ignored
  62. }
  63. }
  64. TEST(parseMethodCalls, NumberReturn) {
  65. auto jsText = "[[0],[0],[[\"foobar\"]]]";
  66. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  67. EXPECT_EQ(1, returnedCalls.size());
  68. auto returnedCall = returnedCalls[0];
  69. EXPECT_EQ(1, returnedCall.arguments.size());
  70. EXPECT_EQ(folly::dynamic::STRING, returnedCall.arguments[0].type());
  71. EXPECT_EQ("foobar", returnedCall.arguments[0].asString());
  72. }
  73. TEST(parseMethodCalls, StringReturn) {
  74. auto jsText = "[[0],[0],[[42.16]]]";
  75. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  76. EXPECT_EQ(1, returnedCalls.size());
  77. auto returnedCall = returnedCalls[0];
  78. EXPECT_EQ(1, returnedCall.arguments.size());
  79. EXPECT_EQ(folly::dynamic::DOUBLE, returnedCall.arguments[0].type());
  80. EXPECT_EQ(42.16, returnedCall.arguments[0].asDouble());
  81. }
  82. TEST(parseMethodCalls, BooleanReturn) {
  83. auto jsText = "[[0],[0],[[false]]]";
  84. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  85. EXPECT_EQ(1, returnedCalls.size());
  86. auto returnedCall = returnedCalls[0];
  87. EXPECT_EQ(1, returnedCall.arguments.size());
  88. EXPECT_EQ(folly::dynamic::BOOL, returnedCall.arguments[0].type());
  89. ASSERT_FALSE(returnedCall.arguments[0].asBool());
  90. }
  91. TEST(parseMethodCalls, NullReturn) {
  92. auto jsText = "[[0],[0],[[null]]]";
  93. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  94. EXPECT_EQ(1, returnedCalls.size());
  95. auto returnedCall = returnedCalls[0];
  96. EXPECT_EQ(1, returnedCall.arguments.size());
  97. EXPECT_EQ(folly::dynamic::NULLT, returnedCall.arguments[0].type());
  98. }
  99. TEST(parseMethodCalls, MapReturn) {
  100. auto jsText =
  101. "[[0],[0],[[{\"foo\": \"hello\", \"bar\": 4.0, \"baz\": true}]]]";
  102. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  103. EXPECT_EQ(1, returnedCalls.size());
  104. auto returnedCall = returnedCalls[0];
  105. EXPECT_EQ(1, returnedCall.arguments.size());
  106. EXPECT_EQ(folly::dynamic::OBJECT, returnedCall.arguments[0].type());
  107. auto &returnedMap = returnedCall.arguments[0];
  108. auto foo = returnedMap.at("foo");
  109. EXPECT_EQ(folly::dynamic("hello"), foo);
  110. auto bar = returnedMap.at("bar");
  111. EXPECT_EQ(folly::dynamic(4.0), bar);
  112. auto baz = returnedMap.at("baz");
  113. EXPECT_EQ(folly::dynamic(true), baz);
  114. }
  115. TEST(parseMethodCalls, ArrayReturn) {
  116. auto jsText = "[[0],[0],[[[\"foo\", 42.0, false]]]]";
  117. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  118. EXPECT_EQ(1, returnedCalls.size());
  119. auto returnedCall = returnedCalls[0];
  120. EXPECT_EQ(1, returnedCall.arguments.size());
  121. EXPECT_EQ(folly::dynamic::ARRAY, returnedCall.arguments[0].type());
  122. auto &returnedArray = returnedCall.arguments[0];
  123. EXPECT_EQ(3, returnedArray.size());
  124. EXPECT_EQ(folly::dynamic("foo"), returnedArray[0]);
  125. EXPECT_EQ(folly::dynamic(42.0), returnedArray[1]);
  126. EXPECT_EQ(folly::dynamic(false), returnedArray[2]);
  127. }
  128. TEST(parseMethodCalls, ReturnMultipleParams) {
  129. auto jsText = "[[0],[0],[[\"foo\", 14, null, false]]]";
  130. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  131. EXPECT_EQ(1, returnedCalls.size());
  132. auto returnedCall = returnedCalls[0];
  133. EXPECT_EQ(4, returnedCall.arguments.size());
  134. EXPECT_EQ(folly::dynamic::STRING, returnedCall.arguments[0].type());
  135. EXPECT_EQ(folly::dynamic::INT64, returnedCall.arguments[1].type());
  136. EXPECT_EQ(folly::dynamic::NULLT, returnedCall.arguments[2].type());
  137. EXPECT_EQ(folly::dynamic::BOOL, returnedCall.arguments[3].type());
  138. }
  139. TEST(parseMethodCalls, ParseTwoCalls) {
  140. auto jsText = "[[0,0],[1,1],[[],[]]]";
  141. auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
  142. EXPECT_EQ(2, returnedCalls.size());
  143. }