xref: /llvm-project/llvm/unittests/DebugInfo/LogicalView/SelectElementsTest.cpp (revision 7fbcc24409efdb37cec79ad461ef383f6ffc5ef2)
10332a8e7SCarlos Alberto Enciso //===- llvm/unittest/DebugInfo/LogicalView/SelectElementsTest.cpp ---------===//
20332a8e7SCarlos Alberto Enciso //
30332a8e7SCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40332a8e7SCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
50332a8e7SCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60332a8e7SCarlos Alberto Enciso //
70332a8e7SCarlos Alberto Enciso //===----------------------------------------------------------------------===//
80332a8e7SCarlos Alberto Enciso 
90332a8e7SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVLine.h"
100332a8e7SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
110332a8e7SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
120332a8e7SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
130332a8e7SCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVType.h"
140332a8e7SCarlos Alberto Enciso #include "llvm/Support/ScopedPrinter.h"
150332a8e7SCarlos Alberto Enciso #include "llvm/Support/ToolOutputFile.h"
160332a8e7SCarlos Alberto Enciso #include "llvm/Testing/Support/Error.h"
170332a8e7SCarlos Alberto Enciso 
180332a8e7SCarlos Alberto Enciso #include "gtest/gtest.h"
190332a8e7SCarlos Alberto Enciso 
200332a8e7SCarlos Alberto Enciso using namespace llvm;
210332a8e7SCarlos Alberto Enciso using namespace llvm::logicalview;
220332a8e7SCarlos Alberto Enciso 
230332a8e7SCarlos Alberto Enciso namespace {
240332a8e7SCarlos Alberto Enciso 
250332a8e7SCarlos Alberto Enciso class ReaderTestSelection : public LVReader {
26*7fbcc244SCarlos Alberto Enciso #define CREATE(VARIABLE, CREATE_FUNCTION, SET_FUNCTION)                        \
27*7fbcc244SCarlos Alberto Enciso   VARIABLE = CREATE_FUNCTION();                                                \
28*7fbcc244SCarlos Alberto Enciso   EXPECT_NE(VARIABLE, nullptr);                                                \
29*7fbcc244SCarlos Alberto Enciso   VARIABLE->SET_FUNCTION();
30*7fbcc244SCarlos Alberto Enciso 
310332a8e7SCarlos Alberto Enciso   // Types.
320332a8e7SCarlos Alberto Enciso   LVType *IntegerType = nullptr;
330332a8e7SCarlos Alberto Enciso 
340332a8e7SCarlos Alberto Enciso   // Scopes.
350332a8e7SCarlos Alberto Enciso   LVScope *NestedScope = nullptr;
360332a8e7SCarlos Alberto Enciso   LVScopeAggregate *Aggregate = nullptr;
370332a8e7SCarlos Alberto Enciso   LVScopeFunction *Function = nullptr;
380332a8e7SCarlos Alberto Enciso   LVScopeNamespace *Namespace = nullptr;
390332a8e7SCarlos Alberto Enciso 
400332a8e7SCarlos Alberto Enciso   // Symbols.
410332a8e7SCarlos Alberto Enciso   LVSymbol *ClassMember = nullptr;
420332a8e7SCarlos Alberto Enciso   LVSymbol *LocalVariable = nullptr;
430332a8e7SCarlos Alberto Enciso   LVSymbol *NestedVariable = nullptr;
440332a8e7SCarlos Alberto Enciso   LVSymbol *Parameter = nullptr;
450332a8e7SCarlos Alberto Enciso 
460332a8e7SCarlos Alberto Enciso   // Lines.
470332a8e7SCarlos Alberto Enciso   LVLine *LineOne = nullptr;
480332a8e7SCarlos Alberto Enciso   LVLine *LineTwo = nullptr;
490332a8e7SCarlos Alberto Enciso   LVLine *LineThree = nullptr;
500332a8e7SCarlos Alberto Enciso   LVLine *LineFour = nullptr;
510332a8e7SCarlos Alberto Enciso   LVLine *LineFive = nullptr;
520332a8e7SCarlos Alberto Enciso 
530332a8e7SCarlos Alberto Enciso protected:
540332a8e7SCarlos Alberto Enciso   void add(LVScope *Parent, LVElement *Element);
550332a8e7SCarlos Alberto Enciso   void set(LVElement *Element, StringRef Name, LVOffset Offset,
560332a8e7SCarlos Alberto Enciso            uint32_t LineNumber = 0, LVElement *Type = nullptr);
570332a8e7SCarlos Alberto Enciso 
580332a8e7SCarlos Alberto Enciso public:
ReaderTestSelection(ScopedPrinter & W)590332a8e7SCarlos Alberto Enciso   ReaderTestSelection(ScopedPrinter &W) : LVReader("", "", W) {
600332a8e7SCarlos Alberto Enciso     setInstance(this);
610332a8e7SCarlos Alberto Enciso   }
620332a8e7SCarlos Alberto Enciso 
createScopes()630332a8e7SCarlos Alberto Enciso   Error createScopes() { return LVReader::createScopes(); }
640332a8e7SCarlos Alberto Enciso 
650332a8e7SCarlos Alberto Enciso   void createElements();
660332a8e7SCarlos Alberto Enciso   void addElements();
670332a8e7SCarlos Alberto Enciso   void initElements();
680332a8e7SCarlos Alberto Enciso   void resolvePatterns(LVPatterns &Patterns);
690332a8e7SCarlos Alberto Enciso   void checkFlexiblePatterns();
700332a8e7SCarlos Alberto Enciso   void checkGenericPatterns();
710332a8e7SCarlos Alberto Enciso   void checkKindPatterns();
720332a8e7SCarlos Alberto Enciso };
730332a8e7SCarlos Alberto Enciso 
740332a8e7SCarlos Alberto Enciso // Helper function to add a logical element to a given scope.
add(LVScope * Parent,LVElement * Child)750332a8e7SCarlos Alberto Enciso void ReaderTestSelection::add(LVScope *Parent, LVElement *Child) {
760332a8e7SCarlos Alberto Enciso   Parent->addElement(Child);
770332a8e7SCarlos Alberto Enciso   EXPECT_EQ(Child->getParent(), Parent);
780332a8e7SCarlos Alberto Enciso   EXPECT_EQ(Child->getLevel(), Parent->getLevel() + 1);
790332a8e7SCarlos Alberto Enciso }
800332a8e7SCarlos Alberto Enciso 
810332a8e7SCarlos Alberto Enciso // Helper function to set the initial values for a given logical element.
set(LVElement * Element,StringRef Name,LVOffset Offset,uint32_t LineNumber,LVElement * Type)820332a8e7SCarlos Alberto Enciso void ReaderTestSelection::set(LVElement *Element, StringRef Name,
830332a8e7SCarlos Alberto Enciso                               LVOffset Offset, uint32_t LineNumber,
840332a8e7SCarlos Alberto Enciso                               LVElement *Type) {
850332a8e7SCarlos Alberto Enciso   Element->setName(Name);
860332a8e7SCarlos Alberto Enciso   Element->setOffset(Offset);
870332a8e7SCarlos Alberto Enciso   Element->setLineNumber(LineNumber);
880332a8e7SCarlos Alberto Enciso   Element->setType(Type);
890332a8e7SCarlos Alberto Enciso   EXPECT_EQ(Element->getName(), Name);
900332a8e7SCarlos Alberto Enciso   EXPECT_EQ(Element->getOffset(), Offset);
910332a8e7SCarlos Alberto Enciso   EXPECT_EQ(Element->getLineNumber(), LineNumber);
920332a8e7SCarlos Alberto Enciso   EXPECT_EQ(Element->getType(), Type);
930332a8e7SCarlos Alberto Enciso }
940332a8e7SCarlos Alberto Enciso 
950332a8e7SCarlos Alberto Enciso // Create the logical elements.
createElements()960332a8e7SCarlos Alberto Enciso void ReaderTestSelection::createElements() {
970332a8e7SCarlos Alberto Enciso   // Create scope root.
980332a8e7SCarlos Alberto Enciso   Error Err = createScopes();
990332a8e7SCarlos Alberto Enciso   ASSERT_THAT_ERROR(std::move(Err), Succeeded());
1000332a8e7SCarlos Alberto Enciso   Root = getScopesRoot();
1010332a8e7SCarlos Alberto Enciso   EXPECT_NE(Root, nullptr);
1020332a8e7SCarlos Alberto Enciso 
1030332a8e7SCarlos Alberto Enciso   // Create the logical types.
104*7fbcc244SCarlos Alberto Enciso   CREATE(IntegerType, createType, setIsBase);
1050332a8e7SCarlos Alberto Enciso 
1060332a8e7SCarlos Alberto Enciso   // Create the logical scopes.
107*7fbcc244SCarlos Alberto Enciso   CREATE(CompileUnit, createScopeCompileUnit, setIsCompileUnit);
108*7fbcc244SCarlos Alberto Enciso   CREATE(Function, createScopeFunction, setIsFunction);
109*7fbcc244SCarlos Alberto Enciso   CREATE(NestedScope, createScope, setIsLexicalBlock);
110*7fbcc244SCarlos Alberto Enciso   CREATE(Namespace, createScopeNamespace, setIsNamespace);
111*7fbcc244SCarlos Alberto Enciso   CREATE(Aggregate, createScopeAggregate, setIsAggregate);
1120332a8e7SCarlos Alberto Enciso 
1130332a8e7SCarlos Alberto Enciso   // Create the logical symbols.
114*7fbcc244SCarlos Alberto Enciso   CREATE(ClassMember, createSymbol, setIsMember);
115*7fbcc244SCarlos Alberto Enciso   CREATE(LocalVariable, createSymbol, setIsVariable);
116*7fbcc244SCarlos Alberto Enciso   CREATE(NestedVariable, createSymbol, setIsVariable);
117*7fbcc244SCarlos Alberto Enciso   CREATE(Parameter, createSymbol, setIsParameter);
1180332a8e7SCarlos Alberto Enciso 
1190332a8e7SCarlos Alberto Enciso   // Create the logical lines.
120*7fbcc244SCarlos Alberto Enciso   CREATE(LineOne, createLine, setIsLineDebug);
121*7fbcc244SCarlos Alberto Enciso   CREATE(LineTwo, createLine, setIsBasicBlock);
122*7fbcc244SCarlos Alberto Enciso   CREATE(LineThree, createLine, setIsNewStatement);
123*7fbcc244SCarlos Alberto Enciso   CREATE(LineFour, createLine, setIsPrologueEnd);
124*7fbcc244SCarlos Alberto Enciso   CREATE(LineFive, createLine, setIsLineAssembler);
1250332a8e7SCarlos Alberto Enciso }
1260332a8e7SCarlos Alberto Enciso 
1270332a8e7SCarlos Alberto Enciso // Create the logical view adding the created logical elements.
addElements()1280332a8e7SCarlos Alberto Enciso void ReaderTestSelection::addElements() {
1290332a8e7SCarlos Alberto Enciso   setCompileUnit(CompileUnit);
1300332a8e7SCarlos Alberto Enciso 
1310332a8e7SCarlos Alberto Enciso   // Root
1320332a8e7SCarlos Alberto Enciso   //   CompileUnit
1330332a8e7SCarlos Alberto Enciso   //     IntegerType
1340332a8e7SCarlos Alberto Enciso   //     Namespace
1350332a8e7SCarlos Alberto Enciso   //       Aggregate
1360332a8e7SCarlos Alberto Enciso   //         ClassMember
1370332a8e7SCarlos Alberto Enciso   //     Function
1380332a8e7SCarlos Alberto Enciso   //       Parameter
1390332a8e7SCarlos Alberto Enciso   //       LocalVariable
1400332a8e7SCarlos Alberto Enciso   //       LineOne
1410332a8e7SCarlos Alberto Enciso   //       LineTwo
1420332a8e7SCarlos Alberto Enciso   //       NestedScope
1430332a8e7SCarlos Alberto Enciso   //         NestedVariable
1440332a8e7SCarlos Alberto Enciso   //         LineThree
1450332a8e7SCarlos Alberto Enciso   //         LineFour
1460332a8e7SCarlos Alberto Enciso   //       LineFive
1470332a8e7SCarlos Alberto Enciso 
1480332a8e7SCarlos Alberto Enciso   // Add elements to Root.
1490332a8e7SCarlos Alberto Enciso   add(Root, CompileUnit);
1500332a8e7SCarlos Alberto Enciso 
1510332a8e7SCarlos Alberto Enciso   // Add elements to CompileUnit.
1520332a8e7SCarlos Alberto Enciso   add(CompileUnit, IntegerType);
1530332a8e7SCarlos Alberto Enciso   add(CompileUnit, Namespace);
1540332a8e7SCarlos Alberto Enciso   add(CompileUnit, Function);
1550332a8e7SCarlos Alberto Enciso 
1560332a8e7SCarlos Alberto Enciso   // Add elements to Namespace.
1570332a8e7SCarlos Alberto Enciso   add(Namespace, Aggregate);
1580332a8e7SCarlos Alberto Enciso 
1590332a8e7SCarlos Alberto Enciso   // Add elements to Function.
1600332a8e7SCarlos Alberto Enciso   add(Function, Parameter);
1610332a8e7SCarlos Alberto Enciso   add(Function, LocalVariable);
1620332a8e7SCarlos Alberto Enciso   add(Function, LineOne);
1630332a8e7SCarlos Alberto Enciso   add(Function, LineTwo);
1640332a8e7SCarlos Alberto Enciso   add(Function, LineFive);
1650332a8e7SCarlos Alberto Enciso   add(Function, NestedScope);
1660332a8e7SCarlos Alberto Enciso 
1670332a8e7SCarlos Alberto Enciso   // Add elements to Aggregate.
1680332a8e7SCarlos Alberto Enciso   add(Aggregate, ClassMember);
1690332a8e7SCarlos Alberto Enciso 
1700332a8e7SCarlos Alberto Enciso   // Add elements to NestedScope.
1710332a8e7SCarlos Alberto Enciso   add(NestedScope, NestedVariable);
1720332a8e7SCarlos Alberto Enciso   add(NestedScope, LineThree);
1730332a8e7SCarlos Alberto Enciso   add(NestedScope, LineFour);
1740332a8e7SCarlos Alberto Enciso }
1750332a8e7SCarlos Alberto Enciso 
resolvePatterns(LVPatterns & Patterns)1760332a8e7SCarlos Alberto Enciso void ReaderTestSelection::resolvePatterns(LVPatterns &Patterns) {
1770332a8e7SCarlos Alberto Enciso   // Traverse the given scope and its children applying the pattern match.
1780332a8e7SCarlos Alberto Enciso   // Before applying the pattern, reset previous matched state.
1790332a8e7SCarlos Alberto Enciso   std::function<void(LVScope * Parent)> TraverseScope = [&](LVScope *Parent) {
1800332a8e7SCarlos Alberto Enciso     auto Traverse = [&](const auto *Set) {
1810332a8e7SCarlos Alberto Enciso       if (Set)
1820332a8e7SCarlos Alberto Enciso         for (const auto &Entry : *Set) {
1830332a8e7SCarlos Alberto Enciso           Entry->resetIsMatched();
1840332a8e7SCarlos Alberto Enciso           Patterns.resolvePatternMatch(Entry);
1850332a8e7SCarlos Alberto Enciso         }
1860332a8e7SCarlos Alberto Enciso     };
1870332a8e7SCarlos Alberto Enciso 
1880332a8e7SCarlos Alberto Enciso     Parent->resetIsMatched();
1890332a8e7SCarlos Alberto Enciso     Patterns.resolvePatternMatch(Parent);
1900332a8e7SCarlos Alberto Enciso 
1910332a8e7SCarlos Alberto Enciso     Traverse(Parent->getSymbols());
1920332a8e7SCarlos Alberto Enciso     Traverse(Parent->getTypes());
1930332a8e7SCarlos Alberto Enciso     Traverse(Parent->getLines());
1940332a8e7SCarlos Alberto Enciso 
1950332a8e7SCarlos Alberto Enciso     if (const LVScopes *Scopes = Parent->getScopes())
1960332a8e7SCarlos Alberto Enciso       for (LVScope *Scope : *Scopes) {
1970332a8e7SCarlos Alberto Enciso         Scope->resetIsMatched();
1980332a8e7SCarlos Alberto Enciso         Patterns.resolvePatternMatch(Scope);
1990332a8e7SCarlos Alberto Enciso         TraverseScope(Scope);
2000332a8e7SCarlos Alberto Enciso       }
2010332a8e7SCarlos Alberto Enciso   };
2020332a8e7SCarlos Alberto Enciso 
2030332a8e7SCarlos Alberto Enciso   // Start traversing the scopes root and apply any matching pattern.
2040332a8e7SCarlos Alberto Enciso   TraverseScope(Root);
2050332a8e7SCarlos Alberto Enciso }
2060332a8e7SCarlos Alberto Enciso 
2070332a8e7SCarlos Alberto Enciso // Set initial values to logical elements.
initElements()2080332a8e7SCarlos Alberto Enciso void ReaderTestSelection::initElements() {
2090332a8e7SCarlos Alberto Enciso   // Types.
2100332a8e7SCarlos Alberto Enciso   set(IntegerType, "int", 0x1000);
2110332a8e7SCarlos Alberto Enciso 
2120332a8e7SCarlos Alberto Enciso   // Scopes.
2130332a8e7SCarlos Alberto Enciso   set(CompileUnit, "test.cpp", 0x2000);
2140332a8e7SCarlos Alberto Enciso   set(Namespace, "anyNamespace", 0x3000, 300);
2150332a8e7SCarlos Alberto Enciso   set(Aggregate, "anyClass", 0x4000, 400);
2160332a8e7SCarlos Alberto Enciso   set(Function, "anyFunction", 0x5000, 500, IntegerType);
2170332a8e7SCarlos Alberto Enciso   set(NestedScope, "", 0x6000, 600);
2180332a8e7SCarlos Alberto Enciso 
2190332a8e7SCarlos Alberto Enciso   // Symbols.
2200332a8e7SCarlos Alberto Enciso   set(Parameter, "Param", 0x5100, 510, IntegerType);
2210332a8e7SCarlos Alberto Enciso   set(LocalVariable, "LocalVariable", 0x5200, 520, IntegerType);
2220332a8e7SCarlos Alberto Enciso   set(NestedVariable, "NestedVariable", 0x6200, 620, IntegerType);
2230332a8e7SCarlos Alberto Enciso 
2240332a8e7SCarlos Alberto Enciso   // Lines.
2250332a8e7SCarlos Alberto Enciso   set(LineOne, "", 0x5110, 511);
2260332a8e7SCarlos Alberto Enciso   set(LineTwo, "", 0x5210, 521);
2270332a8e7SCarlos Alberto Enciso   set(LineThree, "", 0x6110, 611);
2280332a8e7SCarlos Alberto Enciso   set(LineFour, "", 0x6210, 621);
2290332a8e7SCarlos Alberto Enciso   set(LineFive, "", 0x7110, 711);
2300332a8e7SCarlos Alberto Enciso }
2310332a8e7SCarlos Alberto Enciso 
2320332a8e7SCarlos Alberto Enciso // Check logical elements kind patterns.
checkKindPatterns()2330332a8e7SCarlos Alberto Enciso void ReaderTestSelection::checkKindPatterns() {
2340332a8e7SCarlos Alberto Enciso   // Add patterns.
2350332a8e7SCarlos Alberto Enciso   LVPatterns &Patterns = patterns();
2360332a8e7SCarlos Alberto Enciso   Patterns.clear();
2370332a8e7SCarlos Alberto Enciso 
2380332a8e7SCarlos Alberto Enciso   LVElementKindSet KindElements; // --select-elements=<Kind>
2390332a8e7SCarlos Alberto Enciso   LVLineKindSet KindLines;       // --select-lines=<Kind>
2400332a8e7SCarlos Alberto Enciso   LVScopeKindSet KindScopes;     // --select-scopes=<Kind>
2410332a8e7SCarlos Alberto Enciso   LVSymbolKindSet KindSymbols;   // --select-symbols=<Kind>
2420332a8e7SCarlos Alberto Enciso   LVTypeKindSelection KindTypes; // --select-types=<Kind>
2430332a8e7SCarlos Alberto Enciso 
2440332a8e7SCarlos Alberto Enciso   KindElements.insert(LVElementKind::Global);
2450332a8e7SCarlos Alberto Enciso   KindLines.insert(LVLineKind::IsLineDebug);
2460332a8e7SCarlos Alberto Enciso   KindLines.insert(LVLineKind::IsNewStatement);
2470332a8e7SCarlos Alberto Enciso   KindLines.insert(LVLineKind::IsLineAssembler);
2480332a8e7SCarlos Alberto Enciso   KindScopes.insert(LVScopeKind::IsLexicalBlock);
2490332a8e7SCarlos Alberto Enciso   KindSymbols.insert(LVSymbolKind::IsMember);
2500332a8e7SCarlos Alberto Enciso   KindSymbols.insert(LVSymbolKind::IsParameter);
2510332a8e7SCarlos Alberto Enciso   KindTypes.insert(LVTypeKind::IsBase);
2520332a8e7SCarlos Alberto Enciso 
2530332a8e7SCarlos Alberto Enciso   // Add requests based on the element kind.
2540332a8e7SCarlos Alberto Enciso   Patterns.addRequest(KindElements);
2550332a8e7SCarlos Alberto Enciso   Patterns.addRequest(KindLines);
2560332a8e7SCarlos Alberto Enciso   Patterns.addRequest(KindScopes);
2570332a8e7SCarlos Alberto Enciso   Patterns.addRequest(KindSymbols);
2580332a8e7SCarlos Alberto Enciso   Patterns.addRequest(KindTypes);
2590332a8e7SCarlos Alberto Enciso 
2600332a8e7SCarlos Alberto Enciso   // Apply the collected patterns.
2610332a8e7SCarlos Alberto Enciso   resolvePatterns(Patterns);
2620332a8e7SCarlos Alberto Enciso 
2630332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(CompileUnit->getIsMatched());
2640332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Namespace->getIsMatched());
2650332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Aggregate->getIsMatched());
2660332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Function->getIsMatched());
2670332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(NestedScope->getIsMatched());
2680332a8e7SCarlos Alberto Enciso 
2690332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(IntegerType->getIsMatched());
2700332a8e7SCarlos Alberto Enciso 
2710332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(ClassMember->getIsMatched());
2720332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(Parameter->getIsMatched());
2730332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LocalVariable->getIsMatched());
2740332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(NestedVariable->getIsMatched());
2750332a8e7SCarlos Alberto Enciso 
2760332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineOne->getIsMatched());
2770332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineTwo->getIsMatched());
2780332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineThree->getIsMatched());
2790332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineFour->getIsMatched());
2800332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineFive->getIsMatched());
2810332a8e7SCarlos Alberto Enciso }
2820332a8e7SCarlos Alberto Enciso 
2830332a8e7SCarlos Alberto Enciso // Check logical elements generic patterns (Case sensitive).
checkGenericPatterns()2840332a8e7SCarlos Alberto Enciso void ReaderTestSelection::checkGenericPatterns() {
2850332a8e7SCarlos Alberto Enciso   // Add patterns.
2860332a8e7SCarlos Alberto Enciso   LVPatterns &Patterns = patterns();
2870332a8e7SCarlos Alberto Enciso   Patterns.clear();
2880332a8e7SCarlos Alberto Enciso 
2890332a8e7SCarlos Alberto Enciso   StringSet<> Generic;                      // --select=<Pattern>
2900332a8e7SCarlos Alberto Enciso   Generic.insert(Function->getName());      // anyFunction
2910332a8e7SCarlos Alberto Enciso   Generic.insert(Namespace->getName());     // anyNamespace
2920332a8e7SCarlos Alberto Enciso   Generic.insert(LocalVariable->getName()); // LocalVariable
2930332a8e7SCarlos Alberto Enciso 
2940332a8e7SCarlos Alberto Enciso   LVOffsetSet Offsets; // --select-offset=<Offset>
2950332a8e7SCarlos Alberto Enciso   Offsets.insert(IntegerType->getOffset());
2960332a8e7SCarlos Alberto Enciso   Offsets.insert(LineOne->getOffset());
2970332a8e7SCarlos Alberto Enciso   Offsets.insert(LineTwo->getOffset());
2980332a8e7SCarlos Alberto Enciso 
2990332a8e7SCarlos Alberto Enciso   // Add requests based on the generic string and offset.
3000332a8e7SCarlos Alberto Enciso   Patterns.addGenericPatterns(Generic);
3010332a8e7SCarlos Alberto Enciso   Patterns.addOffsetPatterns(Offsets);
3020332a8e7SCarlos Alberto Enciso 
3030332a8e7SCarlos Alberto Enciso   // Apply the collected patterns.
3040332a8e7SCarlos Alberto Enciso   resolvePatterns(Patterns);
3050332a8e7SCarlos Alberto Enciso 
3060332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(CompileUnit->getIsMatched());
3070332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(Namespace->getIsMatched());
3080332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Aggregate->getIsMatched());
3090332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(Function->getIsMatched());
3100332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(NestedScope->getIsMatched());
3110332a8e7SCarlos Alberto Enciso 
3120332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(IntegerType->getIsMatched());
3130332a8e7SCarlos Alberto Enciso 
3140332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(ClassMember->getIsMatched());
3150332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Parameter->getIsMatched());
3160332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LocalVariable->getIsMatched());
3170332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(NestedVariable->getIsMatched());
3180332a8e7SCarlos Alberto Enciso 
3190332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineOne->getIsMatched());
3200332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineTwo->getIsMatched());
3210332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineThree->getIsMatched());
3220332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineFour->getIsMatched());
3230332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineFive->getIsMatched());
3240332a8e7SCarlos Alberto Enciso }
3250332a8e7SCarlos Alberto Enciso 
3260332a8e7SCarlos Alberto Enciso // Check logical elements flexible patterns (case insensitive, RegEx).
checkFlexiblePatterns()3270332a8e7SCarlos Alberto Enciso void ReaderTestSelection::checkFlexiblePatterns() {
3280332a8e7SCarlos Alberto Enciso   options().setSelectIgnoreCase();
3290332a8e7SCarlos Alberto Enciso   options().setSelectUseRegex();
3300332a8e7SCarlos Alberto Enciso 
3310332a8e7SCarlos Alberto Enciso   // Add patterns.
3320332a8e7SCarlos Alberto Enciso   LVPatterns &Patterns = patterns();
3330332a8e7SCarlos Alberto Enciso   Patterns.clear();
3340332a8e7SCarlos Alberto Enciso 
3350332a8e7SCarlos Alberto Enciso   StringSet<> Generic; // --select=<Pattern>
3360332a8e7SCarlos Alberto Enciso   Generic.insert("function");
3370332a8e7SCarlos Alberto Enciso   Generic.insert("NaMeSpAcE");
3380332a8e7SCarlos Alberto Enciso   Generic.insert("[a-z]*Variable");
3390332a8e7SCarlos Alberto Enciso   Generic.insert("[0-9]21");
3400332a8e7SCarlos Alberto Enciso 
3410332a8e7SCarlos Alberto Enciso   // Add requests based on the flexible string.
3420332a8e7SCarlos Alberto Enciso   Patterns.addGenericPatterns(Generic);
3430332a8e7SCarlos Alberto Enciso 
3440332a8e7SCarlos Alberto Enciso   // Apply the collected patterns.
3450332a8e7SCarlos Alberto Enciso   resolvePatterns(Patterns);
3460332a8e7SCarlos Alberto Enciso 
3470332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(CompileUnit->getIsMatched());
3480332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(Namespace->getIsMatched()); // anyNamespace
3490332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Aggregate->getIsMatched());
3500332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(Function->getIsMatched()); // anyFunction
3510332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(NestedScope->getIsMatched());
3520332a8e7SCarlos Alberto Enciso 
3530332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(IntegerType->getIsMatched());
3540332a8e7SCarlos Alberto Enciso 
3550332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(ClassMember->getIsMatched());
3560332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(Parameter->getIsMatched());
3570332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LocalVariable->getIsMatched());  // LocalVariable
3580332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(NestedVariable->getIsMatched()); // NestedVariable
3590332a8e7SCarlos Alberto Enciso 
3600332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineOne->getIsMatched());
3610332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineTwo->getIsMatched()); // 521
3620332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineThree->getIsMatched());
3630332a8e7SCarlos Alberto Enciso   EXPECT_TRUE(LineFour->getIsMatched()); // 621
3640332a8e7SCarlos Alberto Enciso   EXPECT_FALSE(LineFive->getIsMatched());
3650332a8e7SCarlos Alberto Enciso }
3660332a8e7SCarlos Alberto Enciso 
TEST(LogicalViewTest,SelectElements)3670332a8e7SCarlos Alberto Enciso TEST(LogicalViewTest, SelectElements) {
3680332a8e7SCarlos Alberto Enciso   ScopedPrinter W(outs());
3690332a8e7SCarlos Alberto Enciso   ReaderTestSelection Reader(W);
3700332a8e7SCarlos Alberto Enciso 
3710332a8e7SCarlos Alberto Enciso   // Reader options.
3720332a8e7SCarlos Alberto Enciso   LVOptions ReaderOptions;
3730332a8e7SCarlos Alberto Enciso   ReaderOptions.setAttributeOffset();
3740332a8e7SCarlos Alberto Enciso   ReaderOptions.setPrintAll();
3750332a8e7SCarlos Alberto Enciso   ReaderOptions.setReportList();
3760332a8e7SCarlos Alberto Enciso   ReaderOptions.setReportAnyView();
3770332a8e7SCarlos Alberto Enciso 
3780332a8e7SCarlos Alberto Enciso   ReaderOptions.resolveDependencies();
3790332a8e7SCarlos Alberto Enciso   options().setOptions(&ReaderOptions);
3800332a8e7SCarlos Alberto Enciso 
3810332a8e7SCarlos Alberto Enciso   Reader.createElements();
3820332a8e7SCarlos Alberto Enciso   Reader.addElements();
3830332a8e7SCarlos Alberto Enciso   Reader.initElements();
3840332a8e7SCarlos Alberto Enciso   Reader.checkKindPatterns();
3850332a8e7SCarlos Alberto Enciso   Reader.checkGenericPatterns();
3860332a8e7SCarlos Alberto Enciso   Reader.checkFlexiblePatterns();
3870332a8e7SCarlos Alberto Enciso }
3880332a8e7SCarlos Alberto Enciso 
3890332a8e7SCarlos Alberto Enciso } // namespace
390