diff --git a/packages/react-native/ReactCommon/react/renderer/css/CSSCommaSeparatedList.h b/packages/react-native/ReactCommon/react/renderer/css/CSSList.h similarity index 57% rename from packages/react-native/ReactCommon/react/renderer/css/CSSCommaSeparatedList.h rename to packages/react-native/ReactCommon/react/renderer/css/CSSList.h index ee640e65e9d..ff5582f75ed 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/CSSCommaSeparatedList.h +++ b/packages/react-native/ReactCommon/react/renderer/css/CSSList.h @@ -15,22 +15,17 @@ namespace facebook::react { -/** - * Represents a comma-separated repetition of a given single type. - * https://www.w3.org/TR/css-values-4/#mult-comma - */ -template -struct CSSCommaSeparatedList : public std::vector {}; +template +struct CSSList : public std::vector {}; -template -struct CSSDataTypeParser> { +template +struct CSSDataTypeParser> { static inline auto consume(CSSSyntaxParser& parser) - -> std::optional> { - CSSCommaSeparatedList result; + -> std::optional> { + CSSList result; for (auto nextValue = parseNextCSSValue(parser); !std::holds_alternative(nextValue); - nextValue = - parseNextCSSValue(parser, CSSDelimiter::Comma)) { + nextValue = parseNextCSSValue(parser, Delim)) { result.push_back(std::move(std::get(nextValue))); } @@ -42,4 +37,19 @@ struct CSSDataTypeParser> { } }; +/** + * Represents a comma-separated repetition of a given single type. + * https://www.w3.org/TR/css-values-4/#mult-comma + */ +template +using CSSCommaSeparatedList = CSSList; + +/** + * Represents a whitespace-separated repetition of a given single type. + * https://www.w3.org/TR/css-values-4/#component-combinators + */ +template +using CSSWhitespaceSeparatedList = + CSSList; + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/css/CSSShadow.h b/packages/react-native/ReactCommon/react/renderer/css/CSSShadow.h index 3c445f0fb49..6adb85bb799 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/CSSShadow.h +++ b/packages/react-native/ReactCommon/react/renderer/css/CSSShadow.h @@ -11,10 +11,10 @@ #include #include -#include #include #include #include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSCommaSeparatedListTest.cpp b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSListTest.cpp similarity index 65% rename from packages/react-native/ReactCommon/react/renderer/css/tests/CSSCommaSeparatedListTest.cpp rename to packages/react-native/ReactCommon/react/renderer/css/tests/CSSListTest.cpp index d96ef2f2073..599f48967b7 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSCommaSeparatedListTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSListTest.cpp @@ -6,13 +6,13 @@ */ #include -#include +#include #include #include namespace facebook::react { -TEST(CSSCommaSeparatedList, empty_values) { +TEST(CSSList, empty_values) { auto emptyValue = parseCSSProperty>(""); EXPECT_TRUE(std::holds_alternative(emptyValue)); @@ -23,7 +23,7 @@ TEST(CSSCommaSeparatedList, empty_values) { auto commaValue = parseCSSProperty>(","); } -TEST(CSSCommaSeparatedList, single_value) { +TEST(CSSList, single_value) { auto simpleValue = parseCSSProperty>("20"); EXPECT_TRUE( std::holds_alternative>(simpleValue)); @@ -41,12 +41,12 @@ TEST(CSSCommaSeparatedList, single_value) { std::get>(whitespaceValue)[0].value, 20); } -TEST(CSSCommaSeparatedList, wrong_type) { +TEST(CSSList, wrong_type) { auto simpleValue = parseCSSProperty>("20px"); EXPECT_TRUE(std::holds_alternative(simpleValue)); } -TEST(CSSCommaSeparatedList, multiple_values) { +TEST(CSSList, multiple_comma_values) { auto simpleValue = parseCSSProperty>("20, 30, 40"); EXPECT_TRUE( @@ -73,13 +73,54 @@ TEST(CSSCommaSeparatedList, multiple_values) { std::get>(whitespaceValue)[2].value, 40); } -TEST(CSSCommaSeparatedList, extra_tokens) { +TEST(CSSList, multiple_space_values) { + auto simpleValue = + parseCSSProperty>("20 30 40"); + EXPECT_TRUE(std::holds_alternative>( + simpleValue)); + EXPECT_EQ( + std::get>(simpleValue).size(), 3); + EXPECT_EQ( + std::get>(simpleValue)[0].value, + 20); + EXPECT_EQ( + std::get>(simpleValue)[1].value, + 30); + EXPECT_EQ( + std::get>(simpleValue)[2].value, + 40); + + auto whitespaceValue = + parseCSSProperty>(" 20 \n 30 40 "); + EXPECT_TRUE(std::holds_alternative>( + whitespaceValue)); + EXPECT_EQ( + std::get>(whitespaceValue).size(), + 3); + EXPECT_EQ( + std::get>(whitespaceValue)[0].value, + 20); + EXPECT_EQ( + std::get>(whitespaceValue)[1].value, + 30); + EXPECT_EQ( + std::get>(whitespaceValue)[2].value, + 40); +} + +TEST(CSSList, extra_comma_tokens) { auto extraTokensValue = parseCSSProperty>("20, 30, 40 50"); EXPECT_TRUE(std::holds_alternative(extraTokensValue)); } -TEST(CSSCommaSeparatedList, extra_commas) { +TEST(CSSList, extra_space_tokens) { + auto extraTokensValue = + parseCSSProperty>("20 30 40 ,50"); + EXPECT_TRUE(std::holds_alternative(extraTokensValue)); +} + +TEST(CSSList, extra_commas) { auto prefixCommaValue = parseCSSProperty>(",20"); EXPECT_TRUE(std::holds_alternative(prefixCommaValue)); diff --git a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSShadowTest.cpp b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSShadowTest.cpp index 0de2f13d187..cffe542c2a3 100644 --- a/packages/react-native/ReactCommon/react/renderer/css/tests/CSSShadowTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/css/tests/CSSShadowTest.cpp @@ -6,7 +6,7 @@ */ #include -#include +#include #include #include