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