xref: /llvm-project/llvm/unittests/DebugInfo/LogicalView/CompareElementsTest.cpp (revision 7fbcc24409efdb37cec79ad461ef383f6ffc5ef2)
1e98a4c5aSCarlos Alberto Enciso //===- llvm/unittest/DebugInfo/LogicalView/CompareElementsTest.cpp --------===//
2e98a4c5aSCarlos Alberto Enciso //
3e98a4c5aSCarlos Alberto Enciso // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e98a4c5aSCarlos Alberto Enciso // See https://llvm.org/LICENSE.txt for license information.
5e98a4c5aSCarlos Alberto Enciso // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e98a4c5aSCarlos Alberto Enciso //
7e98a4c5aSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
8e98a4c5aSCarlos Alberto Enciso 
9e98a4c5aSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVCompare.h"
10e98a4c5aSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVLine.h"
11e98a4c5aSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
12e98a4c5aSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVScope.h"
13e98a4c5aSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVSymbol.h"
14e98a4c5aSCarlos Alberto Enciso #include "llvm/DebugInfo/LogicalView/Core/LVType.h"
15e98a4c5aSCarlos Alberto Enciso #include "llvm/Support/ScopedPrinter.h"
16e98a4c5aSCarlos Alberto Enciso #include "llvm/Support/ToolOutputFile.h"
17e98a4c5aSCarlos Alberto Enciso #include "llvm/Testing/Support/Error.h"
18e98a4c5aSCarlos Alberto Enciso 
19e98a4c5aSCarlos Alberto Enciso #include "gtest/gtest.h"
20e98a4c5aSCarlos Alberto Enciso 
21e98a4c5aSCarlos Alberto Enciso using namespace llvm;
22e98a4c5aSCarlos Alberto Enciso using namespace llvm::logicalview;
23e98a4c5aSCarlos Alberto Enciso 
24e98a4c5aSCarlos Alberto Enciso namespace {
25e98a4c5aSCarlos Alberto Enciso 
26e98a4c5aSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
27e98a4c5aSCarlos Alberto Enciso // Basic Reader functionality.
28e98a4c5aSCarlos Alberto Enciso class ReaderTestCompare : public LVReader {
29*7fbcc244SCarlos Alberto Enciso #define CREATE(VARIABLE, CREATE_FUNCTION, SET_FUNCTION)                        \
30*7fbcc244SCarlos Alberto Enciso   VARIABLE = CREATE_FUNCTION();                                                \
31*7fbcc244SCarlos Alberto Enciso   EXPECT_NE(VARIABLE, nullptr);                                                \
32*7fbcc244SCarlos Alberto Enciso   VARIABLE->SET_FUNCTION();
33cddea676SCarlos Alberto Enciso 
34e98a4c5aSCarlos Alberto Enciso public:
35e98a4c5aSCarlos Alberto Enciso   // Types.
36e98a4c5aSCarlos Alberto Enciso   LVType *IntegerType = nullptr;
37e98a4c5aSCarlos Alberto Enciso   LVType *UnsignedType = nullptr;
38e98a4c5aSCarlos Alberto Enciso   LVType *GlobalType = nullptr;
39e98a4c5aSCarlos Alberto Enciso   LVType *LocalType = nullptr;
40e98a4c5aSCarlos Alberto Enciso   LVType *NestedType = nullptr;
41e98a4c5aSCarlos Alberto Enciso   LVTypeDefinition *TypeDefinitionOne = nullptr;
42e98a4c5aSCarlos Alberto Enciso   LVTypeDefinition *TypeDefinitionTwo = nullptr;
43e98a4c5aSCarlos Alberto Enciso   LVTypeEnumerator *EnumeratorOne = nullptr;
44e98a4c5aSCarlos Alberto Enciso   LVTypeEnumerator *EnumeratorTwo = nullptr;
45e98a4c5aSCarlos Alberto Enciso 
46e98a4c5aSCarlos Alberto Enciso   // Scopes.
47e98a4c5aSCarlos Alberto Enciso   LVScope *NestedScope = nullptr;
48e98a4c5aSCarlos Alberto Enciso   LVScope *InnerScope = nullptr;
49e98a4c5aSCarlos Alberto Enciso   LVScopeAggregate *Aggregate = nullptr;
50e98a4c5aSCarlos Alberto Enciso   LVScopeEnumeration *Enumeration = nullptr;
51e98a4c5aSCarlos Alberto Enciso   LVScopeFunction *FunctionOne = nullptr;
52e98a4c5aSCarlos Alberto Enciso   LVScopeFunction *FunctionTwo = nullptr;
53e98a4c5aSCarlos Alberto Enciso   LVScopeNamespace *Namespace = nullptr;
54e98a4c5aSCarlos Alberto Enciso 
55e98a4c5aSCarlos Alberto Enciso   // Symbols.
56e98a4c5aSCarlos Alberto Enciso   LVSymbol *GlobalVariable = nullptr;
57e98a4c5aSCarlos Alberto Enciso   LVSymbol *LocalVariable = nullptr;
58e98a4c5aSCarlos Alberto Enciso   LVSymbol *ClassMember = nullptr;
59e98a4c5aSCarlos Alberto Enciso   LVSymbol *NestedVariable = nullptr;
60e98a4c5aSCarlos Alberto Enciso   LVSymbol *ParameterOne = nullptr;
61e98a4c5aSCarlos Alberto Enciso   LVSymbol *ParameterTwo = nullptr;
62e98a4c5aSCarlos Alberto Enciso 
63e98a4c5aSCarlos Alberto Enciso   // Lines.
64e98a4c5aSCarlos Alberto Enciso   LVLine *LineOne = nullptr;
65e98a4c5aSCarlos Alberto Enciso   LVLine *LineTwo = nullptr;
66e98a4c5aSCarlos Alberto Enciso   LVLine *LineThree = nullptr;
67e98a4c5aSCarlos Alberto Enciso 
68e98a4c5aSCarlos Alberto Enciso protected:
69e98a4c5aSCarlos Alberto Enciso   void add(LVScope *Parent, LVElement *Element);
70e98a4c5aSCarlos Alberto Enciso   void set(LVElement *Element, StringRef Name, LVOffset Offset,
71e98a4c5aSCarlos Alberto Enciso            uint32_t LineNumber = 0, LVElement *Type = nullptr);
72e98a4c5aSCarlos Alberto Enciso 
73e98a4c5aSCarlos Alberto Enciso public:
ReaderTestCompare(ScopedPrinter & W)74e98a4c5aSCarlos Alberto Enciso   ReaderTestCompare(ScopedPrinter &W) : LVReader("", "", W) {
75e98a4c5aSCarlos Alberto Enciso     setInstance(this);
76e98a4c5aSCarlos Alberto Enciso   }
77e98a4c5aSCarlos Alberto Enciso 
createScopes()78e98a4c5aSCarlos Alberto Enciso   Error createScopes() { return LVReader::createScopes(); }
printScopes()79e98a4c5aSCarlos Alberto Enciso   Error printScopes() { return LVReader::printScopes(); }
80e98a4c5aSCarlos Alberto Enciso 
81e98a4c5aSCarlos Alberto Enciso   void createElements();
82e98a4c5aSCarlos Alberto Enciso   void addElements(bool IsReference, bool IsTarget);
83e98a4c5aSCarlos Alberto Enciso   void initElements();
84e98a4c5aSCarlos Alberto Enciso };
85e98a4c5aSCarlos Alberto Enciso 
86e98a4c5aSCarlos Alberto Enciso // Helper function to add a logical element to a given scope.
add(LVScope * Parent,LVElement * Child)87e98a4c5aSCarlos Alberto Enciso void ReaderTestCompare::add(LVScope *Parent, LVElement *Child) {
88e98a4c5aSCarlos Alberto Enciso   Parent->addElement(Child);
89e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Child->getParent(), Parent);
90e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Child->getLevel(), Parent->getLevel() + 1);
91e98a4c5aSCarlos Alberto Enciso }
92e98a4c5aSCarlos Alberto Enciso 
93e98a4c5aSCarlos 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)94e98a4c5aSCarlos Alberto Enciso void ReaderTestCompare::set(LVElement *Element, StringRef Name, LVOffset Offset,
95e98a4c5aSCarlos Alberto Enciso                             uint32_t LineNumber, LVElement *Type) {
96e98a4c5aSCarlos Alberto Enciso   Element->setName(Name);
97e98a4c5aSCarlos Alberto Enciso   Element->setOffset(Offset);
98e98a4c5aSCarlos Alberto Enciso   Element->setLineNumber(LineNumber);
99e98a4c5aSCarlos Alberto Enciso   Element->setType(Type);
100e98a4c5aSCarlos Alberto Enciso }
101e98a4c5aSCarlos Alberto Enciso 
102e98a4c5aSCarlos Alberto Enciso //===----------------------------------------------------------------------===//
103e98a4c5aSCarlos Alberto Enciso // Create the logical elements.
createElements()104e98a4c5aSCarlos Alberto Enciso void ReaderTestCompare::createElements() {
105e98a4c5aSCarlos Alberto Enciso   // Create scope root.
106e98a4c5aSCarlos Alberto Enciso   Error Err = createScopes();
107e98a4c5aSCarlos Alberto Enciso   ASSERT_THAT_ERROR(std::move(Err), Succeeded());
108e98a4c5aSCarlos Alberto Enciso   Root = getScopesRoot();
109cddea676SCarlos Alberto Enciso   ASSERT_NE(Root, nullptr);
110e98a4c5aSCarlos Alberto Enciso 
111e98a4c5aSCarlos Alberto Enciso   // Create the logical types.
112*7fbcc244SCarlos Alberto Enciso   CREATE(IntegerType, createType, setIsBase);
113*7fbcc244SCarlos Alberto Enciso   CREATE(UnsignedType, createType, setIsBase);
114*7fbcc244SCarlos Alberto Enciso   CREATE(GlobalType, createType, setIsBase);
115*7fbcc244SCarlos Alberto Enciso   CREATE(LocalType, createType, setIsBase);
116*7fbcc244SCarlos Alberto Enciso   CREATE(NestedType, createType, setIsBase);
117*7fbcc244SCarlos Alberto Enciso   CREATE(EnumeratorOne, createTypeEnumerator, setIsEnumerator);
118*7fbcc244SCarlos Alberto Enciso   CREATE(EnumeratorTwo, createTypeEnumerator, setIsEnumerator);
119*7fbcc244SCarlos Alberto Enciso   CREATE(TypeDefinitionOne, createTypeDefinition, setIsTypedef);
120*7fbcc244SCarlos Alberto Enciso   CREATE(TypeDefinitionTwo, createTypeDefinition, setIsTypedef);
121e98a4c5aSCarlos Alberto Enciso 
122e98a4c5aSCarlos Alberto Enciso   // Create the logical scopes.
123*7fbcc244SCarlos Alberto Enciso   CREATE(NestedScope, createScope, setIsLexicalBlock);
124*7fbcc244SCarlos Alberto Enciso   CREATE(InnerScope, createScope, setIsLexicalBlock);
125*7fbcc244SCarlos Alberto Enciso   CREATE(Aggregate, createScopeAggregate, setIsAggregate);
126*7fbcc244SCarlos Alberto Enciso   CREATE(CompileUnit, createScopeCompileUnit, setIsCompileUnit);
127*7fbcc244SCarlos Alberto Enciso   CREATE(Enumeration, createScopeEnumeration, setIsEnumeration);
128*7fbcc244SCarlos Alberto Enciso   CREATE(FunctionOne, createScopeFunction, setIsFunction);
129*7fbcc244SCarlos Alberto Enciso   CREATE(FunctionTwo, createScopeFunction, setIsFunction);
130*7fbcc244SCarlos Alberto Enciso   CREATE(Namespace, createScopeNamespace, setIsNamespace);
131e98a4c5aSCarlos Alberto Enciso 
132e98a4c5aSCarlos Alberto Enciso   // Create the logical symbols.
133*7fbcc244SCarlos Alberto Enciso   CREATE(GlobalVariable, createSymbol, setIsVariable);
134*7fbcc244SCarlos Alberto Enciso   CREATE(LocalVariable, createSymbol, setIsVariable);
135*7fbcc244SCarlos Alberto Enciso   CREATE(ClassMember, createSymbol, setIsMember);
136*7fbcc244SCarlos Alberto Enciso   CREATE(NestedVariable, createSymbol, setIsVariable);
137*7fbcc244SCarlos Alberto Enciso   CREATE(ParameterOne, createSymbol, setIsParameter);
138*7fbcc244SCarlos Alberto Enciso   CREATE(ParameterTwo, createSymbol, setIsParameter);
139e98a4c5aSCarlos Alberto Enciso 
140e98a4c5aSCarlos Alberto Enciso   // Create the logical lines.
141*7fbcc244SCarlos Alberto Enciso   CREATE(LineOne, createLine, setIsLineDebug);
142*7fbcc244SCarlos Alberto Enciso   CREATE(LineTwo, createLine, setIsLineDebug);
143*7fbcc244SCarlos Alberto Enciso   CREATE(LineThree, createLine, setIsLineDebug);
144e98a4c5aSCarlos Alberto Enciso }
145e98a4c5aSCarlos Alberto Enciso 
146e98a4c5aSCarlos Alberto Enciso // Reference Reader:              Target Reader:
147e98a4c5aSCarlos Alberto Enciso // ----------------------         ----------------------
148e98a4c5aSCarlos Alberto Enciso // Root                           Root
149e98a4c5aSCarlos Alberto Enciso //   CompileUnit                    CompileUnit
150e98a4c5aSCarlos Alberto Enciso //     IntegerType                    IntegerType
151e98a4c5aSCarlos Alberto Enciso //     UnsignedType                   UnsignedType
152e98a4c5aSCarlos Alberto Enciso //     FunctionOne                    FunctionOne
153e98a4c5aSCarlos Alberto Enciso //       ParameterOne                   ParameterOne
154e98a4c5aSCarlos Alberto Enciso //       LocalVariable                  ---
155e98a4c5aSCarlos Alberto Enciso //       LocalType                      LocalType
156e98a4c5aSCarlos Alberto Enciso //       LineOne                        LineOne
157e98a4c5aSCarlos Alberto Enciso //       NestedScope                    NestedScope
158e98a4c5aSCarlos Alberto Enciso //         NestedVariable                 NestedVariable
159e98a4c5aSCarlos Alberto Enciso //         NestedType                     NestedType
160e98a4c5aSCarlos Alberto Enciso //         LineTwo                        ---
161e98a4c5aSCarlos Alberto Enciso //         InnerScope                     InnerScope
162e98a4c5aSCarlos Alberto Enciso //           ---                            LineThree
163e98a4c5aSCarlos Alberto Enciso //     ---                            FunctionTwo
164e98a4c5aSCarlos Alberto Enciso //     ---                              ParameterTwo
165e98a4c5aSCarlos Alberto Enciso //     GlobalVariable                 GlobalVariable
166e98a4c5aSCarlos Alberto Enciso //     GlobalType                     GlobalType
167e98a4c5aSCarlos Alberto Enciso //     Namespace                      Namespace
168e98a4c5aSCarlos Alberto Enciso //       Aggregate                      Aggregate
169e98a4c5aSCarlos Alberto Enciso //         ClassMember                    ClassMember
170e98a4c5aSCarlos Alberto Enciso //       Enumeration                    Enumeration
171e98a4c5aSCarlos Alberto Enciso //         EnumeratorOne                  EnumeratorOne
172e98a4c5aSCarlos Alberto Enciso //         EnumeratorTwo                  EnumeratorTwo
173e98a4c5aSCarlos Alberto Enciso //       TypeDefinitionOne              ---
174e98a4c5aSCarlos Alberto Enciso //       ---                            TypeDefinitionTwo
175e98a4c5aSCarlos Alberto Enciso 
176e98a4c5aSCarlos Alberto Enciso // Create the logical view adding the created logical elements.
addElements(bool IsReference,bool IsTarget)177e98a4c5aSCarlos Alberto Enciso void ReaderTestCompare::addElements(bool IsReference, bool IsTarget) {
178e98a4c5aSCarlos Alberto Enciso   Root->setName(IsReference ? "Reference-Reader" : "Target-Reader");
179e98a4c5aSCarlos Alberto Enciso 
180e98a4c5aSCarlos Alberto Enciso   auto Insert = [&](bool Insert, auto *Parent, auto *Child) {
181e98a4c5aSCarlos Alberto Enciso     if (Insert)
182e98a4c5aSCarlos Alberto Enciso       add(Parent, Child);
183e98a4c5aSCarlos Alberto Enciso   };
184e98a4c5aSCarlos Alberto Enciso 
185e98a4c5aSCarlos Alberto Enciso   setCompileUnit(CompileUnit);
186e98a4c5aSCarlos Alberto Enciso   add(Root, CompileUnit);
187e98a4c5aSCarlos Alberto Enciso 
188e98a4c5aSCarlos Alberto Enciso   // Add elements to CompileUnit.
189e98a4c5aSCarlos Alberto Enciso   Insert(true, CompileUnit, IntegerType);
190e98a4c5aSCarlos Alberto Enciso   Insert(true, CompileUnit, UnsignedType);
191e98a4c5aSCarlos Alberto Enciso   Insert(true, CompileUnit, FunctionOne);
192e98a4c5aSCarlos Alberto Enciso   Insert(IsTarget, CompileUnit, FunctionTwo);
193e98a4c5aSCarlos Alberto Enciso   Insert(true, CompileUnit, GlobalVariable);
194e98a4c5aSCarlos Alberto Enciso   Insert(true, CompileUnit, GlobalType);
195e98a4c5aSCarlos Alberto Enciso   Insert(true, CompileUnit, Namespace);
196e98a4c5aSCarlos Alberto Enciso 
197e98a4c5aSCarlos Alberto Enciso   // Add elements to Namespace.
198e98a4c5aSCarlos Alberto Enciso   Insert(true, Namespace, Aggregate);
199e98a4c5aSCarlos Alberto Enciso   Insert(true, Namespace, Enumeration);
200e98a4c5aSCarlos Alberto Enciso   Insert(IsReference, Namespace, TypeDefinitionOne);
201e98a4c5aSCarlos Alberto Enciso   Insert(IsTarget, Namespace, TypeDefinitionTwo);
202e98a4c5aSCarlos Alberto Enciso 
203e98a4c5aSCarlos Alberto Enciso   // Add elements to FunctionOne.
204e98a4c5aSCarlos Alberto Enciso   Insert(true, FunctionOne, ParameterOne);
205e98a4c5aSCarlos Alberto Enciso   Insert(IsReference, FunctionOne, LocalVariable);
206e98a4c5aSCarlos Alberto Enciso   Insert(true, FunctionOne, LocalType);
207e98a4c5aSCarlos Alberto Enciso   Insert(true, FunctionOne, LineOne);
208e98a4c5aSCarlos Alberto Enciso   Insert(true, FunctionOne, NestedScope);
209e98a4c5aSCarlos Alberto Enciso 
210e98a4c5aSCarlos Alberto Enciso   // Add elements to FunctionTwo.
211e98a4c5aSCarlos Alberto Enciso   Insert(IsTarget, FunctionTwo, ParameterTwo);
212e98a4c5aSCarlos Alberto Enciso 
213e98a4c5aSCarlos Alberto Enciso   // Add elements to NestedScope.
214e98a4c5aSCarlos Alberto Enciso   Insert(true, NestedScope, NestedVariable);
215e98a4c5aSCarlos Alberto Enciso   Insert(true, NestedScope, NestedType);
216e98a4c5aSCarlos Alberto Enciso   Insert(IsReference, NestedScope, LineTwo);
217e98a4c5aSCarlos Alberto Enciso   Insert(true, NestedScope, InnerScope);
218e98a4c5aSCarlos Alberto Enciso 
219e98a4c5aSCarlos Alberto Enciso   // Add elements to Enumeration.
220e98a4c5aSCarlos Alberto Enciso   Insert(true, Enumeration, EnumeratorOne);
221e98a4c5aSCarlos Alberto Enciso   Insert(true, Enumeration, EnumeratorTwo);
222e98a4c5aSCarlos Alberto Enciso 
223e98a4c5aSCarlos Alberto Enciso   // Add elements to Aggregate.
224e98a4c5aSCarlos Alberto Enciso   Insert(true, Aggregate, ClassMember);
225e98a4c5aSCarlos Alberto Enciso 
226e98a4c5aSCarlos Alberto Enciso   Insert(IsTarget, InnerScope, LineThree);
227e98a4c5aSCarlos Alberto Enciso }
228e98a4c5aSCarlos Alberto Enciso 
229e98a4c5aSCarlos Alberto Enciso // Set initial values to logical elements.
initElements()230e98a4c5aSCarlos Alberto Enciso void ReaderTestCompare::initElements() {
231e98a4c5aSCarlos Alberto Enciso   setFilename("LogicalElements.obj");
232e98a4c5aSCarlos Alberto Enciso 
233e98a4c5aSCarlos Alberto Enciso   Root->setFileFormatName("FileFormat");
234e98a4c5aSCarlos Alberto Enciso 
235e98a4c5aSCarlos Alberto Enciso   // Types.
236e98a4c5aSCarlos Alberto Enciso   set(IntegerType, "int", 0x1000);
237e98a4c5aSCarlos Alberto Enciso   set(UnsignedType, "unsigned", 0x1010);
238e98a4c5aSCarlos Alberto Enciso   set(GlobalType, "GlobalType", 0x1020, 1020);
239e98a4c5aSCarlos Alberto Enciso   set(LocalType, "LocalType", 0x1030, 1030);
240e98a4c5aSCarlos Alberto Enciso   set(NestedType, "NestedType", 0x1040, 1040);
241e98a4c5aSCarlos Alberto Enciso 
242e98a4c5aSCarlos Alberto Enciso   set(TypeDefinitionOne, "INTEGER", 0x1050, 1050, IntegerType);
243e98a4c5aSCarlos Alberto Enciso   set(TypeDefinitionTwo, "INT", 0x1060, 1060, TypeDefinitionOne);
244e98a4c5aSCarlos Alberto Enciso 
245e98a4c5aSCarlos Alberto Enciso   set(EnumeratorOne, "One", 0x1070, 1070);
246e98a4c5aSCarlos Alberto Enciso   EnumeratorOne->setValue("Blue");
247e98a4c5aSCarlos Alberto Enciso 
248e98a4c5aSCarlos Alberto Enciso   set(EnumeratorTwo, "Two", 0x1080, 1080);
249e98a4c5aSCarlos Alberto Enciso   EnumeratorTwo->setValue("Red");
250e98a4c5aSCarlos Alberto Enciso 
251e98a4c5aSCarlos Alberto Enciso   // Scopes.
252e98a4c5aSCarlos Alberto Enciso   set(Aggregate, "Class", 0x2000, 2000);
253e98a4c5aSCarlos Alberto Enciso   set(Enumeration, "Colors", 0x2010, 2010);
254e98a4c5aSCarlos Alberto Enciso   set(FunctionOne, "FunctionOne", 0x2020, 2020, GlobalType);
255e98a4c5aSCarlos Alberto Enciso   set(FunctionTwo, "FunctionTwo", 0x2030, 2030, GlobalType);
256e98a4c5aSCarlos Alberto Enciso   set(Namespace, "Namespace", 0x2040, 2040);
257e98a4c5aSCarlos Alberto Enciso   set(NestedScope, "", 0x2050, 2050);
258e98a4c5aSCarlos Alberto Enciso   set(InnerScope, "", 0x2060, 2060);
259e98a4c5aSCarlos Alberto Enciso   set(CompileUnit, "test.cpp", 0x2070, 2070);
260e98a4c5aSCarlos Alberto Enciso 
261e98a4c5aSCarlos Alberto Enciso   // Symbols.
262e98a4c5aSCarlos Alberto Enciso   set(GlobalVariable, "GlobalVariable", 0x3000, 3000);
263e98a4c5aSCarlos Alberto Enciso   set(LocalVariable, "LocalVariable", 0x3010, 3010, UnsignedType);
264e98a4c5aSCarlos Alberto Enciso   set(ClassMember, "ClassMember", 0x3020, 3020, IntegerType);
265e98a4c5aSCarlos Alberto Enciso   set(ParameterOne, "ParameterOne", 0x3030, 3030, UnsignedType);
266e98a4c5aSCarlos Alberto Enciso   set(ParameterTwo, "ParameterTwo", 0x3040, 3040, UnsignedType);
267e98a4c5aSCarlos Alberto Enciso   set(NestedVariable, "NestedVariable", 0x3050, 3050);
268e98a4c5aSCarlos Alberto Enciso 
269e98a4c5aSCarlos Alberto Enciso   // Lines.
270e98a4c5aSCarlos Alberto Enciso   set(LineOne, "", 0x4000, 4000);
271e98a4c5aSCarlos Alberto Enciso   set(LineTwo, "", 0x4010, 4010);
272e98a4c5aSCarlos Alberto Enciso   set(LineThree, "", 0x4020, 4020);
273e98a4c5aSCarlos Alberto Enciso }
274e98a4c5aSCarlos Alberto Enciso 
275e98a4c5aSCarlos Alberto Enciso // Compare the logical views.
compareReadersViews(ReaderTestCompare * ReferenceReader,ReaderTestCompare * TargetReader)276e98a4c5aSCarlos Alberto Enciso void compareReadersViews(ReaderTestCompare *ReferenceReader,
277e98a4c5aSCarlos Alberto Enciso                          ReaderTestCompare *TargetReader) {
278e98a4c5aSCarlos Alberto Enciso   LVCompare Compare(nulls());
279e98a4c5aSCarlos Alberto Enciso   Error Err = Compare.execute(ReferenceReader, TargetReader);
280e98a4c5aSCarlos Alberto Enciso   ASSERT_THAT_ERROR(std::move(Err), Succeeded());
281e98a4c5aSCarlos Alberto Enciso 
282e98a4c5aSCarlos Alberto Enciso   // Get comparison table.
283e98a4c5aSCarlos Alberto Enciso   LVPassTable PassTable = Compare.getPassTable();
284e98a4c5aSCarlos Alberto Enciso   ASSERT_EQ(PassTable.size(), 5u);
285e98a4c5aSCarlos Alberto Enciso 
286e98a4c5aSCarlos Alberto Enciso   LVReader *Reader;
287e98a4c5aSCarlos Alberto Enciso   LVElement *Element;
288e98a4c5aSCarlos Alberto Enciso   LVComparePass Pass;
289e98a4c5aSCarlos Alberto Enciso 
290e98a4c5aSCarlos Alberto Enciso   // Reference: Missing 'FunctionOne'
291e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[0];
292e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, ReferenceReader);
293e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, ReferenceReader->FunctionOne);
294e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Missing);
295e98a4c5aSCarlos Alberto Enciso 
296e98a4c5aSCarlos Alberto Enciso   // Reference: Missing 'TypeDefinitionOne'
297e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[1];
298e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, ReferenceReader);
299e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, ReferenceReader->TypeDefinitionOne);
300e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Missing);
301e98a4c5aSCarlos Alberto Enciso 
302e98a4c5aSCarlos Alberto Enciso   // Target: Added 'FunctionOne'
303e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[2];
304e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
305e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->FunctionOne);
306e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
307e98a4c5aSCarlos Alberto Enciso 
308e98a4c5aSCarlos Alberto Enciso   // Target: Added 'FunctionTwo'
309e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[3];
310e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
311e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->FunctionTwo);
312e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
313e98a4c5aSCarlos Alberto Enciso 
314e98a4c5aSCarlos Alberto Enciso   // Target: Added 'TypeDefinitionTwo'
315e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[4];
316e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
317e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->TypeDefinitionTwo);
318e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
319e98a4c5aSCarlos Alberto Enciso }
320e98a4c5aSCarlos Alberto Enciso 
321e98a4c5aSCarlos Alberto Enciso // Compare the logical elements.
compareReadersElements(ReaderTestCompare * ReferenceReader,ReaderTestCompare * TargetReader)322e98a4c5aSCarlos Alberto Enciso void compareReadersElements(ReaderTestCompare *ReferenceReader,
323e98a4c5aSCarlos Alberto Enciso                             ReaderTestCompare *TargetReader) {
324e98a4c5aSCarlos Alberto Enciso   LVCompare Compare(nulls());
325e98a4c5aSCarlos Alberto Enciso   Error Err = Compare.execute(ReferenceReader, TargetReader);
326e98a4c5aSCarlos Alberto Enciso   ASSERT_THAT_ERROR(std::move(Err), Succeeded());
327e98a4c5aSCarlos Alberto Enciso 
328e98a4c5aSCarlos Alberto Enciso   // Get comparison table.
329e98a4c5aSCarlos Alberto Enciso   LVPassTable PassTable = Compare.getPassTable();
330e98a4c5aSCarlos Alberto Enciso   ASSERT_EQ(PassTable.size(), 7u);
331e98a4c5aSCarlos Alberto Enciso 
332e98a4c5aSCarlos Alberto Enciso   LVReader *Reader;
333e98a4c5aSCarlos Alberto Enciso   LVElement *Element;
334e98a4c5aSCarlos Alberto Enciso   LVComparePass Pass;
335e98a4c5aSCarlos Alberto Enciso 
336e98a4c5aSCarlos Alberto Enciso   // Reference: Missing 'LocalVariable'
337e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[0];
338e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, ReferenceReader);
339e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, ReferenceReader->LocalVariable);
340e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Missing);
341e98a4c5aSCarlos Alberto Enciso 
342e98a4c5aSCarlos Alberto Enciso   // Reference: Missing 'TypeDefinitionOne'
343e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[1];
344e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, ReferenceReader);
345e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, ReferenceReader->TypeDefinitionOne);
346e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Missing);
347e98a4c5aSCarlos Alberto Enciso 
348e98a4c5aSCarlos Alberto Enciso   // Reference: Missing 'LineTwo'
349e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[2];
350e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, ReferenceReader);
351e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, ReferenceReader->LineTwo);
352e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Missing);
353e98a4c5aSCarlos Alberto Enciso 
354e98a4c5aSCarlos Alberto Enciso   // Target: Added 'FunctionTwo'
355e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[3];
356e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
357e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->FunctionTwo);
358e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
359e98a4c5aSCarlos Alberto Enciso 
360e98a4c5aSCarlos Alberto Enciso   // Target: Added 'ParameterTwo'
361e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[4];
362e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
363e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->ParameterTwo);
364e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
365e98a4c5aSCarlos Alberto Enciso 
366e98a4c5aSCarlos Alberto Enciso   // Target: Added 'TypeDefinitionTwo'
367e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[5];
368e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
369e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->TypeDefinitionTwo);
370e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
371e98a4c5aSCarlos Alberto Enciso 
372e98a4c5aSCarlos Alberto Enciso   // Target: Added 'LineThree'
373e98a4c5aSCarlos Alberto Enciso   std::tie(Reader, Element, Pass) = PassTable[6];
374e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Reader, TargetReader);
375e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Element, TargetReader->LineThree);
376e98a4c5aSCarlos Alberto Enciso   EXPECT_EQ(Pass, LVComparePass::Added);
377e98a4c5aSCarlos Alberto Enciso }
378e98a4c5aSCarlos Alberto Enciso 
TEST(LogicalViewTest,CompareElements)379e98a4c5aSCarlos Alberto Enciso TEST(LogicalViewTest, CompareElements) {
380e98a4c5aSCarlos Alberto Enciso   ScopedPrinter W(outs());
381e98a4c5aSCarlos Alberto Enciso 
382e98a4c5aSCarlos Alberto Enciso   // Reader options.
383e98a4c5aSCarlos Alberto Enciso   LVOptions ReaderOptions;
384e98a4c5aSCarlos Alberto Enciso   ReaderOptions.setCompareLines();
385e98a4c5aSCarlos Alberto Enciso   ReaderOptions.setCompareScopes();
386e98a4c5aSCarlos Alberto Enciso   ReaderOptions.setCompareSymbols();
387e98a4c5aSCarlos Alberto Enciso   ReaderOptions.setCompareTypes();
388e98a4c5aSCarlos Alberto Enciso 
389e98a4c5aSCarlos Alberto Enciso   // The next set-ups are very similar. The only difference is the
390e98a4c5aSCarlos Alberto Enciso   // comparison type, which must be set before the readers are created.
391e98a4c5aSCarlos Alberto Enciso   //   Views: setCompareContext()
392e98a4c5aSCarlos Alberto Enciso   //   Elements: resetCompareContext()
393e98a4c5aSCarlos Alberto Enciso   {
394e98a4c5aSCarlos Alberto Enciso     // Compare the logical views as whole unit (--compare-context).
395e98a4c5aSCarlos Alberto Enciso     ReaderOptions.setCompareContext();
396e98a4c5aSCarlos Alberto Enciso     ReaderOptions.resolveDependencies();
397e98a4c5aSCarlos Alberto Enciso     options().setOptions(&ReaderOptions);
398e98a4c5aSCarlos Alberto Enciso 
399e98a4c5aSCarlos Alberto Enciso     ReaderTestCompare ReferenceReader(W);
400e98a4c5aSCarlos Alberto Enciso     ReferenceReader.createElements();
401e98a4c5aSCarlos Alberto Enciso     ReferenceReader.addElements(/*IsReference=*/true, /*IsTarget=*/false);
402e98a4c5aSCarlos Alberto Enciso     ReferenceReader.initElements();
403e98a4c5aSCarlos Alberto Enciso 
404e98a4c5aSCarlos Alberto Enciso     ReaderTestCompare TargetReader(W);
405e98a4c5aSCarlos Alberto Enciso     TargetReader.createElements();
406e98a4c5aSCarlos Alberto Enciso     TargetReader.addElements(/*IsReference=*/false, /*IsTarget=*/true);
407e98a4c5aSCarlos Alberto Enciso     TargetReader.initElements();
408e98a4c5aSCarlos Alberto Enciso 
409e98a4c5aSCarlos Alberto Enciso     compareReadersViews(&ReferenceReader, &TargetReader);
410e98a4c5aSCarlos Alberto Enciso   }
411e98a4c5aSCarlos Alberto Enciso   {
412e98a4c5aSCarlos Alberto Enciso     // Compare the logical elements.
413e98a4c5aSCarlos Alberto Enciso     ReaderOptions.resetCompareContext();
414e98a4c5aSCarlos Alberto Enciso     ReaderOptions.resolveDependencies();
415e98a4c5aSCarlos Alberto Enciso     options().setOptions(&ReaderOptions);
416e98a4c5aSCarlos Alberto Enciso 
417e98a4c5aSCarlos Alberto Enciso     ReaderTestCompare ReferenceReader(W);
418e98a4c5aSCarlos Alberto Enciso     ReferenceReader.createElements();
419e98a4c5aSCarlos Alberto Enciso     ReferenceReader.addElements(/*IsReference=*/true, /*IsTarget=*/false);
420e98a4c5aSCarlos Alberto Enciso     ReferenceReader.initElements();
421e98a4c5aSCarlos Alberto Enciso 
422e98a4c5aSCarlos Alberto Enciso     ReaderTestCompare TargetReader(W);
423e98a4c5aSCarlos Alberto Enciso     TargetReader.createElements();
424e98a4c5aSCarlos Alberto Enciso     TargetReader.addElements(/*IsReference=*/false, /*IsTarget=*/true);
425e98a4c5aSCarlos Alberto Enciso     TargetReader.initElements();
426e98a4c5aSCarlos Alberto Enciso 
427e98a4c5aSCarlos Alberto Enciso     compareReadersElements(&ReferenceReader, &TargetReader);
428e98a4c5aSCarlos Alberto Enciso   }
429e98a4c5aSCarlos Alberto Enciso }
430e98a4c5aSCarlos Alberto Enciso 
431e98a4c5aSCarlos Alberto Enciso } // namespace
432