From b715ba2690b49fbe06121012c433efb996353001 Mon Sep 17 00:00:00 2001 From: wangshi Date: Mon, 17 Feb 2025 16:38:16 +0800 Subject: [PATCH] update struct and union testcase Signed-off-by: wangshi --- src/vscode_plugin/src/parse/parsec.ts | 155 ++-- .../src/test/suite/parse/parsecstruct.test.ts | 712 ++++++++++++------ .../src/test/suite/parse/parsecunion.test.ts | 595 ++++++++++----- 3 files changed, 1004 insertions(+), 458 deletions(-) diff --git a/src/vscode_plugin/src/parse/parsec.ts b/src/vscode_plugin/src/parse/parsec.ts index 60a0251c..7f0c6eea 100644 --- a/src/vscode_plugin/src/parse/parsec.ts +++ b/src/vscode_plugin/src/parse/parsec.ts @@ -98,37 +98,58 @@ export function parseUnion(data: string) { "members": [] } - members.forEach(declaration => { - // 使用正则表达式匹配类型和变量名 - // const match = declaration.match(/(\w+)\s+(\w+)(\[(\d+)\])?/); - const memReg = /(\w[\w\s\*]+)\s+(\w+)\s*(\s*\[\s*\d+\s*(\]\s*\[\s*\d+\s*)*\])?/; - const match = declaration.match(memReg); - let arraySizes: string[] | null = null; - if (match) { - // 类型 - const type = match[1]; - // 变量名 - const variable = match[2]; - - // 解析数组长度 - if ( match[3]) { - arraySizes = match[3] - .replace(/\s/g, '') // Remove all whitespace - .match(/\d+/g); // Find all numbers - } - // 解析数组长度 - const numberList = arraySizes ? arraySizes.map(str => parseInt(str, 10)) : []; - // Logger.getInstance().debug(`Type: ${type}, Variable:${variable}, Size:${arrayLength}`); - let paramItem: ParamObj = { - "type": type, - "name": variable, - "arraySize": numberList.length>0 ? numberList[0] : -1, - "arraySizeList": numberList + if (members.length >= 1) { + for (let i=0;i { + // 使用正则表达式匹配类型和变量名 + // const match = declaration.match(/(\w+)\s+(\w+)(\[(\d+)\])?/); + const memReg = /(\w[\w\s\*]+)\s+(\w+)\s*(\s*\[\s*\d+\s*(\]\s*\[\s*\d+\s*)*\])?/; + const match = declaration.match(memReg); + let arraySizes: string[] | null = null; + if (match) { + // 类型 + const type = match[1]; + // 变量名 + const variable = match[2]; + + // 解析数组长度 + if ( match[3]) { + arraySizes = match[3] + .replace(/\s/g, '') // Remove all whitespace + .match(/\d+/g); // Find all numbers + } + // 解析数组长度 + const numberList = arraySizes ? arraySizes.map(str => parseInt(str, 10)) : []; + // Logger.getInstance().debug(`Type: ${type}, Variable:${variable}, Size:${arrayLength}`); + let paramItem: ParamObj = { + "type": type, + "name": variable, + "arraySize": numberList.length>0 ? numberList[0] : -1, + "arraySizeList": numberList + } + unionItem.members.push(paramItem); + } else { + let paramItem: ParamObj = { + "type": declaration, + "name": '', + "arraySize": -1, + "arraySizeList": [] + } + unionItem.members.push(paramItem); } - unionItem.members.push(paramItem); + } + } else if (members.length == 1) { + const type = members[0]; + let paramItem: ParamObj = { + "type": type, + "name": "", + "arraySize": -1, + "arraySizeList": [] } - }); - + unionItem.members.push(paramItem); + } + unions.push(unionItem); } Logger.getInstance().info(` return unions: ${JSON.stringify(unions)}`); @@ -149,8 +170,9 @@ export function parseStruct(data: string) { const alias = match[3]; // 获取成员声明 const membersString = match[2] || match[5]; - - const members = membersString.split(';') + const comregex = /\/\/.*$/gm; + const cleanedMembersString = membersString.replace(comregex, ''); + const members = cleanedMembersString.split(';') .map(member => member.trim().replace(/[\n\r]/g, '')) .filter(member => member.length > 0); @@ -161,11 +183,13 @@ export function parseStruct(data: string) { // 匹配方法声明 const methodRegex = /(\w[\w\s\*]+)\s+(\w+)\(([^)]*)\)\s*/; const variableRegex = /(\w[\w\s\*]+)\s+(\w+)\s*/; - + const pattern = /(\w+)\s*\(\s*\*([^\)]+)\s*\)\s*\(\s*([\w\s,]*)\s*\)/; if (methodRegex.test(member)) { methods.push(member.trim().replace(/[\n\r]/g, '')); } else if (variableRegex.test(member)) { variables.push(member.trim().replace(/[\n\r]/g, '')); + } else if (pattern.test(member)) { + variables.push(member.trim().replace(/[\n\r]/g, '')); } }); @@ -202,18 +226,61 @@ export function parseParameters(members: string[]): ParamObj[] { } export function parseMembers(members: string[]): ParamObj[] { - const memberRegex = /(?:public:|private:)?\s*(\w+(?:\s+\w+)?)\s+(\w+)(?:\[(\d+)\])?/; - // Logger.getInstance().info(` parseMembers members: ${JSON.stringify(members)}`); + // const memberRegex = /(?:public:|private:)?\s*(\w+(?:\s+\w+)?)\s+(\w+)(?:\[(\d+)\])?/; + // // Logger.getInstance().info(` parseMembers members: ${JSON.stringify(members)}`); + // return members.map(member => { + // const match = member.trim().match(memberRegex); + // // Logger.getInstance().info(` parseMembers match: ${JSON.stringify(match)}`); + // if (match) { + // const type = match[1]; + // const name = match[2]; + // const arraySize = match[3] ? parseInt(match[3], 10) : -1; + // return { type, name, arraySize }; + // } + // return {}; + // // 类型保护 + // }).filter((m): m is ParamObj => m !== null); + const memReg = /(\w[\w\s\*]+)\s+(\w+)\s*(\s*\[\s*\d+\s*(\]\s*\[\s*\d+\s*)*\])?/; + const pattern = /(\w+)\s*\(\s*\*([^\)]+)\s*\)\s*\(\s*([\w\s,]*)\s*\)/; + let arraySizes: string[] | null = null; return members.map(member => { - const match = member.trim().match(memberRegex); - // Logger.getInstance().info(` parseMembers match: ${JSON.stringify(match)}`); - if (match) { - const type = match[1]; - const name = match[2]; - const arraySize = match[3] ? parseInt(match[3], 10) : -1; - return { type, name, arraySize }; + const match = member.trim().match(memReg); + if (match) { + const type = match[1]; + const name = match[2]; + let arraySize = 0; + // 解析数组长度 + if ( match[3]) { + arraySizes = match[3] + .replace(/\s/g, '') // Remove all whitespace + .match(/\d+/g); // Find all numbers } - return {}; + // 解析数组长度 + const numberList = arraySizes ? arraySizes.map(str => parseInt(str, 10)) : []; + let asize = numberList.length>0 ? numberList[0] : -1; + return { + "type": type, + "name": name, + "arraySize": asize, + "arraySizeList": numberList + }; + } else { + let funcmatch = member.trim().match(pattern); + if (funcmatch) { + const type = funcmatch[1]; + const name = funcmatch[2]; + let paramstr = funcmatch[3]; + paramstr = paramstr.replace(/\s+/g, ''); + const paramlist = paramstr.split(','); + return { + "type": type, + "name": name, + "arraySize": paramlist.length, + "arraySizeList": paramlist + } + } + } + return {}; // 类型保护 }).filter((m): m is ParamObj => m !== null); } @@ -259,11 +326,13 @@ export function parseClass(data: string) { // 匹配方法声明 const methodRegex = /(\w[\w\s\*]+)\s+(\w+)\(([^)]*)\)\s*/; const variableRegex = /(\w[\w\s\*]+)\s+(\w+)\s*/; - + const pattern = /(\w+)\s*\(\s*\*([^\)]+)\s*\)\s*\(\s*([\w\s,]*)\s*\)/; if (methodRegex.test(member)) { methods.push(member.trim().replace(/[\n\r]/g, '')); } else if (variableRegex.test(member)) { variables.push(member.trim().replace(/[\n\r]/g, '')); + } else if (pattern.test(member)) { + variables.push(member.trim().replace(/[\n\r]/g, '')); } }); diff --git a/src/vscode_plugin/src/test/suite/parse/parsecstruct.test.ts b/src/vscode_plugin/src/test/suite/parse/parsecstruct.test.ts index 5ba87392..811032af 100644 --- a/src/vscode_plugin/src/test/suite/parse/parsecstruct.test.ts +++ b/src/vscode_plugin/src/test/suite/parse/parsecstruct.test.ts @@ -30,6 +30,7 @@ suite('Parse_C_Struct_Suite', () => { int a; char b; float c; + int add(int a, int b); } TestStruct;` let structObjList = parsec.parseStruct(testenum); assert.strictEqual(structObjList.length, 1); @@ -43,235 +44,494 @@ suite('Parse_C_Struct_Suite', () => { assert.strictEqual(structItem.members[1].type, 'char'); assert.strictEqual(structItem.members[2].name, 'c'); assert.strictEqual(structItem.members[2].type, 'float'); + assert.strictEqual(structItem.functions.length, 1); + assert.strictEqual(structItem.functions[0].name, 'add'); + assert.strictEqual(structItem.functions[0].returns, 'int'); + assert.strictEqual(structItem.functions[0].parameters.length, 2); + assert.strictEqual(structItem.functions[0].parameters[0].name, 'a'); + assert.strictEqual(structItem.functions[0].parameters[0].type, 'int'); + assert.strictEqual(structItem.functions[0].parameters[1].name, 'b'); + assert.strictEqual(structItem.functions[0].parameters[1].type, 'int'); }); //2, 测试边界情况 - // test('parseStruct_test_2', () => { - // let testenum = `typedef enum { - // NEW, - // APPEND, - // REPLACE - // } OperationType;` - // let enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // let enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OperationType'); - // assert.strictEqual(enumItem.alias, 'OperationType'); - // assert.strictEqual(enumItem.members.length, 3); - // assert.strictEqual(enumItem.members[0], 'NEW'); - // assert.strictEqual(enumItem.members[1], 'APPEND'); - // assert.strictEqual(enumItem.members[2], 'REPLACE'); - - // testenum = `typedef enum { NEW, APPEND, REPLACE } OperationType;` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OperationType'); - // assert.strictEqual(enumItem.alias, 'OperationType'); - // assert.strictEqual(enumItem.members.length, 3); - // assert.strictEqual(enumItem.members[0], 'NEW'); - // assert.strictEqual(enumItem.members[1], 'APPEND'); - // assert.strictEqual(enumItem.members[2], 'REPLACE'); - - // testenum = `typedef enum { - // NEW - // } OperationType;` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OperationType'); - // assert.strictEqual(enumItem.alias, 'OperationType'); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - - // testenum = `typedef enum { NEW } OperationType;` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OperationType'); - // assert.strictEqual(enumItem.alias, 'OperationType'); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - - // testenum = `typedef enum OType { - // NEW - // } OperationType;` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - // assert.strictEqual(enumItem.alias, 'OperationType'); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - - // testenum = `typedef enum OType { NEW } OperationType;` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - // assert.strictEqual(enumItem.alias, 'OperationType'); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - - // testenum = `enum OType { - // NEW - // };` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - // // assert.strictEqual(enumItem.alias, undefined); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - - // testenum = `enum OType { NEW };` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - // // assert.strictEqual(enumItem.alias, undefined); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - - // testenum = `enum OType { NEW }; enum TOTSize1 { DTS };` - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 2); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - // // assert.strictEqual(enumItem.alias, undefined); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'NEW'); - // enumItem = enumObjList[1]; - // assert.strictEqual(enumItem.name, 'TOTSize1'); - // // assert.strictEqual(enumItem.alias, undefined); - // assert.strictEqual(enumItem.members.length, 1); - // assert.strictEqual(enumItem.members[0], 'DTS'); - - // testenum = `enum TEST_ENUM { - // ENUM_1 = 1, // comment - // ENUM_2 = 2 - // }`; - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'TEST_ENUM'); - // // assert.strictEqual(enumItem.alias, undefined); - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1=1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2=2'); - - // // 没有分号结尾 - // testenum = `enum TEST_ENUM { - // ENUM_1, // comment - // ENUM_2 - // }`; - // enumObjList = parsec.parseStruct(testenum); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'TEST_ENUM'); - // // assert.strictEqual(enumItem.alias, undefined); - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - // }); - - // //3, 测试异常情况 - // test('parseStruct_test_3', () => { - // let teststr: string = ''; - // let enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = 'enum { ENUM_1 }'; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // let enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - - // teststr = `enum { - // ENUM_1, - // ENUM_2 };` - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - - // teststr = `enum { - // ENUM_1, // comment - // ENUM_2 - // }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - - // teststr = `enum OType { - // ENUM_1, // comment - // ENUM_2, - // };` - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - - // teststr = `typedef enum OType { - // ENUM_1, // comment - // ENUM_2, - // };` - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - // }); + test('parseStruct_test_2', () => { + let testenum = `typedef struct optype { + int len; + float width; + char name[20][10]; + } OperationType;` + let structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + let structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'optype'); + assert.strictEqual(structItem.alias, 'OperationType'); + assert.strictEqual(structItem.members.length, 3); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + assert.strictEqual(structItem.members[1].name, 'width'); + assert.strictEqual(structItem.members[1].type, 'float'); + assert.strictEqual(structItem.members[2].name, 'name'); + assert.strictEqual(structItem.members[2].type, 'char'); + assert.strictEqual(structItem.members[2].arraySize, 20); + assert.strictEqual(structItem.members[2].arraySizeList[0], 20); + assert.strictEqual(structItem.members[2].arraySizeList[1], 10); + + testenum = `typedef struct { + int a; + char b; + float c; + int add(int a, int b); + void mod(); + long long func(long long ll); + char* cfunc(const char* str); + double (*cfunc)(double, int); + double (*cfuncList[10])(double, int); + } TestStruct;` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'TestStruct'); + assert.strictEqual(structItem.alias, 'TestStruct'); + assert.strictEqual(structItem.members.length, 5); + assert.strictEqual(structItem.members[0].name, 'a'); + assert.strictEqual(structItem.members[0].type, 'int'); + assert.strictEqual(structItem.members[1].name, 'b'); + assert.strictEqual(structItem.members[1].type, 'char'); + assert.strictEqual(structItem.members[2].name, 'c'); + assert.strictEqual(structItem.members[2].type, 'float'); + assert.strictEqual(structItem.members[3].name, 'cfunc'); + assert.strictEqual(structItem.members[3].type, 'double'); + assert.strictEqual(structItem.members[3].arraySize, 2); + assert.strictEqual(structItem.members[3].arraySizeList[0], 'double'); + assert.strictEqual(structItem.members[3].arraySizeList[1], 'int'); + assert.strictEqual(structItem.members[4].name, 'cfuncList[10]'); + assert.strictEqual(structItem.members[4].type, 'double'); + assert.strictEqual(structItem.members[4].arraySize, 2); + assert.strictEqual(structItem.members[4].arraySizeList[0], 'double'); + assert.strictEqual(structItem.members[4].arraySizeList[1], 'int'); + + assert.strictEqual(structItem.functions.length, 4); + assert.strictEqual(structItem.functions[0].name, 'add'); + assert.strictEqual(structItem.functions[0].returns, 'int'); + assert.strictEqual(structItem.functions[0].parameters.length, 2); + assert.strictEqual(structItem.functions[0].parameters[0].name, 'a'); + assert.strictEqual(structItem.functions[0].parameters[0].type, 'int'); + assert.strictEqual(structItem.functions[0].parameters[1].name, 'b'); + assert.strictEqual(structItem.functions[0].parameters[1].type, 'int'); + assert.strictEqual(structItem.functions[1].name, 'mod'); + assert.strictEqual(structItem.functions[1].returns, 'void'); + assert.strictEqual(structItem.functions[1].parameters.length, 0); + assert.strictEqual(structItem.functions[2].name, 'func'); + assert.strictEqual(structItem.functions[2].returns, 'long long'); + assert.strictEqual(structItem.functions[2].parameters.length, 1); + assert.strictEqual(structItem.functions[2].parameters[0].name, 'll'); + assert.strictEqual(structItem.functions[2].parameters[0].type, 'long long'); + assert.strictEqual(structItem.functions[3].name, 'cfunc'); + assert.strictEqual(structItem.functions[3].returns, 'char*'); + assert.strictEqual(structItem.functions[3].parameters.length, 1); + assert.strictEqual(structItem.functions[3].parameters[0].name, 'str'); + assert.strictEqual(structItem.functions[3].parameters[0].type, 'char*'); + + testenum = `typedef struct optype { + char ch; + int len; + short slen; + long llen; + long long llint; + float width; + double dlen; + long double ldlen; + void* ptr; + char name[20][10]; + char ch3[10][20][30]; + int len3[10][20][30]; + short slen3[10][20][30]; + long llen3[10][20][30]; + long long llint3[10][20][30]; + float width3[10][20][30]; + double dlen3[10][20][30]; + long double ldlen3[10][20][30]; + void* ptr3[10][20][30]; + signed char sch; + signed int silen; + signed short slen; + signed long sllen; + signed long long sllint; + signed float swidth; + signed double sdlen; + signed long double sldlen; + signed void* ptr; + unsigend char uch; + unsigend int ulen; + unsigend short uslen; + unsigend long ullen; + unsigend long long ullint; + unsigend float uwidth; + unsigend double udlen; + unsigend long double uld; + unsigend void* uptr; + bool bflag; + } OperationType;` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'optype'); + assert.strictEqual(structItem.alias, 'OperationType'); + assert.strictEqual(structItem.members.length, 38); + + assert.strictEqual(structItem.members[0].name, 'ch'); + assert.strictEqual(structItem.members[0].type, 'char'); + assert.strictEqual(structItem.members[1].name, 'len'); + assert.strictEqual(structItem.members[1].type, 'int'); + assert.strictEqual(structItem.members[2].name, 'slen'); + assert.strictEqual(structItem.members[2].type, 'short'); + assert.strictEqual(structItem.members[3].name, 'llen'); + assert.strictEqual(structItem.members[3].type, 'long'); + assert.strictEqual(structItem.members[4].name, 'llint'); + assert.strictEqual(structItem.members[4].type, 'long long'); + assert.strictEqual(structItem.members[5].name, 'width'); + assert.strictEqual(structItem.members[5].type, 'float'); + assert.strictEqual(structItem.members[6].name, 'dlen'); + assert.strictEqual(structItem.members[6].type, 'double'); + assert.strictEqual(structItem.members[7].name, 'ldlen'); + assert.strictEqual(structItem.members[7].type, 'long double'); + assert.strictEqual(structItem.members[8].name, 'ptr'); + assert.strictEqual(structItem.members[8].type, 'void*'); + assert.strictEqual(structItem.members[9].name, 'name'); + assert.strictEqual(structItem.members[9].type, 'char'); + assert.strictEqual(structItem.members[9].arraySize, 20); + assert.strictEqual(structItem.members[9].arraySizeList[0], 20); + assert.strictEqual(structItem.members[9].arraySizeList[1], 10); + assert.strictEqual(structItem.members[10].name, 'ch3'); + assert.strictEqual(structItem.members[10].type, 'char'); + assert.strictEqual(structItem.members[10].arraySize, 10); + assert.strictEqual(structItem.members[10].arraySizeList[0], 10); + assert.strictEqual(structItem.members[10].arraySizeList[1], 20); + assert.strictEqual(structItem.members[10].arraySizeList[2], 30); + assert.strictEqual(structItem.members[11].name, 'len3'); + assert.strictEqual(structItem.members[11].type, 'int'); + assert.strictEqual(structItem.members[11].arraySize, 10); + assert.strictEqual(structItem.members[11].arraySizeList[0], 10); + assert.strictEqual(structItem.members[11].arraySizeList[1], 20); + assert.strictEqual(structItem.members[11].arraySizeList[2], 30); + assert.strictEqual(structItem.members[12].name, 'slen3'); + assert.strictEqual(structItem.members[12].type, 'short'); + assert.strictEqual(structItem.members[12].arraySize, 10); + assert.strictEqual(structItem.members[12].arraySizeList[0], 10); + assert.strictEqual(structItem.members[12].arraySizeList[1], 20); + assert.strictEqual(structItem.members[12].arraySizeList[2], 30); + assert.strictEqual(structItem.members[13].name, 'llen3'); + assert.strictEqual(structItem.members[13].type, 'long'); + assert.strictEqual(structItem.members[13].arraySize, 10); + assert.strictEqual(structItem.members[13].arraySizeList[0], 10); + assert.strictEqual(structItem.members[13].arraySizeList[1], 20); + assert.strictEqual(structItem.members[13].arraySizeList[2], 30); + assert.strictEqual(structItem.members[14].name, 'llint3'); + assert.strictEqual(structItem.members[14].type, 'long long'); + assert.strictEqual(structItem.members[14].arraySize, 10); + assert.strictEqual(structItem.members[14].arraySizeList[0], 10); + assert.strictEqual(structItem.members[14].arraySizeList[1], 20); + assert.strictEqual(structItem.members[14].arraySizeList[2], 30); + assert.strictEqual(structItem.members[15].name, 'width3'); + assert.strictEqual(structItem.members[15].type, 'float'); + assert.strictEqual(structItem.members[15].arraySize, 10); + assert.strictEqual(structItem.members[15].arraySizeList[0], 10); + assert.strictEqual(structItem.members[15].arraySizeList[1], 20); + assert.strictEqual(structItem.members[15].arraySizeList[2], 30); + assert.strictEqual(structItem.members[16].name, 'dlen3'); + assert.strictEqual(structItem.members[16].type, 'double'); + assert.strictEqual(structItem.members[16].arraySize, 10); + assert.strictEqual(structItem.members[16].arraySizeList[0], 10); + assert.strictEqual(structItem.members[16].arraySizeList[1], 20); + assert.strictEqual(structItem.members[16].arraySizeList[2], 30); + assert.strictEqual(structItem.members[17].name, 'ldlen3'); + assert.strictEqual(structItem.members[17].type, 'long double'); + assert.strictEqual(structItem.members[17].arraySize, 10); + assert.strictEqual(structItem.members[17].arraySizeList[0], 10); + assert.strictEqual(structItem.members[17].arraySizeList[1], 20); + assert.strictEqual(structItem.members[17].arraySizeList[2], 30); + assert.strictEqual(structItem.members[18].name, 'ptr3'); + assert.strictEqual(structItem.members[18].type, 'void*'); + assert.strictEqual(structItem.members[18].arraySize, 10); + assert.strictEqual(structItem.members[18].arraySizeList[0], 10); + assert.strictEqual(structItem.members[18].arraySizeList[1], 20); + assert.strictEqual(structItem.members[18].arraySizeList[2], 30); + assert.strictEqual(structItem.members[19].name, 'sch'); + assert.strictEqual(structItem.members[19].type, 'signed char'); + assert.strictEqual(structItem.members[20].name, 'silen'); + assert.strictEqual(structItem.members[20].type, 'signed int'); + assert.strictEqual(structItem.members[21].name, 'slen'); + assert.strictEqual(structItem.members[21].type, 'signed short'); + assert.strictEqual(structItem.members[22].name, 'sllen'); + assert.strictEqual(structItem.members[22].type, 'signed long'); + assert.strictEqual(structItem.members[23].name, 'sllint'); + assert.strictEqual(structItem.members[23].type, 'signed long long'); + assert.strictEqual(structItem.members[24].name, 'swidth'); + assert.strictEqual(structItem.members[24].type, 'signed float'); + assert.strictEqual(structItem.members[25].name, 'sdlen'); + assert.strictEqual(structItem.members[25].type, 'signed double'); + assert.strictEqual(structItem.members[26].name, 'sldlen'); + assert.strictEqual(structItem.members[26].type, 'signed long double'); + assert.strictEqual(structItem.members[27].name, 'ptr'); + assert.strictEqual(structItem.members[27].type, 'signed void*'); + assert.strictEqual(structItem.members[28].name, 'uch'); + assert.strictEqual(structItem.members[28].type, 'unsigend char'); + assert.strictEqual(structItem.members[29].name, 'ulen'); + assert.strictEqual(structItem.members[29].type, 'unsigend int'); + assert.strictEqual(structItem.members[30].name, 'uslen'); + assert.strictEqual(structItem.members[30].type, 'unsigend short'); + assert.strictEqual(structItem.members[31].name, 'ullen'); + assert.strictEqual(structItem.members[31].type, 'unsigend long'); + assert.strictEqual(structItem.members[32].name, 'ullint'); + assert.strictEqual(structItem.members[32].type, 'unsigend long long'); + assert.strictEqual(structItem.members[33].name, 'uwidth'); + assert.strictEqual(structItem.members[33].type, 'unsigend float'); + assert.strictEqual(structItem.members[34].name, 'udlen'); + assert.strictEqual(structItem.members[34].type, 'unsigend double'); + assert.strictEqual(structItem.members[35].name, 'uld'); + assert.strictEqual(structItem.members[35].type, 'unsigend long double'); + assert.strictEqual(structItem.members[36].name, 'uptr'); + assert.strictEqual(structItem.members[36].type, 'unsigend void*'); + assert.strictEqual(structItem.members[37].name, 'bflag'); + assert.strictEqual(structItem.members[37].type, 'bool'); + + testenum = `typedef struct optype { int len; float width; char name[20][10];} OperationType;` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'optype'); + assert.strictEqual(structItem.alias, 'OperationType'); + assert.strictEqual(structItem.members.length, 3); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + assert.strictEqual(structItem.members[1].name, 'width'); + assert.strictEqual(structItem.members[1].type, 'float'); + assert.strictEqual(structItem.members[2].name, 'name'); + assert.strictEqual(structItem.members[2].type, 'char'); + assert.strictEqual(structItem.members[2].arraySize, 20); + assert.strictEqual(structItem.members[2].arraySizeList[0], 20); + assert.strictEqual(structItem.members[2].arraySizeList[1], 10); + + testenum = `typedef struct { int len; } OperationType;` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'OperationType'); + assert.strictEqual(structItem.alias, 'OperationType'); + assert.strictEqual(structItem.members.length, 1); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + + testenum = `struct OperationType { int len; };` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'OperationType'); + assert.strictEqual(structItem.members.length, 1); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + + testenum = `typedef struct OType { int len; } OperationType;` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'OType'); + assert.strictEqual(structItem.alias, 'OperationType'); + assert.strictEqual(structItem.members.length, 1); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + + testenum = `struct OType { int len; }; struct TOTSize1 { int len; };` + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 2); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'OType'); + // assert.strictEqual(structItem.alias, undefined); + assert.strictEqual(structItem.members.length, 1); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + structItem = structObjList[1]; + assert.strictEqual(structItem.name, 'TOTSize1'); + // assert.strictEqual(structItem.alias, undefined); + assert.strictEqual(structItem.members.length, 1); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + + testenum = `struct TEST_ENUM { + int len; // comment + char name[10]; + } ;`; + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'TEST_ENUM'); + // assert.strictEqual(structItem.alias, undefined); + assert.strictEqual(structItem.members.length, 2); + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + assert.strictEqual(structItem.members[1].name, 'name'); + assert.strictEqual(structItem.members[1].type, 'char'); + assert.strictEqual(structItem.members[1].arraySize, 10); + + // 没有分号结尾 + testenum = `struct TEST_ENUM { + int len; // comment + char name[10] + }`; + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 0); + + testenum = `struct TEST_ENUM { + int len; // comment + char name[10]; + } TEST_ENUM_T`; + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 0); + + testenum = `typedef struct TEST_ENUM { + int len; // comment + char name[10]; + ENUM_T tenum; + CLASS_T tclass; + STRUCT_T tstruct; + UNION_T tunion; + } TEST_ENUM_T;`; + structObjList = parsec.parseStruct(testenum); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'TEST_ENUM'); + assert.strictEqual(structItem.alias, 'TEST_ENUM_T'); + assert.strictEqual(structItem.members.length, 6); + + assert.strictEqual(structItem.members[0].name, 'len'); + assert.strictEqual(structItem.members[0].type, 'int'); + assert.strictEqual(structItem.members[1].name, 'name'); + assert.strictEqual(structItem.members[1].type, 'char'); + assert.strictEqual(structItem.members[2].name, 'tenum'); + assert.strictEqual(structItem.members[2].type, 'ENUM_T'); + assert.strictEqual(structItem.members[3].name, 'tclass'); + assert.strictEqual(structItem.members[3].type, 'CLASS_T'); + assert.strictEqual(structItem.members[4].name, 'tstruct'); + assert.strictEqual(structItem.members[4].type, 'STRUCT_T'); + assert.strictEqual(structItem.members[5].name, 'tunion'); + assert.strictEqual(structItem.members[5].type, 'UNION_T'); + }); + + //3, 测试异常情况 + test('parseStruct_test_3', () => { + let teststr: string = ''; + let structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = 'struct unionname { ENUM_1 tn; };'; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + let structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'unionname'); + assert.strictEqual(structItem.members[0].type, 'ENUM_1'); + assert.strictEqual(structItem.members[0].name, 'tn'); + + teststr = `DEFINE struct TU { + DEF_PARAM_1 + };` + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'TU'); + assert.strictEqual(structItem.members.length, 0); + + teststr = `struct { + }`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `struct OType { + // comment + ENUM_1 ta; + ENUM_2 tb; + };` + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'OType'); + assert.strictEqual(structItem.members.length, 2); + assert.strictEqual(structItem.members[0].type, 'ENUM_1'); + assert.strictEqual(structItem.members[0].name, 'ta'); + assert.strictEqual(structItem.members[1].type, 'ENUM_2'); + assert.strictEqual(structItem.members[1].name, 'tb'); + + teststr = `typedef struct OType { + ENUM_1 ta; /* comment */ + ENUM_2 tb; + };` + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.members.length, 2); + assert.strictEqual(structItem.members[0].type, 'ENUM_1'); + assert.strictEqual(structItem.members[0].name, 'ta'); + assert.strictEqual(structItem.members[1].type, 'ENUM_2'); + assert.strictEqual(structItem.members[1].name, 'tb'); + + teststr = `typedef struct OType { + ENUM_1 ta, /* comment */ + ENUM_2 tb, + };` + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.members.length, 1); + assert.strictEqual(structItem.members[0].type, 'ENUM_1'); + }); // //4, 测试错误情况 - // test('parseStruct_test_4', () => { - // let enumObjList = parsec.parseStruct(''); - // assert.strictEqual(enumObjList.length, 0); - - // let teststr = `typedef enum OType {`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `}; typedef enum OType //{} {}`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `typedefinde enumute OType { }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `TYPEDEFfinde ENUMute OType { }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `export typedef enum OType { }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // let enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - - // teststr = `typedef enum OType { }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - - // teststr = `typedef enum { }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - - // teststr = `typedef enum { }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - - // teststr = `typedef enum { ENUM_1 = 1, ENUM_2 = 2 }`; - // enumObjList = parsec.parseStruct(teststr); - // assert.strictEqual(enumObjList.length, 1); - // }); + test('parseStruct_test_4', () => { + let structObjList = parsec.parseStruct(''); + assert.strictEqual(structObjList.length, 0); + + let teststr = `typedef struct OType {`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `}; typedef struct OType //{} {}`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `typedefinde unionute OType { }`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `TYPEDEFfinde UNION OType { }`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `export typedef struct OType { };`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + let structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'OType'); + + teststr = `typedef struct OType { }`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `typedef struct { };`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 0); + + teststr = `typedef struct { } test_t;`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + + // TODO, this is error, need fix + teststr = `typedef struct { ENUM_1 =1, ENUM_2 =2 } test_t;`; + structObjList = parsec.parseStruct(teststr); + assert.strictEqual(structObjList.length, 1); + structItem = structObjList[0]; + assert.strictEqual(structItem.name, 'test_t'); + assert.strictEqual(structItem.alias, 'test_t'); + assert.strictEqual(structItem.members.length, 0); + + }); }); diff --git a/src/vscode_plugin/src/test/suite/parse/parsecunion.test.ts b/src/vscode_plugin/src/test/suite/parse/parsecunion.test.ts index b76692c1..9c16051a 100644 --- a/src/vscode_plugin/src/test/suite/parse/parsecunion.test.ts +++ b/src/vscode_plugin/src/test/suite/parse/parsecunion.test.ts @@ -14,6 +14,7 @@ */ import * as assert from 'assert'; +import { parse } from 'path'; // You can import and use all API from the 'vscode' module // as well as import your extension to test it @@ -31,19 +32,19 @@ suite('Parse_C_Union_Suite', () => { float width; char name[20]; } OperationType;` - let enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - let enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'OperationType'); - assert.strictEqual(enumItem.alias, 'OperationType'); - assert.strictEqual(enumItem.members.length, 3); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); - assert.strictEqual(enumItem.members[1].name, 'width'); - assert.strictEqual(enumItem.members[1].type, 'float'); - assert.strictEqual(enumItem.members[2].name, 'name'); - assert.strictEqual(enumItem.members[2].type, 'char'); - assert.strictEqual(enumItem.members[2].arraySize, 20); + let unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + let unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OperationType'); + assert.strictEqual(unionItem.alias, 'OperationType'); + assert.strictEqual(unionItem.members.length, 3); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); + assert.strictEqual(unionItem.members[1].name, 'width'); + assert.strictEqual(unionItem.members[1].type, 'float'); + assert.strictEqual(unionItem.members[2].name, 'name'); + assert.strictEqual(unionItem.members[2].type, 'char'); + assert.strictEqual(unionItem.members[2].arraySize, 20); }); //2, 测试边界情况 @@ -53,207 +54,423 @@ suite('Parse_C_Union_Suite', () => { float width; char name[20][10]; } OperationType;` - let enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - let enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'optype'); - assert.strictEqual(enumItem.alias, 'OperationType'); - assert.strictEqual(enumItem.members.length, 3); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); - assert.strictEqual(enumItem.members[1].name, 'width'); - assert.strictEqual(enumItem.members[1].type, 'float'); - assert.strictEqual(enumItem.members[2].name, 'name'); - assert.strictEqual(enumItem.members[2].type, 'char'); - assert.strictEqual(enumItem.members[2].arraySize, 20); - assert.strictEqual(enumItem.members[2].arraySizeList[0], 20); - assert.strictEqual(enumItem.members[2].arraySizeList[1], 10); + let unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + let unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'optype'); + assert.strictEqual(unionItem.alias, 'OperationType'); + assert.strictEqual(unionItem.members.length, 3); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); + assert.strictEqual(unionItem.members[1].name, 'width'); + assert.strictEqual(unionItem.members[1].type, 'float'); + assert.strictEqual(unionItem.members[2].name, 'name'); + assert.strictEqual(unionItem.members[2].type, 'char'); + assert.strictEqual(unionItem.members[2].arraySize, 20); + assert.strictEqual(unionItem.members[2].arraySizeList[0], 20); + assert.strictEqual(unionItem.members[2].arraySizeList[1], 10); + + testenum = `typedef union optype { + char ch; + int len; + short slen; + long llen; + long long llint; + float width; + double dlen; + long double ldlen; + void* ptr; + char name[20][10]; + char ch3[10][20][30]; + int len3[10][20][30]; + short slen3[10][20][30]; + long llen3[10][20][30]; + long long llint3[10][20][30]; + float width3[10][20][30]; + double dlen3[10][20][30]; + long double ldlen3[10][20][30]; + void* ptr3[10][20][30]; + signed char sch; + signed int silen; + signed short slen; + signed long sllen; + signed long long sllint; + signed float swidth; + signed double sdlen; + signed long double sldlen; + signed void* ptr; + unsigend char uch; + unsigend int ulen; + unsigend short uslen; + unsigend long ullen; + unsigend long long ullint; + unsigend float uwidth; + unsigend double udlen; + unsigend long double uld; + unsigend void* uptr; + bool bflag; + } OperationType;` + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'optype'); + assert.strictEqual(unionItem.alias, 'OperationType'); + assert.strictEqual(unionItem.members.length, 38); + + assert.strictEqual(unionItem.members[0].name, 'ch'); + assert.strictEqual(unionItem.members[0].type, 'char'); + assert.strictEqual(unionItem.members[1].name, 'len'); + assert.strictEqual(unionItem.members[1].type, 'int'); + assert.strictEqual(unionItem.members[2].name, 'slen'); + assert.strictEqual(unionItem.members[2].type, 'short'); + assert.strictEqual(unionItem.members[3].name, 'llen'); + assert.strictEqual(unionItem.members[3].type, 'long'); + assert.strictEqual(unionItem.members[4].name, 'llint'); + assert.strictEqual(unionItem.members[4].type, 'long long'); + assert.strictEqual(unionItem.members[5].name, 'width'); + assert.strictEqual(unionItem.members[5].type, 'float'); + assert.strictEqual(unionItem.members[6].name, 'dlen'); + assert.strictEqual(unionItem.members[6].type, 'double'); + assert.strictEqual(unionItem.members[7].name, 'ldlen'); + assert.strictEqual(unionItem.members[7].type, 'long double'); + assert.strictEqual(unionItem.members[8].name, 'ptr'); + assert.strictEqual(unionItem.members[8].type, 'void*'); + assert.strictEqual(unionItem.members[9].name, 'name'); + assert.strictEqual(unionItem.members[9].type, 'char'); + assert.strictEqual(unionItem.members[9].arraySize, 20); + assert.strictEqual(unionItem.members[9].arraySizeList[0], 20); + assert.strictEqual(unionItem.members[9].arraySizeList[1], 10); + assert.strictEqual(unionItem.members[10].name, 'ch3'); + assert.strictEqual(unionItem.members[10].type, 'char'); + assert.strictEqual(unionItem.members[10].arraySize, 10); + assert.strictEqual(unionItem.members[10].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[10].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[10].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[11].name, 'len3'); + assert.strictEqual(unionItem.members[11].type, 'int'); + assert.strictEqual(unionItem.members[11].arraySize, 10); + assert.strictEqual(unionItem.members[11].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[11].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[11].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[12].name, 'slen3'); + assert.strictEqual(unionItem.members[12].type, 'short'); + assert.strictEqual(unionItem.members[12].arraySize, 10); + assert.strictEqual(unionItem.members[12].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[12].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[12].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[13].name, 'llen3'); + assert.strictEqual(unionItem.members[13].type, 'long'); + assert.strictEqual(unionItem.members[13].arraySize, 10); + assert.strictEqual(unionItem.members[13].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[13].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[13].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[14].name, 'llint3'); + assert.strictEqual(unionItem.members[14].type, 'long long'); + assert.strictEqual(unionItem.members[14].arraySize, 10); + assert.strictEqual(unionItem.members[14].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[14].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[14].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[15].name, 'width3'); + assert.strictEqual(unionItem.members[15].type, 'float'); + assert.strictEqual(unionItem.members[15].arraySize, 10); + assert.strictEqual(unionItem.members[15].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[15].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[15].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[16].name, 'dlen3'); + assert.strictEqual(unionItem.members[16].type, 'double'); + assert.strictEqual(unionItem.members[16].arraySize, 10); + assert.strictEqual(unionItem.members[16].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[16].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[16].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[17].name, 'ldlen3'); + assert.strictEqual(unionItem.members[17].type, 'long double'); + assert.strictEqual(unionItem.members[17].arraySize, 10); + assert.strictEqual(unionItem.members[17].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[17].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[17].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[18].name, 'ptr3'); + assert.strictEqual(unionItem.members[18].type, 'void*'); + assert.strictEqual(unionItem.members[18].arraySize, 10); + assert.strictEqual(unionItem.members[18].arraySizeList[0], 10); + assert.strictEqual(unionItem.members[18].arraySizeList[1], 20); + assert.strictEqual(unionItem.members[18].arraySizeList[2], 30); + assert.strictEqual(unionItem.members[19].name, 'sch'); + assert.strictEqual(unionItem.members[19].type, 'signed char'); + assert.strictEqual(unionItem.members[20].name, 'silen'); + assert.strictEqual(unionItem.members[20].type, 'signed int'); + assert.strictEqual(unionItem.members[21].name, 'slen'); + assert.strictEqual(unionItem.members[21].type, 'signed short'); + assert.strictEqual(unionItem.members[22].name, 'sllen'); + assert.strictEqual(unionItem.members[22].type, 'signed long'); + assert.strictEqual(unionItem.members[23].name, 'sllint'); + assert.strictEqual(unionItem.members[23].type, 'signed long long'); + assert.strictEqual(unionItem.members[24].name, 'swidth'); + assert.strictEqual(unionItem.members[24].type, 'signed float'); + assert.strictEqual(unionItem.members[25].name, 'sdlen'); + assert.strictEqual(unionItem.members[25].type, 'signed double'); + assert.strictEqual(unionItem.members[26].name, 'sldlen'); + assert.strictEqual(unionItem.members[26].type, 'signed long double'); + assert.strictEqual(unionItem.members[27].name, 'ptr'); + assert.strictEqual(unionItem.members[27].type, 'signed void*'); + assert.strictEqual(unionItem.members[28].name, 'uch'); + assert.strictEqual(unionItem.members[28].type, 'unsigend char'); + assert.strictEqual(unionItem.members[29].name, 'ulen'); + assert.strictEqual(unionItem.members[29].type, 'unsigend int'); + assert.strictEqual(unionItem.members[30].name, 'uslen'); + assert.strictEqual(unionItem.members[30].type, 'unsigend short'); + assert.strictEqual(unionItem.members[31].name, 'ullen'); + assert.strictEqual(unionItem.members[31].type, 'unsigend long'); + assert.strictEqual(unionItem.members[32].name, 'ullint'); + assert.strictEqual(unionItem.members[32].type, 'unsigend long long'); + assert.strictEqual(unionItem.members[33].name, 'uwidth'); + assert.strictEqual(unionItem.members[33].type, 'unsigend float'); + assert.strictEqual(unionItem.members[34].name, 'udlen'); + assert.strictEqual(unionItem.members[34].type, 'unsigend double'); + assert.strictEqual(unionItem.members[35].name, 'uld'); + assert.strictEqual(unionItem.members[35].type, 'unsigend long double'); + assert.strictEqual(unionItem.members[36].name, 'uptr'); + assert.strictEqual(unionItem.members[36].type, 'unsigend void*'); + assert.strictEqual(unionItem.members[37].name, 'bflag'); + assert.strictEqual(unionItem.members[37].type, 'bool'); testenum = `typedef union optype { int len; float width; char name[20][10];} OperationType;` - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'optype'); - assert.strictEqual(enumItem.alias, 'OperationType'); - assert.strictEqual(enumItem.members.length, 3); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); - assert.strictEqual(enumItem.members[1].name, 'width'); - assert.strictEqual(enumItem.members[1].type, 'float'); - assert.strictEqual(enumItem.members[2].name, 'name'); - assert.strictEqual(enumItem.members[2].type, 'char'); - assert.strictEqual(enumItem.members[2].arraySize, 20); - assert.strictEqual(enumItem.members[2].arraySizeList[0], 20); - assert.strictEqual(enumItem.members[2].arraySizeList[1], 10); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'optype'); + assert.strictEqual(unionItem.alias, 'OperationType'); + assert.strictEqual(unionItem.members.length, 3); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); + assert.strictEqual(unionItem.members[1].name, 'width'); + assert.strictEqual(unionItem.members[1].type, 'float'); + assert.strictEqual(unionItem.members[2].name, 'name'); + assert.strictEqual(unionItem.members[2].type, 'char'); + assert.strictEqual(unionItem.members[2].arraySize, 20); + assert.strictEqual(unionItem.members[2].arraySizeList[0], 20); + assert.strictEqual(unionItem.members[2].arraySizeList[1], 10); testenum = `typedef union { int len; } OperationType;` - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'OperationType'); - assert.strictEqual(enumItem.alias, 'OperationType'); - assert.strictEqual(enumItem.members.length, 1); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OperationType'); + assert.strictEqual(unionItem.alias, 'OperationType'); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); testenum = `union OperationType { int len; };` - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'OperationType'); - assert.strictEqual(enumItem.members.length, 1); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OperationType'); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); testenum = `typedef union OType { int len; } OperationType;` - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'OType'); - assert.strictEqual(enumItem.alias, 'OperationType'); - assert.strictEqual(enumItem.members.length, 1); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OType'); + assert.strictEqual(unionItem.alias, 'OperationType'); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); testenum = `union OType { int len; }; union TOTSize1 { int len; };` - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 2); - enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'OType'); - // assert.strictEqual(enumItem.alias, undefined); - assert.strictEqual(enumItem.members.length, 1); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); - enumItem = enumObjList[1]; - assert.strictEqual(enumItem.name, 'TOTSize1'); - // assert.strictEqual(enumItem.alias, undefined); - assert.strictEqual(enumItem.members.length, 1); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 2); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OType'); + // assert.strictEqual(unionItem.alias, undefined); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); + unionItem = unionObjList[1]; + assert.strictEqual(unionItem.name, 'TOTSize1'); + // assert.strictEqual(unionItem.alias, undefined); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); testenum = `union TEST_ENUM { int len; // comment char name[10]; } ;`; - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 1); - enumItem = enumObjList[0]; - assert.strictEqual(enumItem.name, 'TEST_ENUM'); - // assert.strictEqual(enumItem.alias, undefined); - assert.strictEqual(enumItem.members.length, 2); - assert.strictEqual(enumItem.members[0].name, 'len'); - assert.strictEqual(enumItem.members[0].type, 'int'); - assert.strictEqual(enumItem.members[1].name, 'name'); - assert.strictEqual(enumItem.members[1].type, 'char'); - assert.strictEqual(enumItem.members[1].arraySize, 10); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'TEST_ENUM'); + // assert.strictEqual(unionItem.alias, undefined); + assert.strictEqual(unionItem.members.length, 2); + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); + assert.strictEqual(unionItem.members[1].name, 'name'); + assert.strictEqual(unionItem.members[1].type, 'char'); + assert.strictEqual(unionItem.members[1].arraySize, 10); // 没有分号结尾 testenum = `union TEST_ENUM { int len; // comment char name[10] }`; - enumObjList = parsec.parseUnion(testenum); - assert.strictEqual(enumObjList.length, 0); + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 0); + + testenum = `union TEST_ENUM { + int len; // comment + char name[10]; + } TEST_ENUM_T`; + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 0); + testenum = `typedef union TEST_ENUM { + int len; // comment + char name[10]; + ENUM_T tenum; + CLASS_T tclass; + STRUCT_T tstruct; + UNION_T tunion; + } TEST_ENUM_T;`; + unionObjList = parsec.parseUnion(testenum); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'TEST_ENUM'); + assert.strictEqual(unionItem.alias, 'TEST_ENUM_T'); + assert.strictEqual(unionItem.members.length, 6); + + assert.strictEqual(unionItem.members[0].name, 'len'); + assert.strictEqual(unionItem.members[0].type, 'int'); + assert.strictEqual(unionItem.members[1].name, 'name'); + assert.strictEqual(unionItem.members[1].type, 'char'); + assert.strictEqual(unionItem.members[2].name, 'tenum'); + assert.strictEqual(unionItem.members[2].type, 'ENUM_T'); + assert.strictEqual(unionItem.members[3].name, 'tclass'); + assert.strictEqual(unionItem.members[3].type, 'CLASS_T'); + assert.strictEqual(unionItem.members[4].name, 'tstruct'); + assert.strictEqual(unionItem.members[4].type, 'STRUCT_T'); + assert.strictEqual(unionItem.members[5].name, 'tunion'); + assert.strictEqual(unionItem.members[5].type, 'UNION_T'); }); //3, 测试异常情况 - // test('parseUnion_test_3', () => { - // let teststr: string = ''; - // let enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = 'enum { ENUM_1 }'; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // let enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - - // teststr = `enum { - // ENUM_1, - // ENUM_2 };` - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - - // teststr = `enum { - // ENUM_1, // comment - // ENUM_2 - // }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - - // teststr = `enum OType { - // ENUM_1, // comment - // ENUM_2, - // };` - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - - // teststr = `typedef enum OType { - // ENUM_1, // comment - // ENUM_2, - // };` - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.members.length, 2); - // assert.strictEqual(enumItem.members[0], 'ENUM_1'); - // assert.strictEqual(enumItem.members[1], 'ENUM_2'); - // }); + test('parseUnion_test_3', () => { + let teststr: string = ''; + let unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = 'union unionname { ENUM_1 tn; };'; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + let unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'unionname'); + assert.strictEqual(unionItem.members[0].type, 'ENUM_1'); + assert.strictEqual(unionItem.members[0].name, 'tn'); + + teststr = `DEFINE union TU { + DEF_PARAM_1 + };` + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'TU'); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].type, 'DEF_PARAM_1'); + + teststr = `union { + }`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `union OType { + // comment + ENUM_1 ta; + ENUM_2 tb; + };` + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OType'); + assert.strictEqual(unionItem.members.length, 2); + assert.strictEqual(unionItem.members[0].type, 'ENUM_1'); + assert.strictEqual(unionItem.members[0].name, 'ta'); + assert.strictEqual(unionItem.members[1].type, 'ENUM_2'); + assert.strictEqual(unionItem.members[1].name, 'tb'); + + teststr = `typedef union OType { + ENUM_1 ta; /* comment */ + ENUM_2 tb; + };` + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.members.length, 2); + assert.strictEqual(unionItem.members[0].type, 'ENUM_1'); + assert.strictEqual(unionItem.members[0].name, 'ta'); + assert.strictEqual(unionItem.members[1].type, 'ENUM_2'); + assert.strictEqual(unionItem.members[1].name, 'tb'); + + teststr = `typedef union OType { + ENUM_1 ta, /* comment */ + ENUM_2 tb, + };` + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].type, 'ENUM_1'); + }); // //4, 测试错误情况 - // test('parseUnion_test_4', () => { - // let enumObjList = parsec.parseUnion(''); - // assert.strictEqual(enumObjList.length, 0); - - // let teststr = `typedef enum OType {`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `}; typedef enum OType //{} {}`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `typedefinde enumute OType { }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `TYPEDEFfinde ENUMute OType { }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 0); - - // teststr = `export typedef enum OType { }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // let enumItem = enumObjList[0]; - // assert.strictEqual(enumItem.name, 'OType'); - - // teststr = `typedef enum OType { }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - - // teststr = `typedef enum { }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - - // teststr = `typedef enum { }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - - // teststr = `typedef enum { ENUM_1 = 1, ENUM_2 = 2 }`; - // enumObjList = parsec.parseUnion(teststr); - // assert.strictEqual(enumObjList.length, 1); - // }); + test('parseUnion_test_4', () => { + let unionObjList = parsec.parseUnion(''); + assert.strictEqual(unionObjList.length, 0); + + let teststr = `typedef union OType {`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `}; typedef union OType //{} {}`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `typedefinde unionute OType { }`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `TYPEDEFfinde UNION OType { }`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `export typedef union OType { };`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + let unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'OType'); + + teststr = `typedef union OType { }`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `typedef union { };`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 0); + + teststr = `typedef union { } test_t;`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + + // TODO, this is error, need fix + teststr = `typedef union { ENUM_1 =1, ENUM_2 =2 } test_t;`; + unionObjList = parsec.parseUnion(teststr); + assert.strictEqual(unionObjList.length, 1); + unionItem = unionObjList[0]; + assert.strictEqual(unionItem.name, 'test_t'); + assert.strictEqual(unionItem.alias, 'test_t'); + assert.strictEqual(unionItem.members.length, 1); + assert.strictEqual(unionItem.members[0].type, "ENUM_1 =1, ENUM_2 =2"); + + }); }); -- Gitee