Files
Umbraco-CMS/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Composing/CollectionBuildersTests.cs

551 lines
21 KiB
C#
Raw Normal View History

// Copyright (c) Umbraco.
// See LICENSE for more details.
using System;
2016-08-22 11:40:45 +02:00
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
2018-11-28 11:05:41 +01:00
using Moq;
2016-08-22 11:40:45 +02:00
using NUnit.Framework;
using Umbraco.Cms.Core.Composing;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Tests.UnitTests.TestHelpers;
2016-08-22 11:40:45 +02:00
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Composing
2016-08-22 11:40:45 +02:00
{
[TestFixture]
public class CollectionBuildersTests
{
private IUmbracoBuilder _composition;
2016-08-22 11:40:45 +02:00
[SetUp]
public void Setup()
{
IServiceCollection register = TestHelper.GetServiceCollection();
_composition = new UmbracoBuilder(register, Mock.Of<IConfiguration>(), TestHelper.GetMockedTypeLoader());
2016-08-22 11:40:45 +02:00
}
[TearDown]
public void TearDown()
{
}
[Test]
public void ContainsTypes()
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsTrue(builder.Has<Resolved2>());
Assert.IsFalse(builder.Has<Resolved3>());
//// Assert.IsFalse(col.ContainsType<Resolved4>()); // does not compile
2016-08-22 11:40:45 +02:00
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved1), typeof(Resolved2));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanClearBuilderBeforeCollectionIsCreated()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
builder.Clear();
Assert.IsFalse(builder.Has<Resolved1>());
Assert.IsFalse(builder.Has<Resolved2>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col);
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotClearBuilderOnceCollectionIsCreated()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2017-06-27 19:10:25 +02:00
Assert.Throws<InvalidOperationException>(() => builder.Clear());
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanAppendToBuilder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>();
2016-08-22 11:40:45 +02:00
builder.Append<Resolved1>();
builder.Append<Resolved2>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsTrue(builder.Has<Resolved2>());
Assert.IsFalse(builder.Has<Resolved3>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved1), typeof(Resolved2));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotAppendToBuilderOnceCollectionIsCreated()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>();
2016-08-22 11:40:45 +02:00
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2017-06-27 19:10:25 +02:00
Assert.Throws<InvalidOperationException>(() => builder.Append<Resolved1>());
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanAppendDuplicateToBuilderAndDeDuplicate()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>();
2016-08-22 11:40:45 +02:00
builder.Append<Resolved1>();
builder.Append<Resolved1>();
IServiceProvider factory = _composition.CreateServiceProvider();
2018-11-28 16:57:01 +01:00
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved1));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotAppendInvalidTypeToBUilder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>();
2018-11-28 16:57:01 +01:00
////builder.Append<Resolved4>(); // does not compile
Assert.Throws<InvalidOperationException>(() => builder.Append(new[] { typeof(Resolved4) }));
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanRemoveFromBuilder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>()
.Remove<Resolved2>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsFalse(builder.Has<Resolved2>());
Assert.IsFalse(builder.Has<Resolved3>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved1));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanRemoveMissingFromBuilder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>()
.Remove<Resolved3>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved1), typeof(Resolved2));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotRemoveFromBuilderOnceCollectionIsCreated()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
Assert.Throws<InvalidOperationException>(() => builder.Remove<Resolved2>());
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanInsertIntoBuilder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>()
.Insert<Resolved3>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsTrue(builder.Has<Resolved2>());
Assert.IsTrue(builder.Has<Resolved3>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved3), typeof(Resolved1), typeof(Resolved2));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotInsertIntoBuilderOnceCollectionIsCreated()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
Assert.Throws<InvalidOperationException>(() => builder.Insert<Resolved3>());
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanInsertDuplicateIntoBuilderAndDeDuplicate()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>()
.Insert<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved2), typeof(Resolved1));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanInsertIntoEmptyBuilder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>();
2016-08-22 11:40:45 +02:00
builder.Insert<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved2));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotInsertIntoBuilderAtWrongIndex()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
Assert.Throws<ArgumentOutOfRangeException>(() => builder.Insert<Resolved3>(99));
2016-08-22 11:40:45 +02:00
Assert.Throws<ArgumentOutOfRangeException>(() => builder.Insert<Resolved3>(-1));
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanInsertIntoBuilderBefore()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>()
.InsertBefore<Resolved2, Resolved3>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsTrue(builder.Has<Resolved2>());
Assert.IsTrue(builder.Has<Resolved3>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved1), typeof(Resolved3), typeof(Resolved2));
}
[Test]
public void CanInsertIntoBuilderAfter()
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
.Append<Resolved1>()
.Append<Resolved2>()
.InsertAfter<Resolved1, Resolved3>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsTrue(builder.Has<Resolved2>());
Assert.IsTrue(builder.Has<Resolved3>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
AssertCollection(col, typeof(Resolved1), typeof(Resolved3), typeof(Resolved2));
}
[Test]
public void CanInsertIntoBuilderAfterLast()
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
.Append<Resolved1>()
.Append<Resolved2>()
.InsertAfter<Resolved2, Resolved3>();
Assert.IsTrue(builder.Has<Resolved1>());
Assert.IsTrue(builder.Has<Resolved2>());
Assert.IsTrue(builder.Has<Resolved3>());
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
AssertCollection(col, typeof(Resolved1), typeof(Resolved2), typeof(Resolved3));
}
2016-08-22 11:40:45 +02:00
[Test]
2018-02-02 19:43:03 +01:00
public void CannotInsertIntoBuilderBeforeOnceCollectionIsCreated()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2017-06-27 19:10:25 +02:00
Assert.Throws<InvalidOperationException>(() =>
builder.InsertBefore<Resolved2, Resolved3>());
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void CanInsertDuplicateIntoBuilderBeforeAndDeDuplicate()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>()
.InsertBefore<Resolved1, Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved2), typeof(Resolved1));
}
[Test]
2018-02-02 19:43:03 +01:00
public void CannotInsertIntoBuilderBeforeMissing()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilder builder = _composition.WithCollectionBuilder<TestCollectionBuilder>()
2017-06-27 19:10:25 +02:00
.Append<Resolved1>();
Assert.Throws<InvalidOperationException>(() =>
builder.InsertBefore<Resolved2, Resolved3>());
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void ScopeBuilderCreatesScopedCollection()
2016-08-22 11:40:45 +02:00
{
_composition.WithCollectionBuilder<TestCollectionBuilderScope>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
// CreateCollection creates a new collection each time
// but the container manages the scope, so to test the scope
// the collection must come from the container.
IServiceProvider factory = _composition.CreateServiceProvider();
2018-11-28 16:57:01 +01:00
using (IServiceScope scope = factory.CreateScope())
{
TestCollection col1 = scope.ServiceProvider.GetRequiredService<TestCollection>();
AssertCollection(col1, typeof(Resolved1), typeof(Resolved2));
2016-08-22 11:40:45 +02:00
TestCollection col2 = scope.ServiceProvider.GetRequiredService<TestCollection>();
AssertCollection(col2, typeof(Resolved1), typeof(Resolved2));
AssertSameCollection(scope.ServiceProvider, col1, col2);
}
2016-08-22 11:40:45 +02:00
}
[Test]
2018-02-02 19:43:03 +01:00
public void TransientBuilderCreatesTransientCollection()
2016-08-22 11:40:45 +02:00
{
2018-11-28 17:35:12 +01:00
_composition.WithCollectionBuilder<TestCollectionBuilderTransient>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
// CreateCollection creates a new collection each time
// but the container manages the scope, so to test the scope
// the collection must come from the container.
IServiceProvider factory = _composition.CreateServiceProvider();
2016-08-22 11:40:45 +02:00
TestCollection col1 = factory.GetRequiredService<TestCollection>();
2016-08-22 11:40:45 +02:00
AssertCollection(col1, typeof(Resolved1), typeof(Resolved2));
TestCollection col2 = factory.GetRequiredService<TestCollection>();
2016-08-22 11:40:45 +02:00
AssertCollection(col1, typeof(Resolved1), typeof(Resolved2));
AssertNotSameCollection(col1, col2);
}
[Test]
2018-02-02 19:43:03 +01:00
public void BuilderRespectsTypesOrder()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilderTransient builder = _composition.WithCollectionBuilder<TestCollectionBuilderTransient>()
2016-08-22 11:40:45 +02:00
.Append<Resolved3>()
.Insert<Resolved1>()
.InsertBefore<Resolved3, Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col1 = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col1, typeof(Resolved1), typeof(Resolved2), typeof(Resolved3));
}
[Test]
2018-02-02 19:43:03 +01:00
public void ScopeBuilderRespectsContainerScope()
2016-08-22 11:40:45 +02:00
{
2018-11-28 17:35:12 +01:00
_composition.WithCollectionBuilder<TestCollectionBuilderScope>()
2016-08-22 11:40:45 +02:00
.Append<Resolved1>()
.Append<Resolved2>();
// CreateCollection creates a new collection each time
// but the container manages the scope, so to test the scope
// the collection must come from the container/
IServiceProvider serviceProvider = _composition.CreateServiceProvider();
2016-08-22 11:40:45 +02:00
2018-07-20 15:45:01 +02:00
TestCollection col1A, col1B;
using (IServiceScope scope = serviceProvider.CreateScope())
2018-07-20 15:45:01 +02:00
{
col1A = scope.ServiceProvider.GetRequiredService<TestCollection>();
col1B = scope.ServiceProvider.GetRequiredService<TestCollection>();
2016-08-22 11:40:45 +02:00
AssertCollection(col1A, typeof(Resolved1), typeof(Resolved2));
AssertCollection(col1B, typeof(Resolved1), typeof(Resolved2));
AssertSameCollection(serviceProvider, col1A, col1B);
}
2016-08-22 11:40:45 +02:00
2018-07-20 15:45:01 +02:00
TestCollection col2;
2016-08-22 11:40:45 +02:00
using (IServiceScope scope = serviceProvider.CreateScope())
2018-07-20 15:45:01 +02:00
{
col2 = scope.ServiceProvider.GetRequiredService<TestCollection>();
2016-08-22 11:40:45 +02:00
2021-07-13 10:04:47 -06:00
// NOTE: We must assert here so that the lazy collection is resolved
// within this service provider scope, else if you resolve the collection
// after the service provider scope is disposed, you'll get an object
// disposed error (expected).
AssertCollection(col2, typeof(Resolved1), typeof(Resolved2));
}
2016-08-22 11:40:45 +02:00
AssertNotSameCollection(col1A, col2);
}
[Test]
2018-02-02 19:43:03 +01:00
public void WeightedBuilderCreatesWeightedCollection()
2016-08-22 11:40:45 +02:00
{
TestCollectionBuilderWeighted builder = _composition.WithCollectionBuilder<TestCollectionBuilderWeighted>()
2016-08-22 11:40:45 +02:00
.Add<Resolved1>()
.Add<Resolved2>();
IServiceProvider factory = _composition.CreateServiceProvider();
TestCollection col = builder.CreateCollection(factory);
2016-08-22 11:40:45 +02:00
AssertCollection(col, typeof(Resolved2), typeof(Resolved1));
}
[Test]
public void WeightedBuilderSetWeight()
{
var builder = _composition.WithCollectionBuilder<TestCollectionBuilderWeighted>()
.Add<Resolved1>()
.Add<Resolved2>();
builder.SetWeight<Resolved1>(10);
var factory = _composition.CreateServiceProvider();
var col = builder.CreateCollection(factory);
AssertCollection(col, typeof(Resolved1), typeof(Resolved2));
}
2016-08-22 11:40:45 +02:00
private static void AssertCollection(IEnumerable<Resolved> col, params Type[] expected)
{
Resolved[] colA = col.ToArray();
2016-08-22 11:40:45 +02:00
Assert.AreEqual(expected.Length, colA.Length);
for (int i = 0; i < expected.Length; i++)
{
2016-08-22 11:40:45 +02:00
Assert.IsInstanceOf(expected[i], colA[i]);
}
2016-08-22 11:40:45 +02:00
}
private static void AssertSameCollection(IServiceProvider factory, IEnumerable<Resolved> col1, IEnumerable<Resolved> col2)
2016-08-22 11:40:45 +02:00
{
Assert.AreSame(col1, col2);
Resolved[] col1A = col1.ToArray();
Resolved[] col2A = col2.ToArray();
2016-08-22 11:40:45 +02:00
Assert.AreEqual(col1A.Length, col2A.Length);
// Ensure each item in each collection is the same but also
// resolve each item from the factory to ensure it's also the same since
// it should have the same lifespan.
for (int i = 0; i < col1A.Length; i++)
{
2016-08-22 11:40:45 +02:00
Assert.AreSame(col1A[i], col2A[i]);
object itemA = factory.GetRequiredService(col1A[i].GetType());
object itemB = factory.GetRequiredService(col2A[i].GetType());
Assert.AreSame(itemA, itemB);
}
2016-08-22 11:40:45 +02:00
}
private static void AssertNotSameCollection(IEnumerable<Resolved> col1, IEnumerable<Resolved> col2)
{
Assert.AreNotSame(col1, col2);
Resolved[] col1A = col1.ToArray();
Resolved[] col2A = col2.ToArray();
2016-08-22 11:40:45 +02:00
Assert.AreEqual(col1A.Length, col2A.Length);
for (int i = 0; i < col1A.Length; i++)
{
2016-08-22 11:40:45 +02:00
Assert.AreNotSame(col1A[i], col2A[i]);
2020-09-08 13:03:43 +02:00
}
2016-08-22 11:40:45 +02:00
}
2018-02-02 19:43:03 +01:00
public abstract class Resolved
{
}
2018-02-02 19:43:03 +01:00
public class Resolved1 : Resolved
{
}
2018-02-02 19:43:03 +01:00
2019-01-28 12:20:22 +01:00
[Weight(50)] // default is 100
2018-02-02 19:43:03 +01:00
public class Resolved2 : Resolved
{
}
2018-02-02 19:43:03 +01:00
public class Resolved3 : Resolved
{
}
2018-02-02 19:43:03 +01:00
public class Resolved4 // not! : Resolved
{
}
2018-02-02 19:43:03 +01:00
// ReSharper disable once ClassNeverInstantiated.Local
private class TestCollectionBuilder : OrderedCollectionBuilderBase<TestCollectionBuilder, TestCollection, Resolved>
{
protected override TestCollectionBuilder This => this;
}
// ReSharper disable once ClassNeverInstantiated.Local
private class TestCollectionBuilderTransient : OrderedCollectionBuilderBase<TestCollectionBuilderTransient, TestCollection, Resolved>
{
protected override TestCollectionBuilderTransient This => this;
protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Transient; // transient
2018-02-02 19:43:03 +01:00
}
// ReSharper disable once ClassNeverInstantiated.Local
private class TestCollectionBuilderScope : OrderedCollectionBuilderBase<TestCollectionBuilderScope, TestCollection, Resolved>
{
protected override TestCollectionBuilderScope This => this;
protected override ServiceLifetime CollectionLifetime => ServiceLifetime.Scoped;
2018-02-02 19:43:03 +01:00
}
// ReSharper disable once ClassNeverInstantiated.Local
private class TestCollectionBuilderWeighted : WeightedCollectionBuilderBase<TestCollectionBuilderWeighted, TestCollection, Resolved>
{
protected override TestCollectionBuilderWeighted This => this;
}
// ReSharper disable once ClassNeverInstantiated.Local
private class TestCollection : BuilderCollectionBase<Resolved>
{
public TestCollection(Func<IEnumerable<Resolved>> items) : base(items)
{
}
2018-02-02 19:43:03 +01:00
}
2016-08-22 11:40:45 +02:00
}
}