diff --git a/packages/react-native/ReactCommon/yoga/test/YGEnumsTest.cpp b/packages/react-native/ReactCommon/yoga/test/YGEnumsTest.cpp new file mode 100644 index 000000000000..982cddf5fdc4 --- /dev/null +++ b/packages/react-native/ReactCommon/yoga/test/YGEnumsTest.cpp @@ -0,0 +1,103 @@ +/* + * 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 + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace facebook::yoga { +namespace { + +// The scoped enums and the YG*ToString() switches are emitted from separate +// generator outputs, so ordinalCount() is an independent source of truth for +// how many values each switch must handle. +template +void expectNamesForEveryOrdinal() { + std::set names; + for (EnumT value : ordinals()) { + SCOPED_TRACE(to_underlying(value)); + const char* name = toString(value); + EXPECT_STRNE("unknown", name); + EXPECT_STRNE("", name); + EXPECT_TRUE(names.insert(std::string_view{name}).second) + << "duplicate name: " << name; + } + EXPECT_EQ(ordinalCount(), static_cast(names.size())); +} + +} // namespace + +TEST(YGEnumsTest, testToStringNamesEveryOrdinalDistinctly) { + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); + expectNamesForEveryOrdinal(); +} + +// YGErrata is a bit mask rather than a sequence, so only its declared constants +// have names; a combination of flags is not one of the flags it contains and +// must not be reported as such. +TEST(YGEnumsTest, testErrataToStringNamesConstantsButNotCombinations) { + std::set names; + for (Errata errata : + {Errata::None, + Errata::StretchFlexBasis, + Errata::AbsolutePositionWithoutInsetsExcludesPadding, + Errata::AbsolutePercentAgainstInnerSize, + Errata::MinSizeUndefinedInsteadOfAuto, + Errata::FlexFirstPassUsesRunningTotals, + Errata::All, + Errata::Classic}) { + SCOPED_TRACE(to_underlying(errata)); + const char* name = toString(errata); + EXPECT_STRNE("unknown", name); + EXPECT_TRUE(names.insert(std::string_view{name}).second) + << "duplicate name: " << name; + } + + const Errata combination = + Errata::StretchFlexBasis | Errata::MinSizeUndefinedInsteadOfAuto; + EXPECT_STREQ("unknown", toString(combination)); +} + +} // namespace facebook::yoga