- App.tsx: full navigation (Auth stack + Main tabs with 5 screens) - Auth: LoginScreen, RegisterScreen, ForgotPasswordScreen - HomeScreen: dashboard with IoT metrics, weather widget, alerts, quick actions, sensors - MapScreen: interactive map with layer toggles (6 layers) - MarketplaceScreen: categories (6), products (5), search - ChatScreen: AI chat with quick prompts (4), bot responses - ProfileScreen: user info, stats, menu (9 items), logout - AlertsScreen: alert list with severity, acknowledge - SensorsScreen: sensor list with type filters (6 types), search - ZonesScreen: zone cards with stats - SettingsScreen: language picker (FR/EN/ES/DE), privacy, about - Stores: iotStore (sensors, zones, alerts), notificationStore, uiStore + i18n - Hooks: useSensors, useAlerts, useNotifications, useLocation - Components: Card, Button, LoadingSpinner, ErrorBoundary, Header - Services: iotService, notificationService (with axios API client) - Utils: formatters (temp, AQI, noise, dates), validators (email, password, IBAN) - Theme: colors.ts with full design system (Blue Ocean palette) - Ditto: fixed MongoDB connection, new JWT secrets, official gateway image
156 lines
5.3 KiB
C++
156 lines
5.3 KiB
C++
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#include <cxxreact/MethodCall.h>
|
|
|
|
#include <folly/json.h>
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wsign-compare"
|
|
#include <gtest/gtest.h>
|
|
#pragma GCC diagnostic pop
|
|
|
|
using namespace facebook::react;
|
|
using dynamic = folly::dynamic;
|
|
|
|
TEST(parseMethodCalls, SingleReturnCallNoArgs) {
|
|
auto jsText = "[[7],[3],[[]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(0, returnedCall.arguments.size());
|
|
EXPECT_EQ(7, returnedCall.moduleId);
|
|
EXPECT_EQ(3, returnedCall.methodId);
|
|
}
|
|
|
|
TEST(parseMethodCalls, InvalidReturnFormat) {
|
|
try {
|
|
auto input = dynamic::object("foo", 1);
|
|
parseMethodCalls(std::move(input));
|
|
ADD_FAILURE();
|
|
} catch (const std::invalid_argument&) {
|
|
// ignored
|
|
}
|
|
try {
|
|
auto input = dynamic::array(dynamic::object("foo", 1));
|
|
parseMethodCalls(std::move(input));
|
|
ADD_FAILURE();
|
|
} catch (const std::invalid_argument&) {
|
|
// ignored
|
|
}
|
|
try {
|
|
auto input = dynamic::array(1, 4, dynamic::object("foo", 2));
|
|
parseMethodCalls(std::move(input));
|
|
ADD_FAILURE();
|
|
} catch (const std::invalid_argument&) {
|
|
// ignored
|
|
}
|
|
try {
|
|
auto input = dynamic::array(
|
|
dynamic::array(1), dynamic::array(4), dynamic::object("foo", 2));
|
|
parseMethodCalls(std::move(input));
|
|
ADD_FAILURE();
|
|
} catch (const std::invalid_argument&) {
|
|
// ignored
|
|
}
|
|
try {
|
|
auto input =
|
|
dynamic::array(dynamic::array(1), dynamic::array(4), dynamic::array());
|
|
parseMethodCalls(std::move(input));
|
|
ADD_FAILURE();
|
|
} catch (const std::invalid_argument&) {
|
|
// ignored
|
|
}
|
|
}
|
|
|
|
TEST(parseMethodCalls, NumberReturn) {
|
|
auto jsText = "[[0],[0],[[\"foobar\"]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(1, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::STRING, returnedCall.arguments[0].type());
|
|
EXPECT_EQ("foobar", returnedCall.arguments[0].asString());
|
|
}
|
|
|
|
TEST(parseMethodCalls, StringReturn) {
|
|
auto jsText = "[[0],[0],[[42.16]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(1, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::DOUBLE, returnedCall.arguments[0].type());
|
|
EXPECT_EQ(42.16, returnedCall.arguments[0].asDouble());
|
|
}
|
|
|
|
TEST(parseMethodCalls, BooleanReturn) {
|
|
auto jsText = "[[0],[0],[[false]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(1, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::BOOL, returnedCall.arguments[0].type());
|
|
ASSERT_FALSE(returnedCall.arguments[0].asBool());
|
|
}
|
|
|
|
TEST(parseMethodCalls, NullReturn) {
|
|
auto jsText = "[[0],[0],[[null]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(1, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::NULLT, returnedCall.arguments[0].type());
|
|
}
|
|
|
|
TEST(parseMethodCalls, MapReturn) {
|
|
auto jsText =
|
|
"[[0],[0],[[{\"foo\": \"hello\", \"bar\": 4.0, \"baz\": true}]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(1, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::OBJECT, returnedCall.arguments[0].type());
|
|
auto& returnedMap = returnedCall.arguments[0];
|
|
auto foo = returnedMap.at("foo");
|
|
EXPECT_EQ(folly::dynamic("hello"), foo);
|
|
auto bar = returnedMap.at("bar");
|
|
EXPECT_EQ(folly::dynamic(4.0), bar);
|
|
auto baz = returnedMap.at("baz");
|
|
EXPECT_EQ(folly::dynamic(true), baz);
|
|
}
|
|
|
|
TEST(parseMethodCalls, ArrayReturn) {
|
|
auto jsText = "[[0],[0],[[[\"foo\", 42.0, false]]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(1, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::ARRAY, returnedCall.arguments[0].type());
|
|
auto& returnedArray = returnedCall.arguments[0];
|
|
EXPECT_EQ(3, returnedArray.size());
|
|
EXPECT_EQ(folly::dynamic("foo"), returnedArray[0]);
|
|
EXPECT_EQ(folly::dynamic(42.0), returnedArray[1]);
|
|
EXPECT_EQ(folly::dynamic(false), returnedArray[2]);
|
|
}
|
|
|
|
TEST(parseMethodCalls, ReturnMultipleParams) {
|
|
auto jsText = "[[0],[0],[[\"foo\", 14, null, false]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(1, returnedCalls.size());
|
|
auto returnedCall = returnedCalls[0];
|
|
EXPECT_EQ(4, returnedCall.arguments.size());
|
|
EXPECT_EQ(folly::dynamic::STRING, returnedCall.arguments[0].type());
|
|
EXPECT_EQ(folly::dynamic::INT64, returnedCall.arguments[1].type());
|
|
EXPECT_EQ(folly::dynamic::NULLT, returnedCall.arguments[2].type());
|
|
EXPECT_EQ(folly::dynamic::BOOL, returnedCall.arguments[3].type());
|
|
}
|
|
|
|
TEST(parseMethodCalls, ParseTwoCalls) {
|
|
auto jsText = "[[0,0],[1,1],[[],[]]]";
|
|
auto returnedCalls = parseMethodCalls(folly::parseJson(jsText));
|
|
EXPECT_EQ(2, returnedCalls.size());
|
|
}
|