diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.ModelsBuilder.Embedded/BuilderTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.ModelsBuilder.Embedded/BuilderTests.cs
index 4dea81facbce..73f38da362b1 100644
--- a/src/Umbraco.Tests.UnitTests/Umbraco.ModelsBuilder.Embedded/BuilderTests.cs
+++ b/src/Umbraco.Tests.UnitTests/Umbraco.ModelsBuilder.Embedded/BuilderTests.cs
@@ -26,6 +26,7 @@ public void GenerateSimpleType()
Id = 1,
Alias = "type1",
ClrName = "Type1",
+ Name = "type1Name",
ParentId = 0,
BaseType = null,
ItemType = TypeModel.ItemTypes.Content,
@@ -34,6 +35,7 @@ public void GenerateSimpleType()
{
Alias = "prop1",
ClrName = "Prop1",
+ Name = "prop1Name",
ModelClrType = typeof(string),
});
@@ -67,6 +69,7 @@ public void GenerateSimpleType()
namespace Umbraco.Cms.Web.Common.PublishedModels
{
+ /// type1Name
[PublishedModel(""type1"")]
public partial class Type1 : PublishedContentModel
{
@@ -97,6 +100,9 @@ public Type1(IPublishedContent content, IPublishedValueFallback publishedValueFa
// properties
+ ///
+ /// prop1Name
+ ///
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
[global::System.Diagnostics.CodeAnalysis.MaybeNull]
[ImplementPropertyType(""prop1"")]
@@ -271,6 +277,388 @@ public void GenerateAmbiguous()
Assert.IsTrue(gen.Contains(" global::Umbraco.Cms.Core.Exceptions.BootFailedException Prop3"));
}
+ [Test]
+ public void GenerateInheritedType()
+ {
+ var parentType = new TypeModel
+ {
+ Id = 1,
+ Alias = "parentType",
+ ClrName = "ParentType",
+ Name = "parentTypeName",
+ ParentId = 0,
+ IsParent = true,
+ BaseType = null,
+ ItemType = TypeModel.ItemTypes.Content,
+ };
+ parentType.Properties.Add(new PropertyModel
+ {
+ Alias = "prop1",
+ ClrName = "Prop1",
+ Name = "prop1Name",
+ ModelClrType = typeof(string),
+ });
+
+ var childType = new TypeModel
+ {
+ Id = 2,
+ Alias = "childType",
+ ClrName = "ChildType",
+ Name = "childTypeName",
+ ParentId = 1,
+ BaseType = parentType,
+ ItemType = TypeModel.ItemTypes.Content,
+ };
+
+ TypeModel[] docTypes = new[] { parentType, childType };
+
+ var modelsBuilderConfig = new ModelsBuilderSettings();
+ var builder = new TextBuilder(modelsBuilderConfig, docTypes);
+
+ var sb = new StringBuilder();
+ builder.Generate(sb, builder.GetModelsToGenerate().First());
+ var genParent = sb.ToString();
+
+ SemVersion version = ApiVersion.Current.Version;
+
+ var expectedParent = @"//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Umbraco.ModelsBuilder.Embedded v" + version + @"
+//
+// Changes to this file will be lost if the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Linq.Expressions;
+using Umbraco.Cms.Core.Models.PublishedContent;
+using Umbraco.Cms.Core.PublishedCache;
+using Umbraco.Cms.Infrastructure.ModelsBuilder;
+using Umbraco.Cms.Core;
+using Umbraco.Extensions;
+
+namespace Umbraco.Cms.Web.Common.PublishedModels
+{
+ /// parentTypeName
+ [PublishedModel(""parentType"")]
+ public partial class ParentType : PublishedContentModel
+ {
+ // helpers
+#pragma warning disable 0109 // new is redundant
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const string ModelTypeAlias = ""parentType"";
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const PublishedItemType ModelItemType = PublishedItemType.Content;
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor)
+ => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias);
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector)
+ => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector);
+#pragma warning restore 0109
+
+ private IPublishedValueFallback _publishedValueFallback;
+
+ // ctor
+ public ParentType(IPublishedContent content, IPublishedValueFallback publishedValueFallback)
+ : base(content, publishedValueFallback)
+ {
+ _publishedValueFallback = publishedValueFallback;
+ }
+
+ // properties
+
+ ///
+ /// prop1Name
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ [ImplementPropertyType(""prop1"")]
+ public virtual string Prop1 => this.Value(_publishedValueFallback, ""prop1"");
+ }
+}
+";
+ Console.WriteLine(genParent);
+ Assert.AreEqual(expectedParent.ClearLf(), genParent);
+
+ var sb2 = new StringBuilder();
+ builder.Generate(sb2, builder.GetModelsToGenerate().Skip(1).First());
+ var genChild = sb2.ToString();
+
+ var expectedChild = @"//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Umbraco.ModelsBuilder.Embedded v" + version + @"
+//
+// Changes to this file will be lost if the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Linq.Expressions;
+using Umbraco.Cms.Core.Models.PublishedContent;
+using Umbraco.Cms.Core.PublishedCache;
+using Umbraco.Cms.Infrastructure.ModelsBuilder;
+using Umbraco.Cms.Core;
+using Umbraco.Extensions;
+
+namespace Umbraco.Cms.Web.Common.PublishedModels
+{
+ /// childTypeName
+ [PublishedModel(""childType"")]
+ public partial class ChildType : ParentType
+ {
+ // helpers
+#pragma warning disable 0109 // new is redundant
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const string ModelTypeAlias = ""childType"";
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const PublishedItemType ModelItemType = PublishedItemType.Content;
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor)
+ => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias);
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector)
+ => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector);
+#pragma warning restore 0109
+
+ private IPublishedValueFallback _publishedValueFallback;
+
+ // ctor
+ public ChildType(IPublishedContent content, IPublishedValueFallback publishedValueFallback)
+ : base(content, publishedValueFallback)
+ {
+ _publishedValueFallback = publishedValueFallback;
+ }
+
+ // properties
+ }
+}
+";
+
+ Console.WriteLine(genChild);
+ Assert.AreEqual(expectedChild.ClearLf(), genChild);
+
+ }
+
+ [Test]
+ public void GenerateComposedType()
+ {
+ // Umbraco returns nice, pascal-cased names.
+ var composition1 = new TypeModel
+ {
+ Id = 2,
+ Alias = "composition1",
+ ClrName = "Composition1",
+ Name = "composition1Name",
+ ParentId = 0,
+ BaseType = null,
+ ItemType = TypeModel.ItemTypes.Content,
+ IsMixin = true,
+ };
+ composition1.Properties.Add(new PropertyModel
+ {
+ Alias = "compositionProp",
+ ClrName = "CompositionProp",
+ Name = "compositionPropName",
+ ModelClrType = typeof(string),
+ ClrTypeName = typeof(string).FullName
+ });
+
+ var type1 = new TypeModel
+ {
+ Id = 1,
+ Alias = "type1",
+ ClrName = "Type1",
+ Name = "type1Name",
+ ParentId = 0,
+ BaseType = null,
+ ItemType = TypeModel.ItemTypes.Content,
+ };
+ type1.Properties.Add(new PropertyModel
+ {
+ Alias = "prop1",
+ ClrName = "Prop1",
+ Name = "prop1Name",
+ ModelClrType = typeof(string),
+ });
+ type1.MixinTypes.Add(composition1);
+
+ TypeModel[] types = new[] { type1, composition1 };
+
+ var modelsBuilderConfig = new ModelsBuilderSettings();
+ var builder = new TextBuilder(modelsBuilderConfig, types);
+
+ SemVersion version = ApiVersion.Current.Version;
+
+ var sb = new StringBuilder();
+ builder.Generate(sb, builder.GetModelsToGenerate().First());
+ var genComposed = sb.ToString();
+
+ var expectedComposed = @"//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Umbraco.ModelsBuilder.Embedded v" + version + @"
+//
+// Changes to this file will be lost if the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Linq.Expressions;
+using Umbraco.Cms.Core.Models.PublishedContent;
+using Umbraco.Cms.Core.PublishedCache;
+using Umbraco.Cms.Infrastructure.ModelsBuilder;
+using Umbraco.Cms.Core;
+using Umbraco.Extensions;
+
+namespace Umbraco.Cms.Web.Common.PublishedModels
+{
+ /// type1Name
+ [PublishedModel(""type1"")]
+ public partial class Type1 : PublishedContentModel, IComposition1
+ {
+ // helpers
+#pragma warning disable 0109 // new is redundant
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const string ModelTypeAlias = ""type1"";
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const PublishedItemType ModelItemType = PublishedItemType.Content;
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor)
+ => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias);
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector)
+ => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector);
+#pragma warning restore 0109
+
+ private IPublishedValueFallback _publishedValueFallback;
+
+ // ctor
+ public Type1(IPublishedContent content, IPublishedValueFallback publishedValueFallback)
+ : base(content, publishedValueFallback)
+ {
+ _publishedValueFallback = publishedValueFallback;
+ }
+
+ // properties
+
+ ///
+ /// prop1Name
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ [ImplementPropertyType(""prop1"")]
+ public virtual string Prop1 => this.Value(_publishedValueFallback, ""prop1"");
+
+ ///
+ /// compositionPropName
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ [ImplementPropertyType(""compositionProp"")]
+ public virtual string CompositionProp => global::Umbraco.Cms.Web.Common.PublishedModels.Composition1.GetCompositionProp(this, _publishedValueFallback);
+ }
+}
+";
+ Console.WriteLine(genComposed);
+ Assert.AreEqual(expectedComposed.ClearLf(), genComposed);
+
+ var sb2 = new StringBuilder();
+ builder.Generate(sb2, builder.GetModelsToGenerate().Skip(1).First());
+ var genComposition = sb2.ToString();
+
+ var expectedComposition = @"//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Umbraco.ModelsBuilder.Embedded v" + version + @"
+//
+// Changes to this file will be lost if the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+using System;
+using System.Linq.Expressions;
+using Umbraco.Cms.Core.Models.PublishedContent;
+using Umbraco.Cms.Core.PublishedCache;
+using Umbraco.Cms.Infrastructure.ModelsBuilder;
+using Umbraco.Cms.Core;
+using Umbraco.Extensions;
+
+namespace Umbraco.Cms.Web.Common.PublishedModels
+{
+ // Mixin Content Type with alias ""composition1""
+ /// composition1Name
+ public partial interface IComposition1 : IPublishedContent
+ {
+ /// compositionPropName
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ string CompositionProp { get; }
+ }
+
+ /// composition1Name
+ [PublishedModel(""composition1"")]
+ public partial class Composition1 : PublishedContentModel, IComposition1
+ {
+ // helpers
+#pragma warning disable 0109 // new is redundant
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const string ModelTypeAlias = ""composition1"";
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ public new const PublishedItemType ModelItemType = PublishedItemType.Content;
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public new static IPublishedContentType GetModelContentType(IPublishedSnapshotAccessor publishedSnapshotAccessor)
+ => PublishedModelUtility.GetModelContentType(publishedSnapshotAccessor, ModelItemType, ModelTypeAlias);
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public static IPublishedPropertyType GetModelPropertyType(IPublishedSnapshotAccessor publishedSnapshotAccessor, Expression> selector)
+ => PublishedModelUtility.GetModelPropertyType(GetModelContentType(publishedSnapshotAccessor), selector);
+#pragma warning restore 0109
+
+ private IPublishedValueFallback _publishedValueFallback;
+
+ // ctor
+ public Composition1(IPublishedContent content, IPublishedValueFallback publishedValueFallback)
+ : base(content, publishedValueFallback)
+ {
+ _publishedValueFallback = publishedValueFallback;
+ }
+
+ // properties
+
+ ///
+ /// compositionPropName
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ [ImplementPropertyType(""compositionProp"")]
+ public virtual string CompositionProp => GetCompositionProp(this, _publishedValueFallback);
+
+ /// Static getter for compositionPropName
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
+ [return: global::System.Diagnostics.CodeAnalysis.MaybeNull]
+ public static string GetCompositionProp(IComposition1 that, IPublishedValueFallback publishedValueFallback) => that.Value(publishedValueFallback, ""compositionProp"");
+ }
+}
+";
+
+ Console.WriteLine(genComposition);
+ Assert.AreEqual(expectedComposition.ClearLf(), genComposition);
+ }
+
[TestCase("int", typeof(int))]
[TestCase("global::System.Collections.Generic.IEnumerable", typeof(IEnumerable))]
[TestCase("global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.BuilderTestsClass1", typeof(BuilderTestsClass1))]