Skip to content

Commit

Permalink
chore: add ManagedReference YAML roundtrip tests
Browse files Browse the repository at this point in the history
  • Loading branch information
filzrev committed Sep 28, 2024
1 parent aece12e commit f636b8d
Show file tree
Hide file tree
Showing 10 changed files with 481 additions and 7 deletions.
4 changes: 3 additions & 1 deletion src/Docfx.Common/Json/JsonUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,11 @@ private static bool IsSupported()
{
// TODO: Return `true` for types that support serialize/deserializenon with System.Text.Json.
case "Docfx.Build.Engine.XRefMap":
case "Docfx.DataContracts.ManagedReference.PageViewModel":
return true;

case "Docfx.DataContracts.ManagedReference.PageViewModel":
return true; // TODO: Need to support ExtensionData

// Intermediate types for tests. it's expected to be removed later (And return true by default).
case "Docfx.Plugins.MarkdownServiceProperties":
return true;
Expand Down
20 changes: 20 additions & 0 deletions src/Docfx.DataContracts.Common/JTokenConverter.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Reflection;
using Docfx.Common;
using Newtonsoft.Json.Linq;

namespace Docfx.DataContracts.Common;
Expand All @@ -18,6 +20,24 @@ public static T Convert<T>(object obj)
{
return jToken.ToObject<T>();
}

// Custom code path for `System.Text.Json` deserialization.
// `ObjectToInferredTypesConverter` deserialize items as `List<object>`.
// So it need to convert `List<object>` to `List<TItem>`.
if (obj is List<object> list && IsListType<T>())
{
var json = JsonUtility.Serialize(list);
var result = JsonUtility.Deserialize<T>(new StringReader(json));
return result;
}

throw new InvalidCastException();
}

private static bool IsListType<T>()
{
var type = typeof(T);
return type.GetTypeInfo().IsGenericType
&& type.GetGenericTypeDefinition() == typeof(List<>);
}
}
14 changes: 12 additions & 2 deletions src/Docfx.DataContracts.Common/ReferenceViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,27 @@ public class ReferenceViewModel
[YamlIgnore]
[Newtonsoft.Json.JsonExtensionData]
[System.Text.Json.Serialization.JsonExtensionData]
[System.Text.Json.Serialization.JsonInclude]
[UniqueIdentityReferenceIgnore]
[MarkdownContentIgnore]
public CompositeDictionary AdditionalJson =>
CompositeDictionary
public CompositeDictionary AdditionalJson
{
get
{
return CompositeDictionary
.CreateBuilder()
.Add(Constants.ExtensionMemberPrefix.Name, NameInDevLangs, JTokenConverter.Convert<string>)
.Add(Constants.ExtensionMemberPrefix.NameWithType, NameWithTypeInDevLangs, JTokenConverter.Convert<string>)
.Add(Constants.ExtensionMemberPrefix.FullName, FullNameInDevLangs, JTokenConverter.Convert<string>)
.Add(Constants.ExtensionMemberPrefix.Spec, Specs, JTokenConverter.Convert<List<SpecViewModel>>)
.Add(string.Empty, Additional)
.Create();
}
private init
{
// init or getter is required for deserialize data with System.Text.Json.
}
}

