Skip to content

Commit 9da7b05

Browse files
committed
WIP adding method support to SampleGen
1 parent f37635a commit 9da7b05

4 files changed

Lines changed: 392 additions & 356 deletions

File tree

Lines changed: 377 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,377 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using CommunityToolkit.Tooling.SampleGen.Diagnostics;
6+
using Microsoft.VisualStudio.TestTools.UnitTesting;
7+
8+
namespace CommunityToolkit.Tooling.SampleGen.Tests;
9+
10+
public partial class ToolkitSampleGeneratedPaneTests
11+
{
12+
[TestMethod]
13+
public void PaneOption_GeneratesWithoutDiagnostics()
14+
{
15+
var source = $@"
16+
using System.ComponentModel;
17+
using CommunityToolkit.Tooling.SampleGen;
18+
using CommunityToolkit.Tooling.SampleGen.Attributes;
19+
20+
namespace MyApp
21+
{{
22+
[ToolkitSampleBoolOption(""Test"", false, Title = ""Toggle y"")]
23+
[ToolkitSampleMultiChoiceOption(""TextFontFamily"", ""Segoe UI"", ""Arial"", ""Consolas"", Title = ""Font family"")]
24+
25+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
26+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
27+
{{
28+
public Sample()
29+
{{
30+
var x = this.Test;
31+
var y = this.TextFontFamily;
32+
}}
33+
}}
34+
}}
35+
36+
namespace Windows.UI.Xaml.Controls
37+
{{
38+
public class UserControl {{ }}
39+
}}";
40+
41+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleOptionGenerator>(source, string.Empty);
42+
}
43+
44+
[TestMethod]
45+
public void PaneOption_GeneratesTitleProperty()
46+
{
47+
var source = """
48+
using System.ComponentModel;
49+
using CommunityToolkit.Tooling.SampleGen;
50+
using CommunityToolkit.Tooling.SampleGen.Attributes;
51+
52+
namespace MyApp
53+
{
54+
[ToolkitSampleNumericOption("TextSize", 12, 8, 48, 2, false, Title = "FontSize")]
55+
[ToolkitSample(id: nameof(Sample), "Test Sample", description: "")]
56+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
57+
{
58+
public Sample()
59+
{
60+
var x = this.Test;
61+
var y = this.TextFontFamily;
62+
}
63+
}
64+
}
65+
66+
namespace Windows.UI.Xaml.Controls
67+
{
68+
public class UserControl { }
69+
}
70+
""";
71+
72+
var result = """
73+
#nullable enable
74+
namespace CommunityToolkit.Tooling.SampleGen;
75+
76+
public static class ToolkitSampleRegistry
77+
{
78+
public static System.Collections.Generic.Dictionary<string, CommunityToolkit.Tooling.SampleGen.Metadata.ToolkitSampleMetadata> Listing
79+
{ get; } = new() {
80+
["Sample"] = new CommunityToolkit.Tooling.SampleGen.Metadata.ToolkitSampleMetadata("Sample", "Test Sample", "", typeof(MyApp.Sample), () => new MyApp.Sample(), null, null, new CommunityToolkit.Tooling.SampleGen.Metadata.IGeneratedToolkitSampleOptionViewModel[] { new CommunityToolkit.Tooling.SampleGen.Metadata.ToolkitSampleNumericOptionMetadataViewModel(name: "TextSize", initial: 12, min: 8, max: 48, step: 2, showAsNumberBox: false, title: "FontSize") })
81+
};
82+
}
83+
""";
84+
85+
ToolkitSampleMetadataTests.VerifyGenerateSources("MyApp.Tests", source, new[] { new ToolkitSampleMetadataGenerator() }, ignoreDiagnostics: true, ("ToolkitSampleRegistry.g.cs", result));
86+
}
87+
88+
// https://github.com/CommunityToolkit/Labs-Windows/issues/175
89+
[TestMethod]
90+
public void PaneOption_GeneratesProperty_DuplicatePropNamesAcrossSampleClasses()
91+
{
92+
var source = $@"
93+
using System.ComponentModel;
94+
using CommunityToolkit.Tooling.SampleGen;
95+
using CommunityToolkit.Tooling.SampleGen.Attributes;
96+
97+
namespace MyApp
98+
{{
99+
[ToolkitSampleBoolOption(""Test"", false, Title = ""Toggle y"")]
100+
[ToolkitSampleMultiChoiceOption(""TextFontFamily"", ""Segoe UI"", ""Arial"", ""Consolas"", Title = ""Font family"")]
101+
102+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
103+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
104+
{{
105+
public Sample()
106+
{{
107+
var x = this.Test;
108+
var y = this.TextFontFamily;
109+
}}
110+
}}
111+
112+
[ToolkitSampleBoolOption(""Test"", false, Title = ""Toggle y"")]
113+
[ToolkitSampleMultiChoiceOption(""TextFontFamily"", ""Segoe UI"", ""Arial"", ""Consolas"", Title = ""Font family"")]
114+
115+
[ToolkitSample(id: nameof(Sample2), ""Test Sample"", description: """")]
116+
public partial class Sample2 : Windows.UI.Xaml.Controls.UserControl
117+
{{
118+
public Sample2()
119+
{{
120+
var x = this.Test;
121+
var y = this.TextFontFamily;
122+
}}
123+
}}
124+
}}
125+
126+
namespace Windows.UI.Xaml.Controls
127+
{{
128+
public class UserControl {{ }}
129+
}}";
130+
131+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleOptionGenerator>(source, string.Empty);
132+
}
133+
134+
[TestMethod]
135+
public void PaneOptionOnNonSample()
136+
{
137+
string source = @"
138+
using System.ComponentModel;
139+
using CommunityToolkit.Tooling.SampleGen.Attributes;
140+
141+
namespace MyApp
142+
{
143+
[ToolkitSampleBoolOption(""BindToMe"", false, Title = ""Toggle visibility"")]
144+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
145+
{
146+
}
147+
}
148+
149+
namespace Windows.UI.Xaml.Controls
150+
{
151+
public class UserControl { }
152+
}";
153+
154+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionAttributeOnNonSample.Id);
155+
}
156+
157+
[DataRow("", DisplayName = "Empty string"), DataRow(" ", DisplayName = "Only whitespace"), DataRow("Test ", DisplayName = "Text with whitespace")]
158+
[DataRow("_", DisplayName = "Underscore"), DataRow("$", DisplayName = "Dollar sign"), DataRow("%", DisplayName = "Percent symbol")]
159+
[DataRow("class", DisplayName = "Reserved keyword 'class'"), DataRow("string", DisplayName = "Reserved keyword 'string'"), DataRow("sealed", DisplayName = "Reserved keyword 'sealed'"), DataRow("ref", DisplayName = "Reserved keyword 'ref'")]
160+
[TestMethod]
161+
public void PaneOptionWithBadName(string name)
162+
{
163+
var source = $@"
164+
using System.ComponentModel;
165+
using CommunityToolkit.Tooling.SampleGen;
166+
using CommunityToolkit.Tooling.SampleGen.Attributes;
167+
168+
namespace MyApp
169+
{{
170+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
171+
[ToolkitSampleBoolOption(""{name}"", false, Title = ""Toggle visibility"")]
172+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
173+
{{
174+
}}
175+
}}
176+
177+
namespace Windows.UI.Xaml.Controls
178+
{{
179+
public class UserControl {{ }}
180+
}}";
181+
182+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithBadName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
183+
}
184+
185+
186+
[TestMethod]
187+
public void PaneOptionWithConflictingPropertyName()
188+
{
189+
var source = $@"
190+
using System.ComponentModel;
191+
using CommunityToolkit.Tooling.SampleGen;
192+
using CommunityToolkit.Tooling.SampleGen.Attributes;
193+
194+
namespace MyApp
195+
{{
196+
[ToolkitSampleBoolOption(""IsVisible"", false, Title = ""Toggle x"")]
197+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
198+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
199+
{{
200+
public string IsVisible {{ get; set; }}
201+
}}
202+
}}
203+
204+
namespace Windows.UI.Xaml.Controls
205+
{{
206+
public class UserControl {{ }}
207+
}}";
208+
209+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithConflictingName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
210+
}
211+
212+
[TestMethod]
213+
public void PaneOptionWithConflictingInheritedPropertyName()
214+
{
215+
var source = $@"
216+
using System.ComponentModel;
217+
using CommunityToolkit.Tooling.SampleGen;
218+
using CommunityToolkit.Tooling.SampleGen.Attributes;
219+
220+
namespace MyApp
221+
{{
222+
[ToolkitSampleBoolOption(""IsVisible"", false, Title = ""Toggle x"")]
223+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
224+
public partial class Sample : Base
225+
{{
226+
}}
227+
228+
public class Base : Windows.UI.Xaml.Controls.UserControl
229+
{{
230+
public string IsVisible {{ get; set; }}
231+
}}
232+
}}
233+
234+
namespace Windows.UI.Xaml.Controls
235+
{{
236+
public class UserControl {{ }}
237+
}}";
238+
239+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithConflictingName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
240+
}
241+
242+
[TestMethod]
243+
public void PaneOptionWithDuplicateName()
244+
{
245+
var source = $@"
246+
using System.ComponentModel;
247+
using CommunityToolkit.Tooling.SampleGen;
248+
using CommunityToolkit.Tooling.SampleGen.Attributes;
249+
250+
namespace MyApp
251+
{{
252+
[ToolkitSampleBoolOption(""test"", false, Title = ""Toggle x"")]
253+
[ToolkitSampleBoolOption(""test"", false, Title = ""Toggle y"")]
254+
[ToolkitSampleMultiChoiceOption(""TextFontFamily"", ""Segoe UI"", ""Arial"", Title = ""Text foreground"")]
255+
256+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
257+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
258+
{{
259+
}}
260+
}}
261+
262+
namespace Windows.UI.Xaml.Controls
263+
{{
264+
public class UserControl {{ }}
265+
}}";
266+
267+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneOptionWithDuplicateName.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
268+
}
269+
270+
[TestMethod]
271+
public void PaneOptionWithDuplicateName_AllowedBetweenSamples()
272+
{
273+
var source = $@"
274+
using System.ComponentModel;
275+
using CommunityToolkit.Tooling.SampleGen;
276+
using CommunityToolkit.Tooling.SampleGen.Attributes;
277+
278+
namespace MyApp
279+
{{
280+
[ToolkitSampleBoolOption(""test"", false, Title = ""Toggle y"")]
281+
282+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
283+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
284+
{{
285+
}}
286+
287+
[ToolkitSampleBoolOption(""test"", false, Title = ""Toggle y"")]
288+
289+
[ToolkitSample(id: nameof(Sample2), ""Test Sample"", description: """")]
290+
public partial class Sample2 : Windows.UI.Xaml.Controls.UserControl
291+
{{
292+
}}
293+
}}
294+
295+
namespace Windows.UI.Xaml.Controls
296+
{{
297+
public class UserControl {{ }}
298+
}}";
299+
300+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
301+
}
302+
303+
[TestMethod]
304+
public void SampleGeneratedOptionAttributeOnUnsupportedType()
305+
{
306+
var source = $@"
307+
using System.ComponentModel;
308+
using CommunityToolkit.Tooling.SampleGen;
309+
using CommunityToolkit.Tooling.SampleGen.Attributes;
310+
311+
namespace MyApp
312+
{{
313+
[ToolkitSampleMultiChoiceOption(""TextFontFamily"", ""Segoe UI"", ""Arial"", ""Consolas"", Title = ""Font family"")]
314+
[ToolkitSampleBoolOption(""Test"", false, Title = ""Toggle visibility"")]
315+
public partial class Sample
316+
{{
317+
}}
318+
}}";
319+
320+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleGeneratedOptionAttributeOnUnsupportedType.Id, DiagnosticDescriptors.SamplePaneOptionAttributeOnNonSample.Id);
321+
}
322+
323+
[TestMethod]
324+
public void PaneMultipleChoiceOptionWithNoChoices()
325+
{
326+
var source = $@"
327+
using System.ComponentModel;
328+
using CommunityToolkit.Tooling.SampleGen;
329+
using CommunityToolkit.Tooling.SampleGen.Attributes;
330+
331+
namespace MyApp
332+
{{
333+
[ToolkitSampleMultiChoiceOption(""TextFontFamily"", Title = ""Font family"")]
334+
335+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
336+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
337+
{{
338+
}}
339+
}}
340+
341+
namespace Windows.UI.Xaml.Controls
342+
{{
343+
public class UserControl {{ }}
344+
}}";
345+
346+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SamplePaneMultiChoiceOptionWithNoChoices.Id, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
347+
}
348+
349+
[TestMethod]
350+
public void GeneratedPaneOption_ButtonAction()
351+
{
352+
var source = $@"
353+
using System.ComponentModel;
354+
using CommunityToolkit.Tooling.SampleGen;
355+
using CommunityToolkit.Tooling.SampleGen.Attributes;
356+
357+
namespace MyApp
358+
{{
359+
[ToolkitSample(id: nameof(Sample), ""Test Sample"", description: """")]
360+
public partial class Sample : Windows.UI.Xaml.Controls.UserControl
361+
{{
362+
}}
363+
364+
[ToolkitSampleButtonAction(label: ""Raise notification"")]
365+
private void RaiseNotification()
366+
{{
367+
}}
368+
}}
369+
370+
namespace Windows.UI.Xaml.Controls
371+
{{
372+
public class UserControl {{ }}
373+
}}";
374+
375+
ToolkitSampleMetadataTests.VerifyGeneratedDiagnostics<ToolkitSampleMetadataGenerator>(source, string.Empty, DiagnosticDescriptors.SampleNotReferencedInMarkdown.Id);
376+
}
377+
}

0 commit comments

Comments
 (0)