Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
246 changes: 246 additions & 0 deletions src/TypeShim.Generator.Tests/TypeScript/TypeScriptJSDocTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject }));
}
Expand Down Expand Up @@ -1943,4 +1946,247 @@ public DoSomething(): void {

""");
}

[Test]
public void TypeScriptUserClassProxy_ConstructorWithSummaryComment_RendersJSDoc()
{
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText("""
using System;
namespace N1;
[TSExport]
public class C1
{
/// <summary>
/// Initializes a new instance with <b>bold</b> formatting.
/// </summary>
public C1(string name) {}
public string Name => name;
}
""");

SymbolExtractor symbolExtractor = new([CSharpFileInfo.Create(syntaxTree)], TestFixture.TargetingPackRefDir);
List<INamedTypeSymbol> exportedClasses = [.. symbolExtractor.ExtractAllExportedSymbols()];
Assert.That(exportedClasses, Has.Count.EqualTo(1));
INamedTypeSymbol classSymbol = exportedClasses[0];

InteropTypeInfoCache typeCache = new();
ClassInfo classInfo = new ClassInfoBuilder(classSymbol, typeCache).Build();

RenderContext renderContext = new(classInfo, [classInfo], RenderOptions.TypeScript);
new TypescriptUserClassProxyRenderer(renderContext).Render();

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* Initializes a new instance with **bold** formatting.
*/
constructor(name: string) {
super(TypeShimConfig.exports.N1.C1Interop.ctor(name));
}

public get Name(): string {
return TypeShimConfig.exports.N1.C1Interop.get_Name(this.instance);
}
}

""");
}

[Test]
public void TypeScriptUserClassProxy_ConstructorWithParams_RendersJSDoc()
{
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText("""
using System;
namespace N1;
[TSExport]
public class C1
{
/// <summary>
/// Initializes a new instance.
/// </summary>
/// <param name="name">The name of the instance</param>
/// <param name="value">The initial value</param>
public C1(string name, int value) {}
public string Name => name;
}
""");

SymbolExtractor symbolExtractor = new([CSharpFileInfo.Create(syntaxTree)], TestFixture.TargetingPackRefDir);
List<INamedTypeSymbol> exportedClasses = [.. symbolExtractor.ExtractAllExportedSymbols()];
Assert.That(exportedClasses, Has.Count.EqualTo(1));
INamedTypeSymbol classSymbol = exportedClasses[0];

InteropTypeInfoCache typeCache = new();
ClassInfo classInfo = new ClassInfoBuilder(classSymbol, typeCache).Build();

RenderContext renderContext = new(classInfo, [classInfo], RenderOptions.TypeScript);
new TypescriptUserClassProxyRenderer(renderContext).Render();

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* Initializes a new instance.
* @param name - The name of the instance
* @param value - The initial value
*/
constructor(name: string, value: number) {
super(TypeShimConfig.exports.N1.C1Interop.ctor(name, value));
}

public get Name(): string {
return TypeShimConfig.exports.N1.C1Interop.get_Name(this.instance);
}
}

""");
}

[Test]
public void TypeScriptUserClassProxy_ConstructorWithRemarks_RendersJSDoc()
{
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText("""
using System;
namespace N1;
[TSExport]
public class C1
{
/// <summary>
/// Initializes a new instance.
/// </summary>
/// <remarks>
/// Use this constructor when you need a named instance.
/// </remarks>
public C1(string name) {}
public string Name => name;
}
""");

SymbolExtractor symbolExtractor = new([CSharpFileInfo.Create(syntaxTree)], TestFixture.TargetingPackRefDir);
List<INamedTypeSymbol> exportedClasses = [.. symbolExtractor.ExtractAllExportedSymbols()];
Assert.That(exportedClasses, Has.Count.EqualTo(1));
INamedTypeSymbol classSymbol = exportedClasses[0];

InteropTypeInfoCache typeCache = new();
ClassInfo classInfo = new ClassInfoBuilder(classSymbol, typeCache).Build();

RenderContext renderContext = new(classInfo, [classInfo], RenderOptions.TypeScript);
new TypescriptUserClassProxyRenderer(renderContext).Render();

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* Initializes a new instance.
* @remarks
* Use this constructor when you need a named instance.
*/
constructor(name: string) {
super(TypeShimConfig.exports.N1.C1Interop.ctor(name));
}

public get Name(): string {
return TypeShimConfig.exports.N1.C1Interop.get_Name(this.instance);
}
}

""");
}

