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