public ReferenceViewModel Clone()
{
Expand Down
14 changes: 12 additions & 2 deletions src/Docfx.Dotnet/ManagedReference/Models/ItemViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -378,14 +378,24 @@ public string FullNameForVB
[YamlIgnore]
[Newtonsoft.Json.JsonExtensionData]
[System.Text.Json.Serialization.JsonExtensionData]
[System.Text.Json.Serialization.JsonInclude]
[UniqueIdentityReferenceIgnore]
[MarkdownContentIgnore]
public IDictionary<string, object> ExtensionData =>
CompositeDictionary
public IDictionary<string, object> ExtensionData
{
get
{
return CompositeDictionary
.CreateBuilder()
.Add(Constants.ExtensionMemberPrefix.Name, Names, JTokenConverter.Convert<string>)
.Add(Constants.ExtensionMemberPrefix.NameWithType, NamesWithType, JTokenConverter.Convert<string>)
.Add(Constants.ExtensionMemberPrefix.FullName, FullNames, JTokenConverter.Convert<string>)
.Add(string.Empty, Metadata)
.Create();
}
private init
{
// init or getter is required for deserialize data with System.Text.Json.
}
}
}
14 changes: 12 additions & 2 deletions src/Docfx.Dotnet/ManagedReference/Models/SyntaxDetailViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,21 @@ public string ContentForVB
[YamlIgnore]
[Newtonsoft.Json.JsonExtensionData]
[System.Text.Json.Serialization.JsonExtensionData]
[System.Text.Json.Serialization.JsonInclude]
[UniqueIdentityReferenceIgnore]
[MarkdownContentIgnore]
public IDictionary<string, object> ExtensionData =>
CompositeDictionary
public IDictionary<string, object> ExtensionData
{
get
{
return CompositeDictionary
.CreateBuilder()
.Add(Constants.ExtensionMemberPrefix.Content, Contents, JTokenConverter.Convert<string>)
.Create();
}
private init
{
// init or getter is required for deserialize data with System.Text.Json.
}
}
}
3 changes: 3 additions & 0 deletions test/docfx.Tests/Api.verified.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2503,6 +2503,7 @@ public ReferenceViewModel() { }
[Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore]
[Newtonsoft.Json.JsonExtensionData]
[System.Text.Json.Serialization.JsonExtensionData]
[System.Text.Json.Serialization.JsonInclude]
[YamlDotNet.Serialization.YamlIgnore]
public Docfx.Common.CompositeDictionary AdditionalJson { get; }
[Newtonsoft.Json.JsonProperty("commentId")]
Expand Down Expand Up @@ -2877,6 +2878,7 @@ public ItemViewModel() { }
[Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore]
[Newtonsoft.Json.JsonExtensionData]
[System.Text.Json.Serialization.JsonExtensionData]
[System.Text.Json.Serialization.JsonInclude]
[YamlDotNet.Serialization.YamlIgnore]
public System.Collections.Generic.IDictionary<string, object> ExtensionData { get; }
[Docfx.Common.EntityMergers.MergeOption(Docfx.Common.EntityMergers.MergeOption.Ignore)]
Expand Down Expand Up @@ -3152,6 +3154,7 @@ public SyntaxDetailViewModel() { }
[Docfx.DataContracts.Common.UniqueIdentityReferenceIgnore]
[Newtonsoft.Json.JsonExtensionData]
[System.Text.Json.Serialization.JsonExtensionData]
[System.Text.Json.Serialization.JsonInclude]
[YamlDotNet.Serialization.YamlIgnore]
public System.Collections.Generic.IDictionary<string, object> ExtensionData { get; }
[Newtonsoft.Json.JsonProperty("parameters")]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
### YamlMime:ManagedReference
items:
- uid: BuildFromAssembly
commentId: N:BuildFromAssembly
id: BuildFromAssembly
children:
- BuildFromAssembly.Class1
- BuildFromAssembly.Issue5432
langs:
- csharp
- vb
name: BuildFromAssembly
nameWithType: BuildFromAssembly
fullName: BuildFromAssembly
type: Namespace
assemblies:
- BuildFromAssembly
references:
- uid: BuildFromAssembly.Class1
commentId: T:BuildFromAssembly.Class1
isExternal: true
href: BuildFromAssembly.Class1.html
name: Class1
nameWithType: Class1
fullName: BuildFromAssembly.Class1
- uid: BuildFromAssembly.Issue5432
commentId: T:BuildFromAssembly.Issue5432
isExternal: true
href: BuildFromAssembly.Issue5432.html
name: Issue5432
nameWithType: Issue5432
fullName: BuildFromAssembly.Issue5432
Loading

0 comments on commit f636b8d

Please sign in to comment.