[Test]
public void TypeScriptUserClassProxy_ConstructorWithException_RendersJSDoc()
{
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText("""
using System;
namespace N1;
[TSExport]
public class C1
{
/// <summary>
/// Initializes a new instance.
/// </summary>
/// <param name="name">The name of the instance</param>
/// <exception cref="System.ArgumentNullException">Thrown when name is null</exception>
public C1(string name) {}
public string Name => name;
}
""");

SymbolExtractor symbolExtractor = new([CSharpFileInfo.Create(syntaxTree)], TestFixture.TargetingPackRefDir);
List<INamedTypeSymbol> exportedClasses = [.. symbolExtractor.ExtractAllExportedSymbols()];
Assert.That(exportedClasses, Has.Count.EqualTo(1));
INamedTypeSymbol classSymbol = exportedClasses[0];

InteropTypeInfoCache typeCache = new();
ClassInfo classInfo = new ClassInfoBuilder(classSymbol, typeCache).Build();

RenderContext renderContext = new(classInfo, [classInfo], RenderOptions.TypeScript);
new TypescriptUserClassProxyRenderer(renderContext).Render();

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* Initializes a new instance.
* @param name - The name of the instance
* @throws {System.ArgumentNullException} Thrown when name is null
*/
constructor(name: string) {
super(TypeShimConfig.exports.N1.C1Interop.ctor(name));
}

public get Name(): string {
return TypeShimConfig.exports.N1.C1Interop.get_Name(this.instance);
}
}

""");
}

[Test]
public void TypeScriptUserClassProxy_ConstructorWithCommentAndSettableProperty_RendersJSDocWithInsertedInitializerParam()
{
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText("""
using System;
namespace N1;
[TSExport]
public class C1
{
/// <summary>
/// Initializes a new instance.
/// </summary>
public C1() {}
public string Name { get; set; }
}
""");

SymbolExtractor symbolExtractor = new([CSharpFileInfo.Create(syntaxTree)], TestFixture.TargetingPackRefDir);
List<INamedTypeSymbol> exportedClasses = [.. symbolExtractor.ExtractAllExportedSymbols()];
Assert.That(exportedClasses, Has.Count.EqualTo(1));
INamedTypeSymbol classSymbol = exportedClasses[0];

InteropTypeInfoCache typeCache = new();
ClassInfo classInfo = new ClassInfoBuilder(classSymbol, typeCache).Build();

RenderContext renderContext = new(classInfo, [classInfo], RenderOptions.TypeScript);
new TypescriptUserClassProxyRenderer(renderContext).Render();

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* Initializes a new instance.
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject }));
}

public get Name(): string {
return TypeShimConfig.exports.N1.C1Interop.get_Name(this.instance);
}

public set Name(value: string) {
TypeShimConfig.exports.N1.C1Interop.set_Name(this.instance, value);
}
}

""");
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using System;
using System.Collections.Generic;
Expand Down Expand Up @@ -157,6 +157,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: jsObject.P1.charCodeAt(0) }));
}
Expand Down Expand Up @@ -201,6 +204,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: jsObject.P1 ? jsObject.P1.charCodeAt(0) : null }));
}
Expand Down Expand Up @@ -245,6 +251,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: jsObject.P1.then(e => e.charCodeAt(0)) }));
}
Expand Down Expand Up @@ -289,6 +298,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: jsObject.P1 ? jsObject.P1.then(e => e.charCodeAt(0)) : null }));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using NUnit.Framework.Internal;
using TypeShim.Generator.CSharp;
Expand Down Expand Up @@ -1054,6 +1054,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: (arg0: number, arg1: ManagedObject) => jsObject.P1(String.fromCharCode(arg0), ProxyBase.fromHandle(UserClass, arg1)) }));
}
Expand Down Expand Up @@ -1108,6 +1111,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: (arg0: number) => { const retVal = jsObject.P1(String.fromCharCode(arg0)); return retVal instanceof UserClass ? retVal.instance : retVal } }));
}
Expand Down Expand Up @@ -1162,6 +1168,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: (arg0: number) => jsObject.P1(String.fromCharCode(arg0)) }));
}
Expand Down Expand Up @@ -1216,6 +1225,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject, P1: (arg0: ManagedObject) => jsObject.P1(ProxyBase.fromHandle(UserClass, arg0)) }));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using TypeShim.Generator.CSharp;
using TypeShim.Generator.Parsing;
Expand Down Expand Up @@ -598,6 +598,9 @@ public class C1

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor({ ...jsObject }));
}
Expand Down Expand Up @@ -641,6 +644,9 @@ public class C1(int i)

AssertEx.EqualOrDiff(renderContext.ToString(), """
export class C1 extends ProxyBase {
/**
* @param jsObject - Object with member-initializers
*/
constructor(i: number, jsObject: C1.Initializer) {
super(TypeShimConfig.exports.N1.C1Interop.ctor(i, { ...jsObject }));
}
Expand Down
Loading
Loading