Skip to content

Commit

Permalink
Generated members documentation. (#37) (#38)
Browse files Browse the repository at this point in the history
* Generated members documentation.

* Tests
  • Loading branch information
Tum4ik authored Feb 2, 2024
1 parent 4387cef commit 5eca120
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 14 deletions.
1 change: 1 addition & 0 deletions SolutionProperties/ReleaseNotes.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
- New API to control implementation wrapper generation.
- Keep members original XML documentation.
18 changes: 18 additions & 0 deletions Tests/Tum4ik.StinimGen.Specs/Features/Event/Event.feature
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,12 @@ Scenario: Event field with EventHandler type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.EventHandler EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.EventHandler EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -49,10 +51,12 @@ Scenario: Event field with custom type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::Events.CustomEventHandler EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::Events.CustomEventHandler EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -66,10 +70,12 @@ Scenario: Event field with Action type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.Action EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.Action EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -83,10 +89,12 @@ Scenario: Event field with Action type with keyworded generic parameter
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.Action<int> EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.Action<int> EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -100,10 +108,12 @@ Scenario: Event field with Action type with keyworded nullable generic parameter
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.Action<string?> EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.Action<string?> EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -117,10 +127,12 @@ Scenario: Event field with Action type with non-keyworded generic parameter
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.Action<global::System.DateTime> EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.Action<global::System.DateTime> EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -134,10 +146,12 @@ Scenario: Event field with Action type with non-keyworded nullable generic param
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.Action<global::System.DayOfWeek?> EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.Action<global::System.DayOfWeek?> EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -151,10 +165,12 @@ Scenario: Event field with Func
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.EventMember"/>
event global::System.Func<global::System.DayOfWeek?, double, int?> EventMember;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.Func<global::System.DayOfWeek?, double, int?> EventMember { add => Events.EventHolder.EventMember += value; remove => Events.EventHolder.EventMember -= value; }
"""

Expand All @@ -173,9 +189,11 @@ Scenario: Full event
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Events.EventHolder.FullEvent"/>
event global::System.EventHandler FullEvent;
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public event global::System.EventHandler FullEvent { add => Events.EventHolder.FullEvent += value; remove => Events.EventHolder.FullEvent -= value; }
"""
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@ Scenario: Field with keyworded type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.ConstField"/>
int ConstField { get; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public int ConstField { get => Fields.FieldHolder.ConstField; }
"""

Expand All @@ -47,9 +49,11 @@ Scenario: Field with non-keyworded type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.ConstField"/>
double ConstField { get; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public double ConstField { get => Fields.FieldHolder.ConstField; }
"""
8 changes: 8 additions & 0 deletions Tests/Tum4ik.StinimGen.Specs/Features/Field/Field.feature
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@ Scenario: Non-nullable field with keyworded type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticField"/>
object StaticField { get; set; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public object StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; }
"""

Expand All @@ -47,10 +49,12 @@ Scenario: Nullable field with keyworded type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticField"/>
object? StaticField { get; set; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public object? StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; }
"""

Expand All @@ -64,10 +68,12 @@ Scenario: Non-nullable field
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticField"/>
global::System.Delegate StaticField { get; set; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public global::System.Delegate StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; }
"""

Expand All @@ -81,9 +87,11 @@ Scenario: Nullable field
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticField"/>
global::System.Delegate? StaticField { get; set; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public global::System.Delegate? StaticField { get => Fields.FieldHolder.StaticField; set => Fields.FieldHolder.StaticField = value; }
"""
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@ Scenario: Non-nullable field with keyworded type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticReadonlyField"/>
float StaticReadonlyField { get; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public float StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; }
"""

Expand All @@ -47,10 +49,12 @@ Scenario: Nullable field with keyworded type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticReadonlyField"/>
float? StaticReadonlyField { get; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public float? StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; }
"""

Expand All @@ -64,10 +68,12 @@ Scenario: Non-nullable field
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticReadonlyField"/>
global::System.StringComparer StaticReadonlyField { get; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public global::System.StringComparer StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; }
"""

Expand All @@ -81,9 +87,11 @@ Scenario: Nullable field
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Fields.FieldHolder.StaticReadonlyField"/>
global::System.StringComparer? StaticReadonlyField { get; }
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public global::System.StringComparer? StaticReadonlyField { get => Fields.FieldHolder.StaticReadonlyField; }
"""
14 changes: 14 additions & 0 deletions Tests/Tum4ik.StinimGen.Specs/Features/Method/GenericMethod.feature
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@ Scenario: Void method with a generic parameter and without parameters
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.Method{T}()"/>
void Method<T>();
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public void Method<T>() => Methods.MethodHolder.Method<T>();
"""

Expand All @@ -50,10 +52,12 @@ Scenario: Void method with several generic parameters and without parameters
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.Method{T1, T2, T3}()"/>
void Method<T1, T2, T3>();
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public void Method<T1, T2, T3>() => Methods.MethodHolder.Method<T1, T2, T3>();
"""

Expand All @@ -67,10 +71,12 @@ Scenario: Method without parameters returns generic type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.Method{T}()"/>
T Method<T>();
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public T Method<T>() => Methods.MethodHolder.Method<T>();
"""

Expand All @@ -84,10 +90,12 @@ Scenario: Method with parameters returns generic type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.Method{T1, T2}(T1, T2)"/>
T1 Method<T1, T2>(T1 p1, T2 p2);
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public T1 Method<T1, T2>(T1 p1, T2 p2) => Methods.MethodHolder.Method<T1, T2>(p1, p2);
"""

Expand All @@ -101,10 +109,12 @@ Scenario: Async method without parameters returns Task of generic type
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.MethodAsync{T}()"/>
global::System.Threading.Tasks.Task<T> MethodAsync<T>();
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public global::System.Threading.Tasks.Task<T> MethodAsync<T>() => Methods.MethodHolder.MethodAsync<T>();
"""

Expand All @@ -118,11 +128,13 @@ Scenario: Generic method with a constraint
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.Method{T}()"/>
void Method<T>()
where T : class, new();
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public void Method<T>()
where T : class, new() => Methods.MethodHolder.Method<T>();
"""
Expand All @@ -140,11 +152,13 @@ Scenario: Generic method with several constraints
Then there must not be generation exception
And generated interface member must be
"""
/// <inheritdoc cref = "Methods.MethodHolder.Method{TParent, TChild}()"/>
void Method<TParent, TChild>()
where TParent : class where TChild : TParent, new();
"""
And generated implementation member must be
"""
/// <inheritdoc/>
public void Method<TParent, TChild>()
where TParent : class where TChild : TParent, new() => Methods.MethodHolder.Method<TParent, TChild>();
"""
Loading

0 comments on commit 5eca120

Please sign in to comment.