Skip to content

Commit 9492ef8

Browse files
committed
chore: add ManagedReference YAML roundtrip tests
1 parent 7b3dd78 commit 9492ef8

File tree

11 files changed

+494
-9
lines changed

11 files changed

+494
-9
lines changed

src/Docfx.Build.ManagedReference/BuildOutputs/ApiReferenceBuildOutput.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,21 @@ public class ApiReferenceBuildOutput
179179
[YamlIgnore]
180180
[Newtonsoft.Json.JsonExtensionData]
181181
[System.Text.Json.Serialization.JsonExtensionData]
182-
public CompositeDictionary MetadataJson =>
183-
CompositeDictionary
182+
[System.Text.Json.Serialization.JsonInclude]
183+
public CompositeDictionary MetadataJson
184+
{
185+
get
186+
{
187+
return CompositeDictionary
184188
.CreateBuilder()
185189
.Add(string.Empty, Metadata)
186190
.Create();
191+
}
192+
private init
193+
{
194+
// init or getter is required for deserialize data with System.Text.Json.
195+
}
196+
}
187197

188198
private bool _needExpand = true;
189199

src/Docfx.Common/Json/JsonUtility.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ private static bool IsSupported()
9191
{
9292
// TODO: Return `true` for types that support serialize/deserializenon with System.Text.Json.
9393
case "Docfx.Build.Engine.XRefMap":
94-
case "Docfx.DataContracts.ManagedReference.PageViewModel":
9594
return true;
9695

96+
case "Docfx.DataContracts.ManagedReference.PageViewModel":
97+
return true; // TODO: Need to support ExtensionData
98+
9799
// Intermediate types for tests. it's expected to be removed later (And return true by default).
98100
case "Docfx.Plugins.MarkdownServiceProperties":
99101
return true;

src/Docfx.DataContracts.Common/JTokenConverter.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Reflection;
5+
using Docfx.Common;
46
using Newtonsoft.Json.Linq;
57

68
namespace Docfx.DataContracts.Common;
@@ -18,6 +20,24 @@ public static T Convert<T>(object obj)
1820
{
1921
return jToken.ToObject<T>();
2022
}
23+
24+
// Custom code path for `System.Text.Json` deserialization.
25+
// `ObjectToInferredTypesConverter` deserialize items as `List<object>`.
26+
// So it need to convert `List<object>` to `List<TItem>`.
27+
if (obj is List<object> list && IsListType<T>())
28+
{
29+
var json = JsonUtility.Serialize(list);
30+
var result = JsonUtility.Deserialize<T>(new StringReader(json));
31+
return result;
32+
}
33+
2134
throw new InvalidCastException();
2235
}
36+
37+
private static bool IsListType<T>()
38+
{
39+
var type = typeof(T);
40+
return type.GetTypeInfo().IsGenericType
41+
&& type.GetGenericTypeDefinition() == typeof(List<>);
42+
}
2343
}

src/Docfx.DataContracts.Common/ReferenceViewModel.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,27 @@ public class ReferenceViewModel
8686
[YamlIgnore]
8787
[Newtonsoft.Json.JsonExtensionData]
8888
[System.Text.Json.Serialization.JsonExtensionData]
89+
[System.Text.Json.Serialization.JsonInclude]
8990
[UniqueIdentityReferenceIgnore]
9091
[MarkdownContentIgnore]
91-
public CompositeDictionary AdditionalJson =>
92-
CompositeDictionary
92+
public CompositeDictionary AdditionalJson
93+
{
94+
get
95+
{
96+
return CompositeDictionary
9397
.CreateBuilder()
9498
.Add(Constants.ExtensionMemberPrefix.Name, NameInDevLangs, JTokenConverter.Convert<string>)
9599
.Add(Constants.ExtensionMemberPrefix.NameWithType, NameWithTypeInDevLangs, JTokenConverter.Convert<string>)
96100
.Add(Constants.ExtensionMemberPrefix.FullName, FullNameInDevLangs, JTokenConverter.Convert<string>)
97101
.Add(Constants.ExtensionMemberPrefix.Spec, Specs, JTokenConverter.Convert<List<SpecViewModel>>)
98102
.Add(string.Empty, Additional)
99103
.Create();
104+
}
105+
private init
106+
{
107+
// init or getter is required for deserialize data with System.Text.Json.
108+
}
109+
}
100110

101111
public ReferenceViewModel Clone()
102112
{

src/Docfx.Dotnet/ManagedReference/Models/ItemViewModel.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,14 +378,24 @@ public string FullNameForVB
378378
[YamlIgnore]
379379
[Newtonsoft.Json.JsonExtensionData]
380380
[System.Text.Json.Serialization.JsonExtensionData]
381+
[System.Text.Json.Serialization.JsonInclude]
381382
[UniqueIdentityReferenceIgnore]
382383
[MarkdownContentIgnore]
383-
public IDictionary<string, object> ExtensionData =>
384-
CompositeDictionary
384+
public IDictionary<string, object> ExtensionData
385+
{
386+
get
387+
{
388+
return CompositeDictionary
385389
.CreateBuilder()
386390
.Add(Constants.ExtensionMemberPrefix.Name, Names, JTokenConverter.Convert<string>)
387391
.Add(Constants.ExtensionMemberPrefix.NameWithType, NamesWithType, JTokenConverter.Convert<string>)
388392
.Add(Constants.ExtensionMemberPrefix.FullName, FullNames, JTokenConverter.Convert<string>)
389393
.Add(string.Empty, Metadata)
390394
.Create();
395+
}
396+
private init
397+
{
398+
// init or getter is required for deserialize data with System.Text.Json.
399+
}
400+
}
391401
}

