1bde2357fSRahul Joshi //===- OptionMarshallingTest.cpp - OptionParserEmitter tests -================// 2dbfa69c5SJan Svoboda // 3dbfa69c5SJan Svoboda // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dbfa69c5SJan Svoboda // See https://llvm.org/LICENSE.txt for license information. 5dbfa69c5SJan Svoboda // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dbfa69c5SJan Svoboda // 7dbfa69c5SJan Svoboda //===----------------------------------------------------------------------===// 8dbfa69c5SJan Svoboda 9138942c8Sserge-sans-paille #include "llvm/ADT/StringRef.h" 10*cd5694ecSChandler Carruth #include "llvm/ADT/StringTable.h" 11dbfa69c5SJan Svoboda #include "gtest/gtest.h" 12dbfa69c5SJan Svoboda 13dd647e3eSChandler Carruth #define OPTTABLE_STR_TABLE_CODE 14dd647e3eSChandler Carruth #include "Opts.inc" 15dd647e3eSChandler Carruth #undef OPTTABLE_STR_TABLE_CODE 16dd647e3eSChandler Carruth 17dbfa69c5SJan Svoboda struct OptionWithMarshallingInfo { 18dd647e3eSChandler Carruth int PrefixedNameOffset; 19dbfa69c5SJan Svoboda const char *KeyPath; 2088ab3844SJan Svoboda const char *ImpliedCheck; 2188ab3844SJan Svoboda const char *ImpliedValue; 22dd647e3eSChandler Carruth 23dd647e3eSChandler Carruth llvm::StringRef getPrefixedName() const { 24*cd5694ecSChandler Carruth return OptionStrTable[PrefixedNameOffset]; 25dd647e3eSChandler Carruth } 26dbfa69c5SJan Svoboda }; 27dbfa69c5SJan Svoboda 28dbfa69c5SJan Svoboda static const OptionWithMarshallingInfo MarshallingTable[] = { 29d2d59d2bSJan Svoboda #define OPTION_WITH_MARSHALLING( \ 30dd647e3eSChandler Carruth PREFIX_TYPE, PREFIXED_NAME_OFFSET, ID, KIND, GROUP, ALIAS, ALIASARGS, \ 31dd647e3eSChandler Carruth FLAGS, VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, VALUES, \ 32aff197ffSDavid Spickett SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, \ 33aff197ffSDavid Spickett IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \ 34dd647e3eSChandler Carruth {PREFIXED_NAME_OFFSET, #KEYPATH, #IMPLIED_CHECK, #IMPLIED_VALUE}, 35dbfa69c5SJan Svoboda #include "Opts.inc" 36d2d59d2bSJan Svoboda #undef OPTION_WITH_MARSHALLING 37dbfa69c5SJan Svoboda }; 38dbfa69c5SJan Svoboda 39dbfa69c5SJan Svoboda TEST(OptionMarshalling, EmittedOrderSameAsDefinitionOrder) { 40dd647e3eSChandler Carruth ASSERT_EQ(MarshallingTable[0].getPrefixedName(), "-marshalled-flag-d"); 41dd647e3eSChandler Carruth ASSERT_EQ(MarshallingTable[1].getPrefixedName(), "-marshalled-flag-c"); 42dd647e3eSChandler Carruth ASSERT_EQ(MarshallingTable[2].getPrefixedName(), "-marshalled-flag-b"); 43dd647e3eSChandler Carruth ASSERT_EQ(MarshallingTable[3].getPrefixedName(), "-marshalled-flag-a"); 44dbfa69c5SJan Svoboda } 45dbfa69c5SJan Svoboda 46dbfa69c5SJan Svoboda TEST(OptionMarshalling, EmittedSpecifiedKeyPath) { 47b6575bfdSJan Svoboda ASSERT_STREQ(MarshallingTable[0].KeyPath, "X->MarshalledFlagD"); 48b6575bfdSJan Svoboda ASSERT_STREQ(MarshallingTable[1].KeyPath, "X->MarshalledFlagC"); 49b6575bfdSJan Svoboda ASSERT_STREQ(MarshallingTable[2].KeyPath, "X->MarshalledFlagB"); 50b6575bfdSJan Svoboda ASSERT_STREQ(MarshallingTable[3].KeyPath, "X->MarshalledFlagA"); 51dbfa69c5SJan Svoboda } 52dbfa69c5SJan Svoboda 5388ab3844SJan Svoboda TEST(OptionMarshalling, ImpliedCheckContainsDisjunctionOfKeypaths) { 5488ab3844SJan Svoboda ASSERT_STREQ(MarshallingTable[0].ImpliedCheck, "false"); 5588ab3844SJan Svoboda 56b6575bfdSJan Svoboda ASSERT_STREQ(MarshallingTable[1].ImpliedCheck, "false || X->MarshalledFlagD"); 5788ab3844SJan Svoboda ASSERT_STREQ(MarshallingTable[1].ImpliedValue, "true"); 5888ab3844SJan Svoboda 59b6575bfdSJan Svoboda ASSERT_STREQ(MarshallingTable[2].ImpliedCheck, "false || X->MarshalledFlagD"); 6088ab3844SJan Svoboda ASSERT_STREQ(MarshallingTable[2].ImpliedValue, "true"); 6188ab3844SJan Svoboda 6288ab3844SJan Svoboda ASSERT_STREQ(MarshallingTable[3].ImpliedCheck, 63b6575bfdSJan Svoboda "false || X->MarshalledFlagC || X->MarshalledFlagB"); 6488ab3844SJan Svoboda ASSERT_STREQ(MarshallingTable[3].ImpliedValue, "true"); 65dbfa69c5SJan Svoboda } 66