2020-12-20 08:36:11 +01:00
// Copyright (c) Umbraco.
// See LICENSE for more details.
using System ;
2019-10-28 18:02:52 +11:00
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using NUnit.Framework ;
2021-02-18 11:06:02 +01:00
using Umbraco.Cms.Core.Configuration.Models ;
using Umbraco.Cms.Core.Models.PublishedContent ;
using Umbraco.Cms.Core.Semver ;
2021-02-22 09:00:33 +01:00
using Umbraco.Cms.Infrastructure.ModelsBuilder ;
using Umbraco.Cms.Infrastructure.ModelsBuilder.Building ;
2019-10-28 18:02:52 +11:00
2021-02-18 11:06:02 +01:00
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded
2019-10-28 18:02:52 +11:00
{
[TestFixture]
public class BuilderTests
{
[Test]
public void GenerateSimpleType ( )
{
2020-12-20 08:36:11 +01:00
// Umbraco returns nice, pascal-cased names.
2019-10-28 18:02:52 +11:00
var type1 = new TypeModel
{
Id = 1 ,
Alias = "type1" ,
ClrName = "Type1" ,
ParentId = 0 ,
BaseType = null ,
ItemType = TypeModel . ItemTypes . Content ,
} ;
type1 . Properties . Add ( new PropertyModel
{
Alias = "prop1" ,
ClrName = "Prop1" ,
ModelClrType = typeof ( string ) ,
} ) ;
2020-12-20 08:36:11 +01:00
TypeModel [ ] types = new [ ] { type1 } ;
2019-10-28 18:02:52 +11:00
2020-09-21 21:06:24 +02:00
var modelsBuilderConfig = new ModelsBuilderSettings ( ) ;
2020-08-24 16:06:09 +02:00
var builder = new TextBuilder ( modelsBuilderConfig , types ) ;
2019-10-28 18:02:52 +11:00
var sb = new StringBuilder ( ) ;
builder . Generate ( sb , builder . GetModelsToGenerate ( ) . First ( ) ) ;
var gen = sb . ToString ( ) ;
2020-12-20 08:36:11 +01:00
SemVersion version = ApiVersion . Current . Version ;
2019-10-28 18:02:52 +11:00
var expected = @ "//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
2020-03-07 21:33:35 +00:00
// Umbraco.ModelsBuilder.Embedded v" + version + @"
2019-10-28 18:02:52 +11:00
//
// Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System ;
using System.Linq.Expressions ;
2021-02-18 11:06:02 +01:00
using Umbraco.Cms.Core.Models.PublishedContent ;
2020-08-03 14:16:58 +02:00
using Umbraco.Web.PublishedCache ;
2021-02-18 11:06:02 +01:00
using Umbraco.Cms.Core.PublishedCache ;
using Umbraco.Cms.ModelsBuilder.Embedded ;
using Umbraco.Cms.Core ;
2020-09-08 15:17:57 +02:00
using Umbraco.Core ;
2021-02-18 11:06:02 +01:00
using Umbraco.Extensions ;
2019-10-28 18:02:52 +11:00
2021-02-18 11:06:02 +01:00
namespace Umbraco.Cms.Web.Common.PublishedModels
2019-10-28 18:02:52 +11:00
{
[PublishedModel(""type1"")]
public partial class Type1 : PublishedContentModel
{
// helpers
#pragma warning disable 0109 // new is redundant
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2019-10-28 18:02:52 +11:00
public new const string ModelTypeAlias = "" type1 "" ;
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2019-10-28 18:02:52 +11:00
public new const PublishedItemType ModelItemType = PublishedItemType . Content ;
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2020-08-03 14:16:58 +02:00
public new static IPublishedContentType GetModelContentType ( IPublishedSnapshotAccessor publishedSnapshotAccessor )
= > PublishedModelUtility . GetModelContentType ( publishedSnapshotAccessor , ModelItemType , ModelTypeAlias ) ;
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2020-08-03 14:16:58 +02:00
public static IPublishedPropertyType GetModelPropertyType < TValue > ( IPublishedSnapshotAccessor publishedSnapshotAccessor , Expression < Func < Type1 , TValue > > selector )
= > PublishedModelUtility . GetModelPropertyType ( GetModelContentType ( publishedSnapshotAccessor ) , selector ) ;
2019-10-28 18:02:52 +11:00
#pragma warning restore 0109
2020-09-08 15:17:57 +02:00
private IPublishedValueFallback _publishedValueFallback ;
2019-10-28 18:02:52 +11:00
// ctor
2020-09-08 15:17:57 +02:00
public Type1 ( IPublishedContent content , IPublishedValueFallback publishedValueFallback )
2019-10-28 18:02:52 +11:00
: base ( content )
2020-09-08 15:17:57 +02:00
{
2021-02-18 11:06:02 +01:00
_publishedValueFallback = publishedValueFallback ;
2020-09-08 15:17:57 +02:00
}
2019-10-28 18:02:52 +11:00
// properties
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2019-10-28 18:02:52 +11:00
[ImplementPropertyType(""prop1"")]
2020-09-08 15:17:57 +02:00
public string Prop1 = > this . Value < string > ( _publishedValueFallback , "" prop1 "" ) ;
2019-10-28 18:02:52 +11:00
}
}
";
Console . WriteLine ( gen ) ;
Assert . AreEqual ( expected . ClearLf ( ) , gen ) ;
}
[Test]
public void GenerateSimpleType_Ambiguous_Issue ( )
{
2020-12-20 08:36:11 +01:00
// Umbraco returns nice, pascal-cased names.
2019-10-28 18:02:52 +11:00
var type1 = new TypeModel
{
Id = 1 ,
Alias = "type1" ,
ClrName = "Type1" ,
ParentId = 0 ,
BaseType = null ,
ItemType = TypeModel . ItemTypes . Content ,
} ;
type1 . Properties . Add ( new PropertyModel
{
Alias = "foo" ,
ClrName = "Foo" ,
ModelClrType = typeof ( IEnumerable < > ) . MakeGenericType ( ModelType . For ( "foo" ) ) ,
} ) ;
var type2 = new TypeModel
{
Id = 2 ,
Alias = "foo" ,
ClrName = "Foo" ,
ParentId = 0 ,
BaseType = null ,
ItemType = TypeModel . ItemTypes . Element ,
} ;
2020-12-20 08:36:11 +01:00
TypeModel [ ] types = new [ ] { type1 , type2 } ;
2019-10-28 18:02:52 +11:00
2020-12-20 08:36:11 +01:00
var modelsBuilderConfig = new ModelsBuilderSettings ( ) ;
var builder = new TextBuilder ( modelsBuilderConfig , types )
2019-10-28 18:02:52 +11:00
{
2021-02-18 11:06:02 +01:00
ModelsNamespace = "Umbraco.Cms.Web.Common.PublishedModels"
2019-10-28 18:02:52 +11:00
} ;
var sb1 = new StringBuilder ( ) ;
builder . Generate ( sb1 , builder . GetModelsToGenerate ( ) . Skip ( 1 ) . First ( ) ) ;
var gen1 = sb1 . ToString ( ) ;
Console . WriteLine ( gen1 ) ;
var sb = new StringBuilder ( ) ;
builder . Generate ( sb , builder . GetModelsToGenerate ( ) . First ( ) ) ;
var gen = sb . ToString ( ) ;
2020-12-20 08:36:11 +01:00
SemVersion version = ApiVersion . Current . Version ;
2019-10-28 18:02:52 +11:00
var expected = @ "//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
2020-03-07 21:33:35 +00:00
// Umbraco.ModelsBuilder.Embedded v" + version + @"
2019-10-28 18:02:52 +11:00
//
// Changes to this file will be lost if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System ;
using System.Linq.Expressions ;
2021-02-18 11:06:02 +01:00
using Umbraco.Cms.Core.Models.PublishedContent ;
2020-08-03 14:16:58 +02:00
using Umbraco.Web.PublishedCache ;
2021-02-18 11:06:02 +01:00
using Umbraco.Cms.Core.PublishedCache ;
using Umbraco.Cms.ModelsBuilder.Embedded ;
using Umbraco.Cms.Core ;
2020-09-08 15:17:57 +02:00
using Umbraco.Core ;
2021-02-18 11:06:02 +01:00
using Umbraco.Extensions ;
2019-10-28 18:02:52 +11:00
2021-02-18 11:06:02 +01:00
namespace Umbraco.Cms.Web.Common.PublishedModels
2019-10-28 18:02:52 +11:00
{
[PublishedModel(""type1"")]
public partial class Type1 : PublishedContentModel
{
// helpers
#pragma warning disable 0109 // new is redundant
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2019-10-28 18:02:52 +11:00
public new const string ModelTypeAlias = "" type1 "" ;
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2019-10-28 18:02:52 +11:00
public new const PublishedItemType ModelItemType = PublishedItemType . Content ;
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2020-08-03 14:16:58 +02:00
public new static IPublishedContentType GetModelContentType ( IPublishedSnapshotAccessor publishedSnapshotAccessor )
= > PublishedModelUtility . GetModelContentType ( publishedSnapshotAccessor , ModelItemType , ModelTypeAlias ) ;
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2020-08-03 14:16:58 +02:00
public static IPublishedPropertyType GetModelPropertyType < TValue > ( IPublishedSnapshotAccessor publishedSnapshotAccessor , Expression < Func < Type1 , TValue > > selector )
= > PublishedModelUtility . GetModelPropertyType ( GetModelContentType ( publishedSnapshotAccessor ) , selector ) ;
2019-10-28 18:02:52 +11:00
#pragma warning restore 0109
2020-09-08 15:17:57 +02:00
private IPublishedValueFallback _publishedValueFallback ;
2019-10-28 18:02:52 +11:00
// ctor
2020-09-08 15:17:57 +02:00
public Type1 ( IPublishedContent content , IPublishedValueFallback publishedValueFallback )
2019-10-28 18:02:52 +11:00
: base ( content )
2020-09-08 15:17:57 +02:00
{
2021-02-18 11:06:02 +01:00
_publishedValueFallback = publishedValueFallback ;
2020-09-08 15:17:57 +02:00
}
2019-10-28 18:02:52 +11:00
// properties
2020-03-07 21:33:35 +00:00
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(""Umbraco.ModelsBuilder.Embedded"", """ + version + @""")]
2019-10-28 18:02:52 +11:00
[ImplementPropertyType(""foo"")]
2020-09-08 15:17:57 +02:00
public global :: System . Collections . Generic . IEnumerable < global :: Foo > Foo = > this . Value < global :: System . Collections . Generic . IEnumerable < global :: Foo > > ( _publishedValueFallback , "" foo "" ) ;
2019-10-28 18:02:52 +11:00
}
}
";
Console . WriteLine ( gen ) ;
Assert . AreEqual ( expected . ClearLf ( ) , gen ) ;
}
[Test]
public void GenerateAmbiguous ( )
{
var type1 = new TypeModel
{
Id = 1 ,
Alias = "type1" ,
ClrName = "Type1" ,
ParentId = 0 ,
BaseType = null ,
ItemType = TypeModel . ItemTypes . Content ,
IsMixin = true ,
} ;
type1 . Properties . Add ( new PropertyModel
{
Alias = "prop1" ,
ClrName = "Prop1" ,
ModelClrType = typeof ( IPublishedContent ) ,
} ) ;
type1 . Properties . Add ( new PropertyModel
{
Alias = "prop2" ,
ClrName = "Prop2" ,
2020-09-20 23:22:43 +02:00
ModelClrType = typeof ( StringBuilder ) ,
2019-10-28 18:02:52 +11:00
} ) ;
type1 . Properties . Add ( new PropertyModel
{
Alias = "prop3" ,
ClrName = "Prop3" ,
2021-02-18 11:06:02 +01:00
ModelClrType = typeof ( global :: Umbraco . Cms . Core . Exceptions . BootFailedException ) ,
2019-10-28 18:02:52 +11:00
} ) ;
2020-12-20 08:36:11 +01:00
TypeModel [ ] types = new [ ] { type1 } ;
2019-10-28 18:02:52 +11:00
2020-12-20 08:36:11 +01:00
var modelsBuilderConfig = new ModelsBuilderSettings ( ) ;
var builder = new TextBuilder ( modelsBuilderConfig , types )
2019-10-28 18:02:52 +11:00
{
2020-12-20 08:36:11 +01:00
ModelsNamespace = "Umbraco.ModelsBuilder.Models" // forces conflict with Umbraco.ModelsBuilder.Umbraco
2019-10-28 18:02:52 +11:00
} ;
var sb = new StringBuilder ( ) ;
2020-12-20 08:36:11 +01:00
foreach ( TypeModel model in builder . GetModelsToGenerate ( ) )
{
2019-10-28 18:02:52 +11:00
builder . Generate ( sb , model ) ;
2020-12-20 08:36:11 +01:00
}
2019-10-28 18:02:52 +11:00
var gen = sb . ToString ( ) ;
Console . WriteLine ( gen ) ;
2021-02-18 11:06:02 +01:00
Assert . IsTrue ( gen . Contains ( " global::Umbraco.Cms.Core.Models.PublishedContent.IPublishedContent Prop1" ) ) ;
2019-10-28 18:02:52 +11:00
Assert . IsTrue ( gen . Contains ( " global::System.Text.StringBuilder Prop2" ) ) ;
2021-02-18 11:06:02 +01:00
Assert . IsTrue ( gen . Contains ( " global::Umbraco.Cms.Core.Exceptions.BootFailedException Prop3" ) ) ;
2019-10-28 18:02:52 +11:00
}
[TestCase("int", typeof(int))]
[TestCase("global::System.Collections.Generic.IEnumerable<int>", typeof(IEnumerable<int>))]
2021-02-18 11:06:02 +01:00
[TestCase("global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.BuilderTestsClass1", typeof(BuilderTestsClass1))]
[TestCase("global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.BuilderTests.Class1", typeof(Class1))]
2019-10-28 18:02:52 +11:00
public void WriteClrType ( string expected , Type input )
{
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
2020-12-20 08:36:11 +01:00
var builder = new TextBuilder
{
ModelsNamespaceForTests = "ModelsNamespace"
} ;
2019-10-28 18:02:52 +11:00
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , input ) ;
Assert . AreEqual ( expected , sb . ToString ( ) ) ;
}
[TestCase("int", typeof(int))]
[TestCase("global::System.Collections.Generic.IEnumerable<int>", typeof(IEnumerable<int>))]
2021-02-18 11:06:02 +01:00
[TestCase("global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.BuilderTestsClass1", typeof(BuilderTestsClass1))]
[TestCase("global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.BuilderTests.Class1", typeof(Class1))]
2019-10-28 18:02:52 +11:00
public void WriteClrTypeUsing ( string expected , Type input )
{
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
var builder = new TextBuilder ( ) ;
2021-02-18 11:06:02 +01:00
builder . Using . Add ( "Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder" ) ;
2019-10-28 18:02:52 +11:00
builder . ModelsNamespaceForTests = "ModelsNamespace" ;
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , input ) ;
Assert . AreEqual ( expected , sb . ToString ( ) ) ;
}
[Test]
public void WriteClrType_WithUsing ( )
{
var builder = new TextBuilder ( ) ;
builder . Using . Add ( "System.Text" ) ;
2020-09-21 10:04:34 +02:00
builder . ModelsNamespaceForTests = "Umbraco.Tests.UnitTests.Umbraco.ModelsBuilder.Models" ;
2019-10-28 18:02:52 +11:00
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , typeof ( StringBuilder ) ) ;
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
Assert . AreEqual ( "global::System.Text.StringBuilder" , sb . ToString ( ) ) ;
}
[Test]
public void WriteClrTypeAnother_WithoutUsing ( )
{
2020-12-20 08:36:11 +01:00
var builder = new TextBuilder
{
ModelsNamespaceForTests = "Umbraco.Tests.UnitTests.Umbraco.ModelsBuilder.Models"
} ;
2019-10-28 18:02:52 +11:00
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , typeof ( StringBuilder ) ) ;
Assert . AreEqual ( "global::System.Text.StringBuilder" , sb . ToString ( ) ) ;
}
[Test]
public void WriteClrType_Ambiguous1 ( )
{
var builder = new TextBuilder ( ) ;
builder . Using . Add ( "System.Text" ) ;
2020-09-21 10:04:34 +02:00
builder . Using . Add ( "Umbraco.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded" ) ;
2019-10-28 18:02:52 +11:00
builder . ModelsNamespaceForTests = "SomeRandomNamespace" ;
var sb = new StringBuilder ( ) ;
2019-10-29 00:25:03 +11:00
builder . WriteClrType ( sb , typeof ( global :: System . Text . ASCIIEncoding ) ) ;
2019-10-28 18:02:52 +11:00
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
Assert . AreEqual ( "global::System.Text.ASCIIEncoding" , sb . ToString ( ) ) ;
}
[Test]
public void WriteClrType_Ambiguous ( )
{
var builder = new TextBuilder ( ) ;
builder . Using . Add ( "System.Text" ) ;
2020-09-21 10:04:34 +02:00
builder . Using . Add ( "Umbraco.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded" ) ;
2019-10-28 18:02:52 +11:00
builder . ModelsNamespaceForTests = "SomeBorkedNamespace" ;
var sb = new StringBuilder ( ) ;
2019-10-29 00:25:03 +11:00
builder . WriteClrType ( sb , typeof ( global :: System . Text . ASCIIEncoding ) ) ;
2019-10-28 18:02:52 +11:00
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
Assert . AreEqual ( "global::System.Text.ASCIIEncoding" , sb . ToString ( ) ) ;
}
[Test]
public void WriteClrType_Ambiguous2 ( )
{
var builder = new TextBuilder ( ) ;
builder . Using . Add ( "System.Text" ) ;
2021-02-18 11:06:02 +01:00
builder . Using . Add ( "Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded" ) ;
2019-10-28 18:02:52 +11:00
builder . ModelsNamespaceForTests = "SomeRandomNamespace" ;
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , typeof ( ASCIIEncoding ) ) ;
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
2021-02-18 11:06:02 +01:00
Assert . AreEqual ( "global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.ASCIIEncoding" , sb . ToString ( ) ) ;
2019-10-28 18:02:52 +11:00
}
[Test]
public void WriteClrType_AmbiguousNot ( )
{
var builder = new TextBuilder ( ) ;
builder . Using . Add ( "System.Text" ) ;
2021-02-18 11:06:02 +01:00
builder . Using . Add ( "Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded" ) ;
builder . ModelsNamespaceForTests = "Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Models" ;
2019-10-28 18:02:52 +11:00
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , typeof ( ASCIIEncoding ) ) ;
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
2021-02-18 11:06:02 +01:00
Assert . AreEqual ( "global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.ASCIIEncoding" , sb . ToString ( ) ) ;
2019-10-28 18:02:52 +11:00
}
[Test]
public void WriteClrType_AmbiguousWithNested ( )
{
var builder = new TextBuilder ( ) ;
builder . Using . Add ( "System.Text" ) ;
2021-02-18 11:06:02 +01:00
builder . Using . Add ( "Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded" ) ;
2019-10-28 18:02:52 +11:00
builder . ModelsNamespaceForTests = "SomeRandomNamespace" ;
var sb = new StringBuilder ( ) ;
builder . WriteClrType ( sb , typeof ( ASCIIEncoding . Nested ) ) ;
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
// which means global:: syntax will be applied to most things
2021-02-18 11:06:02 +01:00
Assert . AreEqual ( "global::Umbraco.Cms.Tests.UnitTests.Umbraco.ModelsBuilder.Embedded.ASCIIEncoding.Nested" , sb . ToString ( ) ) ;
2019-10-28 18:02:52 +11:00
}
2020-12-20 08:36:11 +01:00
public class Class1
{
}
2019-10-28 18:02:52 +11:00
}
2020-09-20 23:22:43 +02:00
// make it public to be ambiguous (see above)
2019-10-28 18:02:52 +11:00
public class ASCIIEncoding
{
// can we handle nested types?
2020-12-20 08:36:11 +01:00
public class Nested
{
}
2019-10-28 18:02:52 +11:00
}
2020-12-20 08:36:11 +01:00
public class BuilderTestsClass1
{
}
2019-10-28 18:02:52 +11:00
2020-12-20 08:36:11 +01:00
public class System
{
}
2019-10-28 18:02:52 +11:00
}