From d003f6ec6c857708a2070ed1d182503e03ee2ef0 Mon Sep 17 00:00:00 2001 From: gou-jingjing Date: Tue, 15 Apr 2025 17:01:03 +0800 Subject: [PATCH 1/3] h2dts support callback/promise Signed-off-by: gou-jingjing --- src/vscode_plugin/src/gen/gendts.ts | 20 ++++++- .../src/test/suite/gen/gendtsclasses.test.ts | 5 +- .../src/test/suite/gen/gendtsfunction.test.ts | 57 ++++++++++++++----- 3 files changed, 67 insertions(+), 15 deletions(-) diff --git a/src/vscode_plugin/src/gen/gendts.ts b/src/vscode_plugin/src/gen/gendts.ts index eec7c9e3..de903222 100644 --- a/src/vscode_plugin/src/gen/gendts.ts +++ b/src/vscode_plugin/src/gen/gendts.ts @@ -466,6 +466,14 @@ export function getDtsFunction(rootInfo: GenInfo) { } }); out += funcHead + enumBody.slice(0, -2) + funcTail; + // 生成异步方法(callback)的dts + funcHead = `export function ${funcItem.name}Async(` + funcTail = returnType === 'void'? 'cbf: () => void): void;\n\n' : `cbf: (param: ${returnType}) => void): void;\n\n` + out += funcHead + enumBody + funcTail; + // 生成异步方法(promise)的dts + funcHead = `export function ${funcItem.name}Promise(` + funcTail = `): Promise<${returnType}>;\n\n`; + out += funcHead + enumBody.slice(0, -2) + funcTail; } } catch (e) { let errmsg = 'generate dts file error: ' + JSON.stringify(e); @@ -499,13 +507,18 @@ export function getDtsClasses(rootInfo: GenInfo) { methodContent += `${param.name}: ${transTskey2Ckey(param.type)}, `; } classBody += `\t${method.name}(${methodContent.slice(0, -2)}): ${transTskey2Ckey(method.returns)};\n` + // callback方法 + let callbackContent = method.returns === 'void'? 'cbf: () => void' : `cbf: (param: ${transTskey2Ckey(method.returns)}) => void` + classBody += `\t${method.name}Async(${methodContent}${callbackContent}): void;\n` + // promise方法 + classBody += `\t${method.name}Promsie(${methodContent.slice(0, -2)}): Promise<${transTskey2Ckey(method.returns)}>;\n` }; } } catch (e) { let errmsg = 'generate dts file error: ' + JSON.stringify(e); Logger.getInstance().error(errmsg); } - out += classHead + classBody + '};\n\n' + out += classHead + classBody + '}\n\n' if (classItem.name && classItem.alias) { out += `export type ${classItem.alias} = ${classItem.name};\n\n` } @@ -539,6 +552,11 @@ export function getDtsStructs(rootInfo: GenInfo) { } } structBody += `\t${method.name}(${methodContent.slice(0, -2)}): ${transTskey2Ckey(method.returns)};\n` + // callback方法 + let callbackContent = method.returns === 'void'? 'cbf: () => void' : `cbf: (param: ${transTskey2Ckey(method.returns)}) => void` + structBody += `\t${method.name}Async(${methodContent}${callbackContent}): void;\n` + // promise方法 + structBody += `\t${method.name}Promise(${methodContent.slice(0, -2)}): Promise<${transTskey2Ckey(method.returns)}>;\n`; }; } } catch (e) { diff --git a/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts b/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts index 42f55849..e4688e4e 100644 --- a/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts @@ -68,7 +68,10 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; let resStr = genDts.getDtsClasses(rootInfo1); - assert.strictEqual(resStr, 'export class ClassObj {\n\tval: number;\n\tclassFunc(v1: number): number;\n};\n\n'); + assert.strictEqual(resStr, 'export class ClassObj {\n\tval: number;\n\tclassFunc(v1: number): number;\n\t' + + 'classFuncAsync(v1: number, cbf: (param: number) => void): void;\n\t' + + 'classFuncPromise(v1: number): Promise;\n' + + '};\n\n'); //用例2.classes中alias不为空,且alias不等于name,其他正常 let classes2: ClassObj[] = [ diff --git a/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts b/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts index a0a9f21f..7c3f9fed 100644 --- a/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts @@ -56,7 +56,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } let resStr = genDts.getDtsFunction(rootInfo); - assert.strictEqual(resStr, 'export function testFunc(v1: boolean): number;\n\n'); + // assert.strictEqual(resStr, 'export function testFunc(v1: boolean): number;\n\n'); + assert.strictEqual(resStr.includes('export function testFunc(v1: boolean): number;'), true); + assert.strictEqual(resStr.includes('export function testFuncAsync(v1: boolean, cbf: (param: number) => void): void;'), true); + assert.strictEqual(resStr.includes('export function testFunc(v1: boolean): Promise;'), true); //用例2: 普通函数 let funcList2: FuncObj[] = [{ @@ -81,7 +84,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test' } resStr = genDts.getDtsFunction(rootInfo2); - assert.strictEqual(resStr, 'export function calculate(x: number, y: number): number;\n\n'); + // assert.strictEqual(resStr, 'export function calculate(x: number, y: number): number;\n\n'); + assert.strictEqual(resStr.includes('export function calculate(x: number, y: number): number;'), true); + assert.strictEqual(resStr.includes('export function calculateAsync(x: number, y: number, cbf: (param: number) => void): void;'), true); + assert.strictEqual(resStr.includes('export function calculatePromise(x: number, y: number): Promise;'), true); //用例3: typedef接口 let funcList3: FuncObj[] = [{ @@ -131,7 +137,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test' } resStr = genDts.getDtsFunction(rootInfo4); - assert.strictEqual(resStr, 'export function concat(str1: string, codes: Array, flag: boolean): string;\n\n'); + // assert.strictEqual(resStr, 'export function concat(str1: string, codes: Array, flag: boolean): string;\n\n'); + assert.strictEqual(resStr.includes('export function concat(str1: string, codes: Array, flag: boolean): string;'), true); + assert.strictEqual(resStr.includes('export function concatAsync(str1: string, codes: Array, flag: boolean, cbf: (param: string) => void): void;'), true); + assert.strictEqual(resStr.includes('export function concatPromsie(str1: string, codes: Array, flag: boolean): Promise;'), true); //用例5: 保留字函数名 let funcList5: FuncObj[] = [{ @@ -154,7 +163,11 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test' } resStr = genDts.getDtsFunction(rootInfo5); - assert.strictEqual(resStr, 'export function delete(id: number): void;\n\n'); + // assert.strictEqual(resStr, 'export function delete(id: number): void;\n\n'); + assert.strictEqual(resStr.includes('export function delete(id: number): void;'), true); + assert.strictEqual(resStr.includes('export function deleteAsync(id: number, cbf: () => void): void;'), true); + assert.strictEqual(resStr.includes('export function deletePromise(id: number): Promise;'), true); + //用例6 混合类型声明 let funcList6: FuncObj[] = [ @@ -195,7 +208,9 @@ suite('Gendts_funcs_Suite', () => { 'export interface Callback {\n' + '\t(code: number, message: string): void;\n' + '};\n\n' + - 'export function validate(cb: any, data: Array): boolean;\n\n'; + 'export function validate(cb: any, data: Array): boolean;\n\n' + + 'export function validateAsync(cb: any, data: Array, cbf: (param: boolean) => void): void;\n\n' + + 'export function validatePromise(cb: any, data: Array): Promise;\n\n'; assert.strictEqual(resStr, expected); //用例7: 保留字函数名 @@ -260,7 +275,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo2); - assert.strictEqual(resStr, 'export function testFunc(): number;\n\n'); + // assert.strictEqual(resStr, 'export function testFunc(): number;\n\n'); + assert.strictEqual(resStr.includes('export function testFunc(): number;'), true); + assert.strictEqual(resStr.includes('export function testFuncAsync(cbf: (param: number) => void): void;'), true); + assert.strictEqual(resStr.includes('export function testFuncPromise(): Promise'), true); //用例3 特殊字符参数名测试 let funcList3 = [ @@ -286,10 +304,14 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo3); - assert.strictEqual( - resStr, - 'export function specialChars(data-id: number, class: string): void;\n\n' - ); + // assert.strictEqual( + // resStr, + // 'export function specialChars(data-id: number, class: string): void;\n\n' + // ); + + assert.strictEqual(resStr.includes('export function specialChars(data-id: number, class: string): void;'), true); + assert.strictEqual(resStr.includes('export function specialCharsAsync(data-id: number, class: string, cbf: (param: void) => void): void;'), true); + assert.strictEqual(resStr.includes('export function specialCharsPromise(data-id: number, class: string): Promise;'), true); //用例4 最大参数数量 const maxParams = Array(10).fill(0).map((_,i) => ({ @@ -338,7 +360,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo5); - assert.strictEqual(resStr, 'export function invalid(): void;\n\n'); + // assert.strictEqual(resStr, 'export function invalid(): void;\n\n'); + assert.strictEqual(resStr.includes('export function invalid(): void;'), true); + assert.strictEqual(resStr.includes('export function invalidAsync(cbf: () => void): void;'), true); + assert.strictEqual(resStr.includes('export function invalidPromise(): Promise;'), true); //用例6: 带特殊符号的参数名 let funcList6 = [ @@ -364,7 +389,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo6); - assert.strictEqual(resStr, 'export function special(data-url: string, class: number): void;\n\n'); + // assert.strictEqual(resStr, 'export function special(data-url: string, class: number): void;\n\n'); + assert.strictEqual(resStr.includes('export function special(data-url: string, class: number): void;'), true); + assert.strictEqual(resStr.includes('export function specialAsync(data-url: string, class: number, cbf: () => void): void;'), true); + assert.strictEqual(resStr.includes('export function specialPromise(data-url: string, class: number): Promise;'), true); }); //3, 测试异常情况 @@ -485,7 +513,10 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } let reStr = genDts.getDtsFunction(rootInfo4); - assert.strictEqual(reStr, 'export function testFunc(param: any): any;\n\n'); + // assert.strictEqual(reStr, 'export function testFunc(param: any): any;\n\n'); + assert.strictEqual(reStr.includes('export function testFunc(param: any): any;'), true); + assert.strictEqual(reStr.includes('export function testFunc(param: any, cbf: (param: any) => void): any;'), true); + assert.strictEqual(reStr.includes('export function testFunc(param: any): Promise;'), true); assert.match(reStr, /param: any/); }); -- Gitee From 3b5816fb182740dcb00c9f908825574f43424871 Mon Sep 17 00:00:00 2001 From: gou-jingjing Date: Tue, 15 Apr 2025 19:12:49 +0800 Subject: [PATCH 2/3] fix compile err Signed-off-by: gou-jingjing --- src/vscode_plugin/src/gen/tools/genproxycppfile.ts | 1 + src/vscode_plugin/src/gen/tools/genstubcppfile.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vscode_plugin/src/gen/tools/genproxycppfile.ts b/src/vscode_plugin/src/gen/tools/genproxycppfile.ts index 377acb93..54a92c81 100644 --- a/src/vscode_plugin/src/gen/tools/genproxycppfile.ts +++ b/src/vscode_plugin/src/gen/tools/genproxycppfile.ts @@ -45,6 +45,7 @@ export function genProxyFunc(funcInfo: FuncObj, className: string, paramStr: str 'name': 'result', 'type': funcInfo.returns, 'arraySize': -1, + 'arraySizeList': [] }; readReplyStr += '\n' + tab + genRead('reply', destObj); readReplyStr += '\n' + tab + 'return result;'; diff --git a/src/vscode_plugin/src/gen/tools/genstubcppfile.ts b/src/vscode_plugin/src/gen/tools/genstubcppfile.ts index b44f7623..a9248976 100644 --- a/src/vscode_plugin/src/gen/tools/genstubcppfile.ts +++ b/src/vscode_plugin/src/gen/tools/genstubcppfile.ts @@ -44,7 +44,8 @@ function genStubInnerFunc(funcInfo: FuncObj, className: string) { let destObj = { 'name': param.name + 'Val', 'type': param.type, - 'arraySize': -1 + 'arraySize': -1, + 'arraySizeList': [] }; readDataStr += '\n' + tab + genRead('data', destObj); innerParamStr += innerParamName; -- Gitee From a9fa601c064a2d4004b2d212de997de6448102dd Mon Sep 17 00:00:00 2001 From: gou-jingjing Date: Wed, 16 Apr 2025 11:31:40 +0800 Subject: [PATCH 3/3] fix gen test bug Signed-off-by: gou-jingjing --- .../src/test/suite/gen/gendtsclasses.test.ts | 160 +++++++++++++----- .../src/test/suite/gen/gendtsfunction.test.ts | 107 +++++++----- .../src/test/suite/gen/gendtsstructs.test.ts | 71 ++++++-- .../test/suite/gen/gennapicommoncpp.test.ts | 1 + .../src/test/suite/gen/gennapicommonh.test.ts | 1 + 5 files changed, 235 insertions(+), 105 deletions(-) diff --git a/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts b/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts index e4688e4e..c3c3d9c0 100644 --- a/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gendtsclasses.test.ts @@ -68,10 +68,13 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; let resStr = genDts.getDtsClasses(rootInfo1); - assert.strictEqual(resStr, 'export class ClassObj {\n\tval: number;\n\tclassFunc(v1: number): number;\n\t' - + 'classFuncAsync(v1: number, cbf: (param: number) => void): void;\n\t' - + 'classFuncPromise(v1: number): Promise;\n' - + '};\n\n'); + assert.strictEqual(resStr, 'export class ClassObj {\n' + + '\tval: number;\n' + + '\tclassFunc(v1: number): number;\n' + + '\tclassFuncAsync(v1: number, cbf: (param: number) => void): void;\n' + + '\tclassFuncPromise(v1: number): Promise;\n' + + '}\n' + + '\n'); //用例2.classes中alias不为空,且alias不等于name,其他正常 let classes2: ClassObj[] = [ @@ -116,8 +119,15 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; resStr = genDts.getDtsClasses(rootInfo2); - assert.strictEqual(resStr, 'export class ClassObj {\n\tval: number;\n\tclassFunc(v1: number): number;\n};\n\n' - + 'export type Alias = ClassObj;\n\n'); + assert.strictEqual(resStr, 'export class ClassObj {\n' + + '\tval: number;\n' + + '\tclassFunc(v1: number): number;\n' + + '\tclassFuncAsync(v1: number, cbf: (param: number) => void): void;\n' + + '\tclassFuncPromise(v1: number): Promise;\n' + + '}\n' + + '\n' + + 'export type Alias = ClassObj;\n' + + '\n'); //用例3.classes中alias不为空,且alias等于name,其他正常 let Classes3:ClassObj[] = [ @@ -162,8 +172,15 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; resStr = genDts.getDtsClasses(rootInfo3); - assert.strictEqual(resStr, 'export class ClassObj {\n\tval: number;\n\tclassFunc(v1: number): number;\n};\n\n' - + 'export type ClassObj = ClassObj;\n\n'); + assert.strictEqual(resStr, 'export class ClassObj {\n' + + '\tval: number;\n' + + '\tclassFunc(v1: number): number;\n' + + '\tclassFuncAsync(v1: number, cbf: (param: number) => void): void;\n' + + '\tclassFuncPromise(v1: number): Promise;\n' + + '}\n' + + '\n' + + 'export type ClassObj = ClassObj;\n' + + '\n'); //用例4. 混合多个类和复杂参数 let classes4: ClassObj[] = [ @@ -219,11 +236,18 @@ suite('Gendts_classes_Suite', () => { '\tspeed: number;\n' + '\tisRunning: boolean;\n' + '\tstart(keyType: number, authCode: string, true: boolean): void;\n' + - '};\n\n' + - 'export type Car = Vehicle;\n\n' + + '\tstartAsync(keyType: number, authCode: string, true: boolean, cbf: () => void): void;\n' + + '\tstartPromise(keyType: number, authCode: string, true: boolean): Promise;\n' + + '}\n' + + '\n' + + 'export type Car = Vehicle;\n' + + '\n' + 'export class Engine {\n' + '\tgetRPM(): number;\n' + - '};\n\n'; + '\tgetRPMAsync(cbf: (param: number) => void): void;\n' + + '\tgetRPMPromise(): Promise;\n' + + '}\n' + + '\n'; assert.strictEqual(resStr, expected); //用例5. 测试多参数方法的情况 @@ -259,8 +283,14 @@ suite('Gendts_classes_Suite', () => { resStr = genDts.getDtsClasses(rootInfo5); assert.strictEqual( resStr, - 'export class MultiParamClass {\n\tcalculate(x: number, y: number): number;\n};\n\n' + - 'export type MPCType = MultiParamClass;\n\n' + 'export class MultiParamClass {\n' + + '\tcalculate(x: number, y: number): number;\n' + + '\tcalculateAsync(x: number, y: number, cbf: (param: number) => void): void;\n' + + '\tcalculatePromise(x: number, y: number): Promise;\n' + + '}\n' + + '\n' + + 'export type MPCType = MultiParamClass;\n' + + '\n' ); //用例6. 测试混合多个类的情况 @@ -304,9 +334,14 @@ suite('Gendts_classes_Suite', () => { resStr = genDts.getDtsClasses(rootInfo6); assert.strictEqual( resStr, - 'export class ClassA {\n\tflag: boolean;\n};\n\n' + + 'export class ClassA {\n\tflag: boolean;\n}\n\n' + 'export type AliasA = ClassA;\n\n' + - 'export class ClassB {\n\tgetName(): string;\n};\n\n' + 'export class ClassB {\n' + + '\tgetName(): string;\n' + + '\tgetNameAsync(cbf: (param: string) => void): void;\n' + + '\tgetNamePromise(): Promise;\n' + + '}\n' + + '\n' ); //用例7. 测试特殊类型转换(如布尔型) @@ -349,8 +384,15 @@ suite('Gendts_classes_Suite', () => { resStr = genDts.getDtsClasses(rootInfo7); assert.strictEqual( resStr, - 'export class SpecialTypes {\n\tisValid: boolean;\n\tgetChar(input: number): string;\n};\n\n' + - 'export type SType = SpecialTypes;\n\n' + 'export class SpecialTypes {\n' + + '\tisValid: boolean;\n' + + '\tgetChar(input: number): string;\n' + + '\tgetCharAsync(input: number, cbf: (param: string) => void): void;\n' + + '\tgetCharPromise(input: number): Promise;\n' + + '}\n' + + '\n' + + 'export type SType = SpecialTypes;\n' + + '\n' ); //用例8. 包含数组类型和复杂类型转换 @@ -389,12 +431,16 @@ suite('Gendts_classes_Suite', () => { resStr = genDts.getDtsClasses(rootInfo8); assert.strictEqual( resStr, - 'export class DataContainer {\n' + - '\tscores: Array;\n' + - '\tbuffer: string;\n' + - '\tgetData(length: number, compress: boolean): void;\n' + - '};\n\n' + - 'export type DC = DataContainer;\n\n' + 'export class DataContainer {\n' + + '\tscores: Array;\n' + + '\tbuffer: string;\n' + + '\tgetData(length: number, compress: boolean): void;\n' + + '\tgetDataAsync(length: number, compress: boolean, cbf: (param: void) => void): void;\n' + + '\tgetDataPromise(length: number, compress: boolean): Promise;\n' + + '}\n' + + '\n' + + 'export type DC = DataContainer;\n' + + '\n' ); //用例9. 测试C++特殊类型转换 @@ -436,7 +482,10 @@ suite('Gendts_classes_Suite', () => { '\tcount: number;\n' + '\tbigNum: number;\n' + '\tgetSize(buffer: number): number;\n' + - '};\n\n' + '\tgetSizeAsync(buffer: number, cbf: (param: number) => void): void;\n' + + '\tgetSizePromise(buffer: number): Promise;\n' + + '}\n' + + '\n' ); //用例10. 测试静态成员和方法 @@ -474,7 +523,10 @@ suite('Gendts_classes_Suite', () => { 'export class Utils {\n' + '\tVERSION: string;\n' + '\tstaticMethod(): void;\n' + - '};\n\n' + '\tstaticMethodAsync(cbf: () => void): void;\n' + + '\tstaticMethodPromise(): Promise;\n' + + '}\n' + + '\n' ); //用例11. 测试模板类处理 @@ -515,10 +567,14 @@ suite('Gendts_classes_Suite', () => { assert.strictEqual( genDts.getDtsClasses(rootInfo11), 'export class Vector {\n' + - '\tdata: any;\n' + // 假设泛型暂未处理,返回any类型 + '\tdata: any;\n' + '\tpush(item: any): void;\n' + - '};\n\n' + - 'export type Vec = Vector;\n\n' + '\tpushAsync(item: any, cbf: () => void): void;\n' + + '\tpushPromise(item: any): Promise;\n' + + '}\n' + + '\n' + + 'export type Vec = Vector;\n' + + '\n' ); //用例12. 测试const成员变量 @@ -550,7 +606,7 @@ suite('Gendts_classes_Suite', () => { genDts.getDtsClasses(rootInfo12), 'export class Constants {\n' + '\tMAX_SIZE: number;\n' + - '};\n\n' + '}\n\n' ); //用例13. 测试嵌套类 @@ -582,7 +638,7 @@ suite('Gendts_classes_Suite', () => { genDts.getDtsClasses(rootInfo13), 'export class Outer::Inner {\n' + '\tvalue: number;\n' + - '};\n\n' + + '}\n\n' + 'export type Nested = Outer::Inner;\n\n' ); }); @@ -636,7 +692,12 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; let resStr2 = genDts.getDtsClasses(rootInfo2); - assert.strictEqual(resStr2, 'export class ClassObj {\n\tclassFunc(v1: number): number;\n};\n\n'); + assert.strictEqual(resStr2, 'export class ClassObj {\n' + + '\tclassFunc(v1: number): number;\n' + + '\tclassFuncAsync(v1: number, cbf: (param: number) => void): void;\n' + + '\tclassFuncPromise(v1: number): Promise;\n' + + '}\n' + + '\n'); //用例3.class有成员,成员变量不为空,成员方法为空 let rootInfo3 = { @@ -662,7 +723,7 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; let resStr3 = genDts.getDtsClasses(rootInfo3); - assert.strictEqual(resStr3, 'export class ClassObj {\n\tval: number;\n};\n\n'); + assert.strictEqual(resStr3, 'export class ClassObj {\n\tval: number;\n}\n\n'); //用例4. 特殊命名测试 let rootInfo4 = { @@ -690,13 +751,16 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; let res4 = genDts.getDtsClasses(rootInfo4); - assert.strictEqual( - res4, - 'export class Class$With$SpecialChars {\n' + - '\tdata-url: string;\n' + - '\tdelete(): void;\n' + - '};\n\n' + - 'export type Alias_With_Underscore = Class$With$SpecialChars;\n\n' + assert.strictEqual(res4, + 'export class Class$With$SpecialChars {\n' + + '\tdata-url: string;\n' + + '\tdelete(): void;\n' + + '\tdeleteAsync(cbf: () => void): void;\n' + + '\tdeletePromise(): Promise;\n' + + '}\n' + + '\n' + + 'export type Alias_With_Underscore = Class$With$SpecialChars;\n' + + '\n' ); //用例5. 空参数列表测试 @@ -721,7 +785,12 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; let res5 = genDts.getDtsClasses(rootInfo5); - assert.strictEqual(res5, 'export class EmptyParams {\n\tnoop(): void;\n};\n\n'); + assert.strictEqual(res5, 'export class EmptyParams {\n' + + '\tnoop(): void;\n' + + '\tnoopAsync(cbf: () => void): void;\n' + + '\tnoopPromise(): Promise;\n' + + '}\n' + + '\n'); //用例6. 参数缺少必要字段,缺少alias属性的情况 let rootInfo6: GenInfo = { @@ -746,7 +815,7 @@ suite('Gendts_classes_Suite', () => { fileName: 'test', }; resStr = genDts.getDtsClasses(rootInfo6); - assert.strictEqual(resStr, 'export class InvalidClass {\n\tinvalidVar: string;\n};\n\n'); + assert.strictEqual(resStr, 'export class InvalidClass {\n\tinvalidVar: string;\n}\n\n'); //用例7. 测试空变量和空方法的类结构 let classes7: ClassObj[] = [ @@ -773,7 +842,7 @@ suite('Gendts_classes_Suite', () => { let resStr7 = genDts.getDtsClasses(rootInfo7); assert.strictEqual( resStr7, - 'export class EmptyClass {\n};\n\n' + + 'export class EmptyClass {\n}\n\n' + 'export type EmptyAlias = EmptyClass;\n\n' ); @@ -802,11 +871,8 @@ suite('Gendts_classes_Suite', () => { }; let resStr8 = genDts.getDtsClasses(rootInfo8); - assert.match( - resStr8, - new RegExp(`export class ${longName} {\\n\\tvalue: number;\\n};\\n\\n` - + `export type ${longName}_Alias = ${longName};`) - ); + assert.strictEqual(resStr8, `export class ${longName} {\n\tvalue: number;\n}\n\n` + + `export type ${longName}_Alias = ${longName};\n\n`); }); //3, 测试异常情况 diff --git a/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts b/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts index 7c3f9fed..54b2c510 100644 --- a/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gendtsfunction.test.ts @@ -56,10 +56,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } let resStr = genDts.getDtsFunction(rootInfo); - // assert.strictEqual(resStr, 'export function testFunc(v1: boolean): number;\n\n'); - assert.strictEqual(resStr.includes('export function testFunc(v1: boolean): number;'), true); - assert.strictEqual(resStr.includes('export function testFuncAsync(v1: boolean, cbf: (param: number) => void): void;'), true); - assert.strictEqual(resStr.includes('export function testFunc(v1: boolean): Promise;'), true); + assert.strictEqual(resStr, 'export function testFunc(v1: boolean): number;\n' + + '\n' + + 'export function testFuncAsync(v1: boolean, cbf: (param: number) => void): void;\n' + + '\n' + + 'export function testFuncPromise(v1: boolean): Promise;\n' + + '\n'); //用例2: 普通函数 let funcList2: FuncObj[] = [{ @@ -84,10 +86,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test' } resStr = genDts.getDtsFunction(rootInfo2); - // assert.strictEqual(resStr, 'export function calculate(x: number, y: number): number;\n\n'); - assert.strictEqual(resStr.includes('export function calculate(x: number, y: number): number;'), true); - assert.strictEqual(resStr.includes('export function calculateAsync(x: number, y: number, cbf: (param: number) => void): void;'), true); - assert.strictEqual(resStr.includes('export function calculatePromise(x: number, y: number): Promise;'), true); + assert.strictEqual(resStr, 'export function calculate(x: number, y: number): number;\n' + + '\n' + + 'export function calculateAsync(x: number, y: number, cbf: (param: number) => void): void;\n' + + '\n' + + 'export function calculatePromise(x: number, y: number): Promise;\n' + + '\n'); //用例3: typedef接口 let funcList3: FuncObj[] = [{ @@ -137,10 +141,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test' } resStr = genDts.getDtsFunction(rootInfo4); - // assert.strictEqual(resStr, 'export function concat(str1: string, codes: Array, flag: boolean): string;\n\n'); - assert.strictEqual(resStr.includes('export function concat(str1: string, codes: Array, flag: boolean): string;'), true); - assert.strictEqual(resStr.includes('export function concatAsync(str1: string, codes: Array, flag: boolean, cbf: (param: string) => void): void;'), true); - assert.strictEqual(resStr.includes('export function concatPromsie(str1: string, codes: Array, flag: boolean): Promise;'), true); + assert.strictEqual(resStr, 'export function concat(str1: string, codes: Array, flag: boolean): string;\n' + + '\n' + + 'export function concatAsync(str1: string, codes: Array, flag: boolean, cbf: (param: string) => void): void;\n' + + '\n' + + 'export function concatPromise(str1: string, codes: Array, flag: boolean): Promise;\n' + + '\n'); //用例5: 保留字函数名 let funcList5: FuncObj[] = [{ @@ -163,11 +169,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test' } resStr = genDts.getDtsFunction(rootInfo5); - // assert.strictEqual(resStr, 'export function delete(id: number): void;\n\n'); - assert.strictEqual(resStr.includes('export function delete(id: number): void;'), true); - assert.strictEqual(resStr.includes('export function deleteAsync(id: number, cbf: () => void): void;'), true); - assert.strictEqual(resStr.includes('export function deletePromise(id: number): Promise;'), true); - + assert.strictEqual(resStr, 'export function delete(id: number): void;\n' + + '\n' + + 'export function deleteAsync(id: number, cbf: () => void): void;\n' + + '\n' + + 'export function deletePromise(id: number): Promise;\n' + + '\n'); //用例6 混合类型声明 let funcList6: FuncObj[] = [ @@ -210,7 +217,7 @@ suite('Gendts_funcs_Suite', () => { '};\n\n' + 'export function validate(cb: any, data: Array): boolean;\n\n' + 'export function validateAsync(cb: any, data: Array, cbf: (param: boolean) => void): void;\n\n' + - 'export function validatePromise(cb: any, data: Array): Promise;\n\n'; + 'export function validatePromise(cb: any, data: Array): Promise;\n\n'; assert.strictEqual(resStr, expected); //用例7: 保留字函数名 @@ -234,7 +241,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', }; resStr = genDts.getDtsFunction(rootInfo7); - assert.strictEqual(resStr, 'export function delete(id: number): void;\n\n'); + assert.strictEqual(resStr, 'export function delete(id: number): void;\n' + + '\n' + + 'export function deleteAsync(id: number, cbf: () => void): void;\n' + + '\n' + + 'export function deletePromise(id: number): Promise;\n' + + '\n'); }); //2, 测试边界情况 @@ -275,10 +287,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo2); - // assert.strictEqual(resStr, 'export function testFunc(): number;\n\n'); - assert.strictEqual(resStr.includes('export function testFunc(): number;'), true); - assert.strictEqual(resStr.includes('export function testFuncAsync(cbf: (param: number) => void): void;'), true); - assert.strictEqual(resStr.includes('export function testFuncPromise(): Promise'), true); + assert.strictEqual(resStr, 'export function testFunc(): number;\n' + + '\n' + + 'export function testFuncAsync(cbf: (param: number) => void): void;\n' + + '\n' + + 'export function testFuncPromise(): Promise;\n' + + '\n'); //用例3 特殊字符参数名测试 let funcList3 = [ @@ -304,14 +318,15 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo3); - // assert.strictEqual( - // resStr, - // 'export function specialChars(data-id: number, class: string): void;\n\n' - // ); - - assert.strictEqual(resStr.includes('export function specialChars(data-id: number, class: string): void;'), true); - assert.strictEqual(resStr.includes('export function specialCharsAsync(data-id: number, class: string, cbf: (param: void) => void): void;'), true); - assert.strictEqual(resStr.includes('export function specialCharsPromise(data-id: number, class: string): Promise;'), true); + assert.strictEqual( + resStr, + 'export function specialChars(data-id: number, class: string): void;\n' + + '\n' + + 'export function specialCharsAsync(data-id: number, class: string, cbf: () => void): void;\n' + + '\n' + + 'export function specialCharsPromise(data-id: number, class: string): Promise;\n' + + '\n' + ); //用例4 最大参数数量 const maxParams = Array(10).fill(0).map((_,i) => ({ @@ -360,10 +375,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo5); - // assert.strictEqual(resStr, 'export function invalid(): void;\n\n'); - assert.strictEqual(resStr.includes('export function invalid(): void;'), true); - assert.strictEqual(resStr.includes('export function invalidAsync(cbf: () => void): void;'), true); - assert.strictEqual(resStr.includes('export function invalidPromise(): Promise;'), true); + assert.strictEqual(resStr, 'export function invalid(): void;\n' + + '\n' + + 'export function invalidAsync(cbf: () => void): void;\n' + + '\n' + + 'export function invalidPromise(): Promise;\n' + + '\n'); //用例6: 带特殊符号的参数名 let funcList6 = [ @@ -389,10 +406,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } resStr = genDts.getDtsFunction(rootInfo6); - // assert.strictEqual(resStr, 'export function special(data-url: string, class: number): void;\n\n'); - assert.strictEqual(resStr.includes('export function special(data-url: string, class: number): void;'), true); - assert.strictEqual(resStr.includes('export function specialAsync(data-url: string, class: number, cbf: () => void): void;'), true); - assert.strictEqual(resStr.includes('export function specialPromise(data-url: string, class: number): Promise;'), true); + assert.strictEqual(resStr, 'export function special(data-url: string, class: number): void;\n' + + '\n' + + 'export function specialAsync(data-url: string, class: number, cbf: () => void): void;\n' + + '\n' + + 'export function specialPromise(data-url: string, class: number): Promise;\n' + + '\n'); }); //3, 测试异常情况 @@ -513,10 +532,12 @@ suite('Gendts_funcs_Suite', () => { fileName: 'test', } let reStr = genDts.getDtsFunction(rootInfo4); - // assert.strictEqual(reStr, 'export function testFunc(param: any): any;\n\n'); - assert.strictEqual(reStr.includes('export function testFunc(param: any): any;'), true); - assert.strictEqual(reStr.includes('export function testFunc(param: any, cbf: (param: any) => void): any;'), true); - assert.strictEqual(reStr.includes('export function testFunc(param: any): Promise;'), true); + assert.strictEqual(reStr, 'export function testFunc(param: any): any;\n' + + '\n' + + 'export function testFuncAsync(param: any, cbf: (param: any) => void): void;\n' + + '\n' + + 'export function testFuncPromise(param: any): Promise;\n' + + '\n'); assert.match(reStr, /param: any/); }); diff --git a/src/vscode_plugin/src/test/suite/gen/gendtsstructs.test.ts b/src/vscode_plugin/src/test/suite/gen/gendtsstructs.test.ts index b4df10e4..bc1bf4f6 100644 --- a/src/vscode_plugin/src/test/suite/gen/gendtsstructs.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gendtsstructs.test.ts @@ -75,8 +75,14 @@ suite('Gendts_structs_Suite', () => { }; let resStr = genDts.getDtsStructs(rootInfo); - assert.strictEqual(resStr, 'export type StructObj = {\n\tname: string;' - + '\n\tage: number;\n\tfuncTest(v: number): boolean;\n};\n\n'); + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tname: string;\n' + + '\tage: number;\n' + + '\tfuncTest(v: number): boolean;\n' + + '\tfuncTestAsync(v: number, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(v: number): Promise;\n' + + '};\n' + + '\n'); //用例2.正常情况,有alias,且alias不等于name let structs2: StructObj[] = [ @@ -128,9 +134,16 @@ suite('Gendts_structs_Suite', () => { }; resStr = genDts.getDtsStructs(rootInfo2); - assert.strictEqual(resStr, 'export type StructObj = {\n\tname: string;' - + '\n\tage: number;\n\tfuncTest(v: number): boolean;\n};\n\n' - + 'export type Alias = StructObj;\n\n'); + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tname: string;\n' + + '\tage: number;\n' + + '\tfuncTest(v: number): boolean;\n' + + '\tfuncTestAsync(v: number, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(v: number): Promise;\n' + + '};\n' + + '\n' + + 'export type Alias = StructObj;\n' + + '\n'); //用例3.正常情况,有alias,且alias等于name let structs3: StructObj[] = [ @@ -182,8 +195,14 @@ suite('Gendts_structs_Suite', () => { }; resStr = genDts.getDtsStructs(rootInfo3); - assert.strictEqual(resStr, 'export type StructObj = {\n\tname: string;' - + '\n\tage: number;\n\tfuncTest(v: number): boolean;\n};\n\n'); + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tname: string;\n' + + '\tage: number;\n' + + '\tfuncTest(v: number): boolean;\n' + + '\tfuncTestAsync(v: number, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(v: number): Promise;\n' + + '};\n' + + '\n'); //用例4.正常情况,一个member,多个parameters let structs4: StructObj[] = [ @@ -226,8 +245,13 @@ suite('Gendts_structs_Suite', () => { }; resStr = genDts.getDtsStructs(rootInfo4); - assert.strictEqual(resStr, 'export type StructObj = {\n\tname: string;' - + '\n\tfuncTest(a: string, b: number, c: boolean): boolean;\n};\n\n'); + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tname: string;\n' + + '\tfuncTest(a: string, b: number, c: boolean): boolean;\n' + + '\tfuncTestAsync(a: string, b: number, c: boolean, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(a: string, b: number, c: boolean): Promise;\n' + + '};\n' + + '\n'); //用例4.正常情况,多个member,多个parameters let structs5: StructObj[] = [ @@ -276,8 +300,14 @@ suite('Gendts_structs_Suite', () => { }; resStr = genDts.getDtsStructs(rootInfo5); - assert.strictEqual(resStr, 'export type StructObj = {\n\tname: string;' - + '\n\tage: number;\n\tfuncTest(aa: string, bb: number, cc: boolean): boolean;\n};\n\n'); + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tname: string;\n' + + '\tage: number;\n' + + '\tfuncTest(aa: string, bb: number, cc: boolean): boolean;\n' + + '\tfuncTestAsync(aa: string, bb: number, cc: boolean, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(aa: string, bb: number, cc: boolean): Promise;\n' + + '};\n' + + '\n'); //用例6.正常情况,一个member,一个parameters let structs6: StructObj[] = [ @@ -318,9 +348,15 @@ suite('Gendts_structs_Suite', () => { }; resStr = genDts.getDtsStructs(rootInfo6); - assert.strictEqual(resStr, 'export type StructObj = {\n\tname: string;' - + '\n\tfuncTest(aa: string): boolean;\n};\n\nexport type Alias = StructObj;\n\n'); - + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tname: string;\n' + + '\tfuncTest(aa: string): boolean;\n' + + '\tfuncTestAsync(aa: string, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(aa: string): Promise;\n' + + '};\n' + + '\n' + + 'export type Alias = StructObj;\n' + + '\n'); }); //2, 测试边界情况 @@ -372,7 +408,12 @@ suite('Gendts_structs_Suite', () => { fileName: 'test', }; resStr = genDts.getDtsStructs(rootInfo2); - assert.strictEqual(resStr, 'export type StructObj = {\n\tfuncTest(v: number): boolean;\n};\n\n'); + assert.strictEqual(resStr, 'export type StructObj = {\n' + + '\tfuncTest(v: number): boolean;\n' + + '\tfuncTestAsync(v: number, cbf: (param: boolean) => void): void;\n' + + '\tfuncTestPromise(v: number): Promise;\n' + + '};\n' + + '\n'); //用例3.structs有成员,成员变量不为空,成员方法为空 let structs3: StructObj[] =[{ diff --git a/src/vscode_plugin/src/test/suite/gen/gennapicommoncpp.test.ts b/src/vscode_plugin/src/test/suite/gen/gennapicommoncpp.test.ts index 890d2f56..5bc3db06 100644 --- a/src/vscode_plugin/src/test/suite/gen/gennapicommoncpp.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gennapicommoncpp.test.ts @@ -76,6 +76,7 @@ suite('Gennapicommoncpp_file_Suite', () => { let rootInfo: GenInfo = { parseObj: parseObj, rawFilePath: hFilePath, + fileName: undefined } let fileContent = genNapiCommonCpp.doGenCommonCppFile(rootInfo, napiCommonCppTemplate.content); assert.strictEqual(fileContent.indexOf('[fileName]') >= 0? 0: -1, 0); diff --git a/src/vscode_plugin/src/test/suite/gen/gennapicommonh.test.ts b/src/vscode_plugin/src/test/suite/gen/gennapicommonh.test.ts index e46023cc..cc149f03 100644 --- a/src/vscode_plugin/src/test/suite/gen/gennapicommonh.test.ts +++ b/src/vscode_plugin/src/test/suite/gen/gennapicommonh.test.ts @@ -78,6 +78,7 @@ suite('Gennapicommonh_file_Suite', () => { let rootInfo: GenInfo = { parseObj: parseObj, rawFilePath: hFilePath, + fileName: undefined } let fileContent = genNapiCommonH.doGenCommonHFile(rootInfo, napiCommonHTemplate.content); assert.strictEqual(fileContent.indexOf('[upper_filename]') >= 0? 0: -1, 0); -- Gitee