blob: 2a9f61a5d5e9d791f53874c36aa124c7baca2eef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2014 Wind River Systems, Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
* Markus Schorn (Wind River Systems)
* IBM Corporation
* Jens Elmenthaler - http://bugs.eclipse.org/173458 (camel case completion)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text.contentassist2;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.text.IDocument;
import junit.framework.Test;
/**
* Completion tests for plain C.
*
* @since 4.0
*/
public class PlainC_CompletionTests extends AbstractContentAssistTest {
private static final String HEADER_FILE_NAME = "CompletionTest.h";
private static final String SOURCE_FILE_NAME = "CompletionTest.c";
private static final String CURSOR_LOCATION_TAG = "/*cursor*/";
private static final String INCLUDE_LOCATION_TAG = "/*include*/";
private static final String DISTURB_FILE_NAME = "DisturbWith.c";
protected int fCursorOffset;
private IProject fProject;
//{CompletionTest.h}
//int gGlobalInt;
//struct Struct1;
//struct Struct2;
//union Union1;
//union Union2;
//
//#define DEBUG 1
//#define AMacro(x) x+1
//#define XMacro(x,y) x+y
//
//int aVariable;
//int xVariable;
//
//void aFunction();
//void xFunction();
//
//enum anEnumeration {
// aFirstEnum,
// aSecondEnum,
// aThirdEnum
//};
//typedef enum anEnumeration anEnumerationType;
//
//enum xEnumeration {
// xFirstEnum,
// xSecondEnum,
// xThirdEnum
//};
//typedef enum xEnumeration xEnumerationType;
//
//struct AStruct{
// int aStructField;
// int xaStructField;
//};
//typedef struct AStruct AStructType;
//
//struct XStruct{
// int xStructField;
// int axStructField;
//};
//typedef struct XStruct XStructType;
//
//void anotherFunction(){
// int aLocalDeclaration = 1;
//}
//
//void xOtherFunction(){
// int xLocalDeclaration = 1;
//}
//#ifdef ANONYMOUS
//enum {
// anonFirstEnum,
// anonSecondEnum,
// anonThirdEnum
//};
//
//enum {
// xanonFirstEnum,
// xanonSecondEnum,
// xanonThirdEnum
//};
//
//int notAnonymous;
//enum notAnonymousEnum {};
//struct notAnonymousStruct {};
//
//struct {
// int anonStructField;
//};
//
//struct {
// int xanonStructField;
//};
//
//union {
// int anonUnionMember1, anonUnionMember2;
//};
//#endif /* ANONYMOUS */
//
//#ifdef STRUCT_C1
//enum E1 {e11, e12};
//
//struct C1_s {
// enum E2 {e21, e22};
//
// struct C1_s* fMySelf;
//
// int m123;
// int m12;
// int m13;
//};
//typedef struct C1_s C1;
//extern C1* gfC1();
//C1* gfC2();
//C1 gC1, gC2;
//#endif /* STRUCT_C1 */
// struct s206450 {
// struct {int a1; int a2;};
// union {int u1; char u2;};
// struct {int a3;} a4;
// int b;
// };
// #ifdef bug204758
// typedef enum {__nix} _e204758;
// void _f204758(_e204758 x);
// #endif
//{DisturbWith.c}
// int gTemp;
// void gFunc();
// typedef struct {
// int mem;
// } gStruct;
public static Test suite() {
return BaseTestCase.suite(PlainC_CompletionTests.class, "_");
}
/**
* @param name
*/
public PlainC_CompletionTests(String name) {
super(name, false);
}
/*
* @see org.eclipse.cdt.ui.tests.text.contentassist2.AbstractContentAssistTest#setUpProjectContent(org.eclipse.core.resources.IProject)
*/
@Override
protected IFile setUpProjectContent(IProject project) throws Exception {
fProject = project;
String headerContent = readTaggedComment(HEADER_FILE_NAME);
StringBuilder sourceContent = getContentsForTest(1)[0];
int includeOffset = Math.max(0, sourceContent.indexOf(INCLUDE_LOCATION_TAG));
sourceContent.insert(includeOffset, "#include \"" + HEADER_FILE_NAME + "\"\n");
fCursorOffset = sourceContent.indexOf(CURSOR_LOCATION_TAG);
assertTrue("No cursor location specified", fCursorOffset >= 0);
sourceContent.delete(fCursorOffset, fCursorOffset + CURSOR_LOCATION_TAG.length());
assertNotNull(createFile(project, HEADER_FILE_NAME, headerContent));
IFile sourceFile = createFile(project, SOURCE_FILE_NAME, sourceContent.toString());
// re-indexing is necessary to parse the header in context of the source.
CCorePlugin.getIndexManager().reindex(fCProject);
waitForIndexer(fCProject);
return sourceFile;
}
protected static final int DEFAULT_FLAGS = AbstractContentAssistTest.DEFAULT_FLAGS | IS_COMPLETION;
protected void assertCompletionResults(String[] expected) throws Exception {
assertContentAssistResults(fCursorOffset, expected, DEFAULT_FLAGS, CompareType.ID);
}
//void test() {
// int myvar;
// (my/*cursor*/
public void testLocalVariableAfterOpeningParen_Bug180885() throws Exception {
final String[] expected = { "myvar" };
assertCompletionResults(expected);
}
//void test() {
// int myvar;
// int x = my/*cursor*/
public void testLocalVariableInAssignment() throws Exception {
final String[] expected = { "myvar" };
assertCompletionResults(expected);
}
//void test() {
// int myvar;
// my/*cursor*/
public void testLocalVariableOnLHS() throws Exception {
final String[] expected = { "myvar" };
assertCompletionResults(expected);
}
// void test() {
// g/*cursor*/
public void testBindingsWithoutDeclaration() throws Exception {
// gStruct: fix for 214146, type from a source file is not proposed.
final String[] expected = { "gGlobalInt", "gTemp", "gFunc(void)", };
final String[] expected2 = { "gGlobalInt" };
String disturbContent = readTaggedComment(DISTURB_FILE_NAME);
IFile dfile = createFile(fProject, DISTURB_FILE_NAME, disturbContent);
waitForIndexer(fCProject);
assertCompletionResults(expected);
dfile.delete(true, npm());
waitForIndexer(fCProject);
assertCompletionResults(expected2);
}
//// to_be_replaced_
//void gfunc(){aNew/*cursor*/
public void testGlobalVariableBeforeSave_Bug180883() throws Exception {
String replace = "// to_be_replaced_";
String globalVar = "int aNewGlobalVar;";
IDocument doc = getDocument();
int idx = doc.get().indexOf(replace);
doc.replace(idx, replace.length(), globalVar);
final String[] expected = { "aNewGlobalVar" };
assertCompletionResults(expected);
}
// static int staticVar197990;
// void gFunc() {
// stat/*cursor*/
public void testStaticVariables_Bug197990() throws Exception {
final String[] expected = { "staticVar197990" };
assertCompletionResults(expected);
}
// struct Struct/*cursor*/
public void testElaboratedTypeSpecifierStruct_bug208710() throws Exception {
final String[] expected = { "Struct1", "Struct2" };
assertCompletionResults(expected);
}
// struct Union/*cursor*/
public void testElaboratedTypeSpecifierNotStruct_bug208710() throws Exception {
final String[] expected = new String[0];
assertCompletionResults(expected);
}
// union Union/*cursor*/
public void testElaboratedTypeSpecifierUnion_bug208710() throws Exception {
final String[] expected = { "Union1", "Union2" };
assertCompletionResults(expected);
}
// union Struct/*cursor*/
public void testElaboratedTypeSpecifierNotUnion_bug208710() throws Exception {
final String[] expected = new String[0];
assertCompletionResults(expected);
}
// void func() {float a; a= 1./*cursor*/}
public void testCompletionInFloatingPointLiteral_Bug193464() throws Exception {
final String[] expected = new String[0];
assertCompletionResults(expected);
}
// #ifdef __cplusplus__
// extern "C" {
// #endif
// void c_linkage();
// #ifdef __cplusplus__
// }
// #endif
// #include "header191315.h"
// #include "header191315.h"
// void xxx() { c_lin/*cursor*/
public void testExternC_bug191315() throws Exception {
CharSequence[] content = getContentsForTest(3);
createFile(fProject, "header191315.h", content[0].toString());
createFile(fProject, "source191315.c", content[1].toString());
createFile(fProject, "source191315.cpp", content[1].toString());
waitForIndexer(fCProject);
final String[] expected = { "c_linkage(void)" };
assertCompletionResults(expected);
}
//#define ANONYMOUS
///*include*/
///*cursor*/
public void testAnonymousTypes() throws Exception {
final String[] expected = { "AStructType", "XStructType", "anEnumerationType", "xEnumerationType" };
assertCompletionResults(expected);
}
//void foo ( a/*cursor*/
public void testArgumentTypes_Prefix() throws Exception {
final String[] expected = { "AMacro(x)", "AStructType", "anEnumerationType" };
assertCompletionResults(expected);
}
//struct aThirdStruct {
// int x;
// /*cursor*/
//};
public void testFieldType_NoPrefix() throws Exception {
final String[] expected = { "AStructType", "XStructType", "anEnumerationType", "xEnumerationType" };
assertCompletionResults(expected);
}
//struct aThirdStruct {
// int x;
// a/*cursor*/
//};
public void testFieldType_Prefix() throws Exception {
final String[] expected = { "AMacro(x)", "AStructType", "anEnumerationType" };
assertCompletionResults(expected);
}
//#ifdef /*cursor*/
public void testMacroRef_NoPrefix() throws Exception {
final String[] expected = { "AMacro(x)", "DEBUG", "XMacro(x, y)", "__CDT_PARSER__", "__COUNTER__", "__DATE__",
"__FILE__", "__LINE__", "__STDC_HOSTED__", "__STDC_VERSION__", "__STDC__", "__TIME__",
"__builtin_va_arg(ap, type)", "__builtin_offsetof(T, m)", "__builtin_types_compatible_p(x, y)",
"__complex__", "__extension__", "__has_include", "__has_include_next", "__imag__", "__null",
"__offsetof__(x)", "__real__", "__stdcall", "__thread", };
assertCompletionResults(expected);
}
//#ifdef D/*cursor*/
public void testMacroRef_Prefix() throws Exception {
final String[] expected = { "DEBUG" };
assertCompletionResults(expected);
}
// int waldo;
// void foo() {
// #ifdef SOME_UNDEFINED_MACRO
// wald/*cursor*/
// #endif
// }
public void testInactiveCodeBlock_72809() throws Exception {
assertCompletionResults(new String[] { "waldo" });
}
//void fooFunction()
//{
// AStructType* c;
// c->/*cursor*/
//}
public void testMemberReference_Arrow_NoPrefix() throws Exception {
final String[] expected = { "aStructField", "xaStructField", };
assertCompletionResults(expected);
}
//void main() {
// struct AStruct a, *ap;
// ap->/*cursor*/
//}
public void testMemberReference_Arrow_NoPrefix2() throws Exception {
final String[] expected = { "aStructField", "xaStructField", };
assertCompletionResults(expected);
}
//void fooFunction()
//{
// AStructType* c;
// c->a/*cursor*/
//}
public void testMemberReference_Arrow_Prefix() throws Exception {
final String[] expected = { "aStructField", };
assertCompletionResults(expected);
}
//AStructType* foo();
//
//void fooFunction()
//{
// foo()->a/*cursor*/
//}
public void testMemberReference_Arrow_Prefix2() throws Exception {
final String[] expected = { "aStructField", };
assertCompletionResults(expected);
}
//void fooFunction()
//{
// AStructType c;
// c./*cursor*/
//}
public void testMemberReference_Dot_NoPrefix() throws Exception {
final String[] expected = { "aStructField", "xaStructField", };
assertCompletionResults(expected);
}
//void fooFunction()
//{
// AStructType c;
// c.a/*cursor*/
//}
public void testMemberReference_Dot_Prefix() throws Exception {
final String[] expected = { "aStructField", };
assertCompletionResults(expected);
}
//typedef int myType;
//
//m/*cursor*/
public void testTypeDef_Prefix() throws Exception {
final String[] expected = { "myType", };
assertCompletionResults(expected);
}
//void fooFunction(int x)
//{
// /*cursor*/
//}
public void testSingleName_Function_NoPrefix() throws Exception {
final String[] expected = { "x", "aVariable", "xVariable", "aFunction(void)", "anotherFunction(void)",
"fooFunction(int)", "xFunction(void)", "xOtherFunction(void)", "anEnumerationType", "xEnumerationType",
"AStructType", "XStructType", "aFirstEnum", "aSecondEnum", "aThirdEnum", "xFirstEnum", "xSecondEnum",
"xThirdEnum", "gGlobalInt" };
assertCompletionResults(expected);
}
//void fooFunction(int x)
//{
// a/*cursor*/
//}
public void testSingleName_Function_Prefix() throws Exception {
final String[] expected = { "AMacro(x)", "AStructType", "aVariable", "aFunction(void)", "anotherFunction(void)",
"anEnumerationType", "aFirstEnum", "aSecondEnum", "aThirdEnum", };
assertCompletionResults(expected);
}
//void fooFunction(int x)
//{
// int y = /*cursor*/
//}
public void testSingleName_Assignment_NoPrefix() throws Exception {
final String[] expected = { "x", "y", "aVariable", "xVariable", "aFunction(void)", "anotherFunction(void)",
"fooFunction(int)", "xFunction(void)", "xOtherFunction(void)", "anEnumerationType", "xEnumerationType",
"AStructType", "XStructType", "aFirstEnum", "aSecondEnum", "aThirdEnum", "xFirstEnum", "xSecondEnum",
"xThirdEnum", "gGlobalInt" };
assertCompletionResults(expected);
}
//void foo(int x)
//{
// int y = AM/*cursor*/
//}
public void testSingleName_Assignment_Prefix() throws Exception {
final String[] expected = { "AMacro(x)" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void gfunc() {C1 v; v.m/*cursor*/
public void testLocalVariable() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void gfunc() {C1 v; v.fMySelf->m/*cursor*/
public void testLocalVariable_MemberVariable() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void gfunc() {gfC1()->m/*cursor*/
public void testGlobalFunction() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {gC/*cursor*/
public void testGlobalVariables_GlobalScope() throws Exception {
final String[] expected = { "gC1", "gC2", "gfC1(void)", "gfC2(void)" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void foo() {gC/*cursor*/
public void testGlobalVariables_FunctionScope() throws Exception {
final String[] expected = { "gC1", "gC2", "gfC1(void)", "gfC2(void)" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//typedef struct {
// enum E2 {e21, e22};
//
// C2* fMySelf;
//
// int m123;
// int m12;
// int m13;
//} C2;
//void f() {C2* cLocal1; while(true) {C1* cLocal2; cL/*cursor*/
public void testLocalVariables_FunctionScope() throws Exception {
final String[] expected = { "cLocal1", "cLocal2" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* cLocal1; cLocal1->f/*cursor*/
public void testDataMembers_FunctionScope() throws Exception {
final String[] expected = { "fMySelf" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {gf/*cursor*/
public void testGlobalFunctions_FunctionScope() throws Exception {
final String[] expected = { "gfC1(void)", "gfC2(void)" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//typedef struct {} C2;
//typedef union {} C3;
//void f() {C/*cursor*/
public void testTypes_FunctionScope() throws Exception {
final String[] expected = { "C1", "C2", "C3" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {e/*cursor*/
public void testEnums_FunctionScope() throws Exception {
final String[] expected = { "e11", "e12", "e21", "e22" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1 c; (&c)->m/*cursor*/
public void testAddressOf() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* c; (*c).m/*cursor*/
public void testDereferencingOperator1() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1** c; (**c).m/*cursor*/
public void testDereferencingOperator2() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1** c; (*c)->m/*cursor*/
public void testDereferencingOperator3() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* c; c[0].m/*cursor*/
public void testArrayAccessOperator1() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1** c; c[0][1].m/*cursor*/
public void testArrayAccessOperator2() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1** c; c[0]->m/*cursor*/
public void testArrayAccessOperator3() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* c; (&c[0])->m/*cursor*/
public void testArrayAccessOperator4() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {void* c; ((C1*)c)->m/*cursor*/
public void testCasts1() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void g(int a) {}; void f() {void* c; g(((C1*)c)->m/*cursor*/
public void testCasts2() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* c; c++->m/*cursor*/
public void testPointerArithmetic1() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* c; (*++c).m/*cursor*/
public void testPointerArithmetic2() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1* c; c--->m/*cursor*/
public void testPointerArithmetic3() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1 c; (&c+1)->m/*cursor*/
public void testPointerArithmetic4() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {C1 c; (&c-1)->m/*cursor*/
public void testPointerArithmetic5() throws Exception {
final String[] expected = { "m123", "m12", "m13" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//void f() {int localVar=0; if (*cond && somefunc(&local/*cursor*/
public void testNestedCalls() throws Exception {
final String[] expected = { "localVar" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//int a[] = {1,2}; void f(int _0306_b) {_0306_b/*cursor*/
public void testCuttingInput1() throws Exception {
final String[] expected = { "_0306_b" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//int a[] = {1,2}; void f(int b) {int _0306_b[] = {2,3}; _0306_b/*cursor*/
public void testCuttingInput2() throws Exception {
final String[] expected = { "_0306_b" };
assertCompletionResults(expected);
}
//#define STRUCT_C1
///*include*/
//enum EnumType function() {int _031209_v; _031209/*cursor*/
public void testDisturbingMacros() throws Exception {
final String[] expected = { "_031209_v" };
assertCompletionResults(expected);
}
// void test() {
// int local;
// switch(loc/*cursor*/
public void testSwitchStatement() throws Exception {
final String[] expected = { "local" };
assertCompletionResults(expected);
}
// void test() {
// int local;
// while(loc/*cursor*/
public void testWhileStatement() throws Exception {
final String[] expected = { "local" };
assertCompletionResults(expected);
}
// void test() {
// int local;
// for(loc/*cursor*/
public void testForStatement1() throws Exception {
final String[] expected = { "local" };
assertCompletionResults(expected);
}
// void test() {
// int local;
// for(int i=0;i<loc/*cursor*/
public void testForStatement2() throws Exception {
final String[] expected = { "local" };
assertCompletionResults(expected);
}
// void test() {
// int local;
// for(int i=0;i<local;loc/*cursor*/
public void testForStatement3() throws Exception {
final String[] expected = { "local" };
assertCompletionResults(expected);
}
// #define INIT_PTR(PtrName) (PtrName) = 0;
// struct CCApp {
// int pIShell;
// };
//
// int main(void) {
// struct CCApp *pThis = 0;
// INIT_PTR(pTh/*cursor*/);
// }
public void testCompletionInMacroArguments1_Bug200208() throws Exception {
final String[] expected = { "pThis" };
assertCompletionResults(expected);
}
// #define INIT_PTR(PtrName) (PtrName) = 0;
// #define COPY_PTR(pTarget, pSource) (pTarget) = (pSource)
//
// struct CCApp {
// int pIShell;
// };
//
// int main(void) {
// struct CCApp *pThis = 0;
//
// INIT_PTR(pThis);
// COPY_PTR(pThis->pIShell, pThis->pI/*cursor*/)
// }
public void testCompletionInMacroArguments2_Bug200208() throws Exception {
final String[] expected = { "pIShell" };
assertCompletionResults(expected);
}
// enum {enum0, enum1, enum2};
// typedef struct {
// int byte1;
// int byte2;
// } MYSTRUCT_TYPE;
// static const MYSTRUCT_TYPE myArrayOfStructs[] = {{enum/*cursor*/
public void testCompletionInInitializerList_Bug230389() throws Exception {
final String[] expected = { "enum0", "enum1", "enum2" };
assertCompletionResults(expected);
}
// void test() {struct s206450 x; x./*cursor*/
public void testNestedAnonymousStructs_Bug206450() throws Exception {
final String[] expected = { "a1", "a2", "u1", "u2", "a4", "b" };
assertCompletionResults(expected);
}
// #define bug204758
///*include*/
// void test() {_f204758/*cursor*/
public void testTypedefToAnonymous_Bug204758() throws Exception {
final String[] expected = { "_f204758(_e204758)" };
assertCompletionResults(expected);
}
// int main(void) {
// struct {
// void (*bar)(p1, p2, p3...);
// } foo;
// foo.bar(/*cursor*/
public void testClassCastException_Bug517954() throws Exception {
// Just check that no exception is thrown while invoking completion.
assertContentAssistResults(fCursorOffset, new String[] {}, DEFAULT_FLAGS | ALLOW_EXTRA_RESULTS, CompareType.ID);
}
}