src/Docfx.Dotnet/ManagedReference/Models/SyntaxDetailViewModel.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,21 @@ public string ContentForVB
8989
[YamlIgnore]
9090
[Newtonsoft.Json.JsonExtensionData]
9191
[System.Text.Json.Serialization.JsonExtensionData]
92+
[System.Text.Json.Serialization.JsonInclude]
9293
[UniqueIdentityReferenceIgnore]
9394
[MarkdownContentIgnore]
94-
public IDictionary<string, object> ExtensionData =>
95-
CompositeDictionary
95+
public IDictionary<string, object> ExtensionData
96+
{
97+
get
98+
{
99+
return CompositeDictionary
96100
.CreateBuilder()
97101
.Add(Constants.ExtensionMemberPrefix.Content, Contents, JTokenConverter.Convert<string>)
98102
.Create();
103+
}
104+
private init
105+
{
106+
// init or getter is required for deserialize data with System.Text.Json.
107+
}
108+
}
99109
}

test/docfx.Tests/Api.verified.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,7 @@ public ApiReferenceBuildOutput() { }
11631163
public System.Collections.Generic.Dictionary<string, object> Metadata { get; set; }
11641164
[Newtonsoft.Json.JsonExtensionData]
11651165
[System.Text.Json.Serialization.JsonExtensionData]
1166+
[System.Text.Json.Serialization.JsonInclude]
11661167
[YamlDotNet.Serialization.YamlIgnore]
11671168
public Docfx.Common.CompositeDictionary MetadataJson { get; }
11681169
[Newtonsoft.Json.JsonProperty("name")]
@@ -2503,6 +2504,7 @@ public ReferenceViewModel() { }
25032504
[Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore]
25042505
[Newtonsoft.Json.JsonExtensionData]
25052506
[System.Text.Json.Serialization.JsonExtensionData]
2507+
[System.Text.Json.Serialization.JsonInclude]
25062508
[YamlDotNet.Serialization.YamlIgnore]
25072509
public Docfx.Common.CompositeDictionary AdditionalJson { get; }
25082510
[Newtonsoft.Json.JsonProperty("commentId")]
@@ -2877,6 +2879,7 @@ public ItemViewModel() { }
28772879
[Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore]
28782880
[Newtonsoft.Json.JsonExtensionData]
28792881
[System.Text.Json.Serialization.JsonExtensionData]
2882+
[System.Text.Json.Serialization.JsonInclude]
28802883
[YamlDotNet.Serialization.YamlIgnore]
28812884
public System.Collections.Generic.IDictionary<string, object> ExtensionData { get; }
28822885
[Docfx.Common.EntityMergers.MergeOption(Docfx.Common.EntityMergers.MergeOption.Ignore)]
@@ -3152,6 +3155,7 @@ public SyntaxDetailViewModel() { }
31523155
[Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore]
31533156
[Newtonsoft.Json.JsonExtensionData]
31543157
[System.Text.Json.Serialization.JsonExtensionData]
3158+
[System.Text.Json.Serialization.JsonInclude]
31553159
[YamlDotNet.Serialization.YamlIgnore]
31563160
public System.Collections.Generic.IDictionary<string, object> ExtensionData { get; }
31573161
[Newtonsoft.Json.JsonProperty("parameters")]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
### YamlMime:ManagedReference
2+
items:
3+
- uid: BuildFromAssembly
4+
commentId: N:BuildFromAssembly
5+
id: BuildFromAssembly
6+
children:
7+
- BuildFromAssembly.Class1
8+
- BuildFromAssembly.Issue5432
9+
langs:
10+
- csharp
11+
- vb
12+
name: BuildFromAssembly
13+
nameWithType: BuildFromAssembly
14+
fullName: BuildFromAssembly
15+
type: Namespace
16+
assemblies:
17+
- BuildFromAssembly
18+
references:
19+
- uid: BuildFromAssembly.Class1
20+
commentId: T:BuildFromAssembly.Class1
21+
isExternal: true
22+
href: BuildFromAssembly.Class1.html
23+
name: Class1
24+
nameWithType: Class1
25+
fullName: BuildFromAssembly.Class1
26+
- uid: BuildFromAssembly.Issue5432
27+
commentId: T:BuildFromAssembly.Issue5432
28+
isExternal: true
29+
href: BuildFromAssembly.Issue5432.html
30+
name: Issue5432
31+
nameWithType: Issue5432
32+
fullName: BuildFromAssembly.Issue5432

0 commit comments

Comments
 (0)