|
2 | 2 | using System.CodeDom; |
3 | 3 | using System.Collections.Generic; |
4 | 4 | using System.Collections.ObjectModel; |
| 5 | +using System.Diagnostics.CodeAnalysis; |
5 | 6 | using System.IO; |
6 | 7 | using System.Linq; |
7 | 8 | using System.Reflection; |
|
14 | 15 | using System.Xml.XPath; |
15 | 16 | using Ganss.IO; |
16 | 17 | using Microsoft.CodeAnalysis; |
| 18 | +using Microsoft.CodeAnalysis.CSharp.Syntax; |
17 | 19 | using Microsoft.Xml.XMLGen; |
18 | 20 | using Xunit; |
19 | 21 | using Xunit.Abstractions; |
@@ -105,6 +107,7 @@ private static IEnumerable<string> ConvertXml(string name, string xsd, Generator |
105 | 107 | const string DtsxPattern = "xsd/dtsx/dtsx2.xsd"; |
106 | 108 | const string WfsPattern = "xsd/wfs/schemas.opengis.net/wfs/2.0/wfs.xsd"; |
107 | 109 | const string EppPattern = "xsd/epp/*.xsd"; |
| 110 | + const string NullableReferenceAttributesPattern = "xsd/nullablereferenceattributes/nullablereference.xsd"; |
108 | 111 |
|
109 | 112 | // IATA test takes too long to perform every time |
110 | 113 |
|
@@ -2366,6 +2369,42 @@ void UnknownAttributeHandler(object sender, XmlAttributeEventArgs e) |
2366 | 2369 | */ |
2367 | 2370 | } |
2368 | 2371 |
|
| 2372 | + [Fact, TestPriority(1)] |
| 2373 | + [UseCulture("en-US")] |
| 2374 | + public void TestNullableReferenceAttributes() |
| 2375 | + { |
| 2376 | + var files = Glob.ExpandNames(NullableReferenceAttributesPattern).OrderByDescending(f => f); |
| 2377 | + var generator = new Generator |
| 2378 | + { |
| 2379 | + EnableNullableReferenceAttributes = true, |
| 2380 | + UseShouldSerializePattern = true, |
| 2381 | + NamespaceProvider = new NamespaceProvider |
| 2382 | + { |
| 2383 | + GenerateNamespace = key => "Test" |
| 2384 | + } |
| 2385 | + }; |
| 2386 | + var assembly = Compiler.Generate(nameof(TestNullableReferenceAttributes), NullableReferenceAttributesPattern, generator); |
| 2387 | + void assertNullable(string typename, bool nullable) |
| 2388 | + { |
| 2389 | + Type c = assembly.GetType(typename); |
| 2390 | + var property = c.GetProperty("Text"); |
| 2391 | + var setParameter = property.SetMethod.GetParameters(); |
| 2392 | + var getReturnParameter = property.GetMethod.ReturnParameter; |
| 2393 | + var allowNullableAttribute = setParameter.Single().CustomAttributes.SingleOrDefault(a => a.AttributeType == typeof(AllowNullAttribute)); |
| 2394 | + var maybeNullAttribute = getReturnParameter.CustomAttributes.SingleOrDefault(a => a.AttributeType == typeof(MaybeNullAttribute)); |
| 2395 | + var hasAllowNullAttribute = allowNullableAttribute != null; |
| 2396 | + var hasMaybeNullAttribute = maybeNullAttribute != null; |
| 2397 | + Assert.Equal(nullable, hasAllowNullAttribute); |
| 2398 | + Assert.Equal(nullable, hasMaybeNullAttribute); |
| 2399 | + } |
| 2400 | + assertNullable("Test.ElementReferenceNullable", true); |
| 2401 | + assertNullable("Test.ElementReferenceList", true); |
| 2402 | + assertNullable("Test.ElementReferenceNonNullable", false); |
| 2403 | + assertNullable("Test.AttributeReferenceNullable", true); |
| 2404 | + assertNullable("Test.AttributeReferenceNonNullable", false); |
| 2405 | + assertNullable("Test.AttributeValueNullableInt", false); |
| 2406 | + } |
| 2407 | + |
2369 | 2408 | [Fact, TestPriority(1)] |
2370 | 2409 | public void TestNetex() |
2371 | 2410 | { |
|
0 commit comments