Skip to content

Commit c670d9f

Browse files
committed
Add comprehensive type candidate service tests
Introduces new unit tests for DefaultIntrinsicTypePolicy and TypeCandidateService, covering intrinsic type policy, base type inclusion, generic variance (Unity 2023.2+), and non-generic candidate filtering. Also expands TypeCandidateTestTypes with various test types to support these scenarios.
1 parent 578cdfe commit c670d9f

9 files changed

Lines changed: 248 additions & 1 deletion
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using MackySoft.SerializeReferenceExtensions.Editor;
4+
using NUnit.Framework;
5+
6+
namespace MackySoft.SerializeReferenceExtensions.Tests
7+
{
8+
public sealed class DefaultIntrinsicTypePolicyTests
9+
{
10+
public static IEnumerable<TestCaseData> Cases ()
11+
{
12+
yield return new TestCaseData(typeof(PublicSerializableClass), true).SetName("Intrinsic_PublicSerializableClass_OK");
13+
yield return new TestCaseData(typeof(SerializableStruct), true).SetName("Intrinsic_ValueTypeStruct_OK");
14+
yield return new TestCaseData(typeof(Outer.NestedPublicSerializableClass), true).SetName("Intrinsic_NestedPublic_OK");
15+
yield return new TestCaseData(Outer.NestedPrivateType, true).SetName("Intrinsic_NestedPrivate_OK");
16+
17+
yield return new TestCaseData(typeof(InternalSerializableClass), false).SetName("Intrinsic_Internal_NG");
18+
yield return new TestCaseData(typeof(AbstractSerializableClass), false).SetName("Intrinsic_Abstract_NG");
19+
yield return new TestCaseData(typeof(NonSerializableClass), false).SetName("Intrinsic_NoSerializableAttribute_NG");
20+
yield return new TestCaseData(typeof(HiddenSerializableClass), false).SetName("Intrinsic_HideInTypeMenu_NG");
21+
yield return new TestCaseData(typeof(UnityObjectDerived), false).SetName("Intrinsic_UnityObjectDerived_NG");
22+
23+
yield return new TestCaseData(typeof(GenericCandidate<int>), false).SetName("Intrinsic_GenericClosed_NG");
24+
}
25+
26+
[TestCaseSource(nameof(Cases))]
27+
public void IsAllowed_MatchesExpected (Type type, bool expected)
28+
{
29+
bool actual = DefaultIntrinsicTypePolicy.Instance.IsAllowed(type);
30+
Assert.That(actual, Is.EqualTo(expected), type.FullName);
31+
}
32+
}
33+
}

Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Tests/Editor/DefaultIntrinsicTypePolicyTests.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Linq;
2+
using MackySoft.SerializeReferenceExtensions.Editor;
3+
using NUnit.Framework;
4+
5+
namespace MackySoft.SerializeReferenceExtensions.Tests
6+
{
7+
[TestFixture]
8+
public sealed class TypeCandidateService_BaseTypeSelfTests
9+
{
10+
[Test]
11+
public void ConcreteBaseType_IsIncluded ()
12+
{
13+
var set = TypeSearchService.TypeCandiateService.GetDisplayableTypes(typeof(ConcreteBaseType)).ToHashSet();
14+
15+
Assert.That(set, Does.Contain(typeof(ConcreteBaseType)));
16+
Assert.That(set, Does.Contain(typeof(ConcreteDerivedType)));
17+
Assert.That(set, !Does.Contain(typeof(ConcreteInternalDerivedType)));
18+
}
19+
}
20+
}

Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Tests/Editor/TypeCandidateService_BaseTypeSelfTests.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#if UNITY_2023_2_OR_NEWER
2+
using System.Linq;
3+
using MackySoft.SerializeReferenceExtensions.Editor;
4+
using NUnit.Framework;
5+
6+
namespace MackySoft.SerializeReferenceExtensions.Tests
7+
{
8+
[TestFixture]
9+
public sealed class TypeCandidateService_GenericVarianceTests
10+
{
11+
[Test]
12+
public void Contravariance_IsSupported ()
13+
{
14+
// baseType: IContravariance<INetworkActor>
15+
var set = TypeSearchService.TypeCandiateService.GetDisplayableTypes(typeof(IContravariant<INetworkActor>)).ToHashSet();
16+
17+
Assert.That(set, Does.Contain(typeof(Contravariant_NetworkActor)), "Exact match should be included.");
18+
Assert.That(set, Does.Contain(typeof(Contravariant_Actor)), "Contravariant match should be included.");
19+
Assert.That(set, !Does.Contain(typeof(Contravariant_DerivedNetworkActor)), "Narrower type argument should be excluded.");
20+
}
21+
22+
[Test]
23+
public void Covariance_IsSupported ()
24+
{
25+
// baseType: ICovariant<IActor>
26+
var set = TypeSearchService.TypeCandiateService.GetDisplayableTypes(typeof(ICovariant<IActor>)).ToHashSet();
27+
28+
Assert.That(set, Does.Contain(typeof(Covariant_Actor)), "Exact match should be included.");
29+
Assert.That(set, Does.Contain(typeof(Covariant_NetworkActor)), "Covariant match should be included.");
30+
Assert.That(set, !Does.Contain(typeof(Covariant_Object)), "Wider type argument should be excluded.");
31+
}
32+
33+
[Test]
34+
public void Invariance_RemainsStrict ()
35+
{
36+
// baseType: IInvariant<IActor>
37+
var set = TypeSearchService.TypeCandiateService.GetDisplayableTypes(typeof(IInvariant<IActor>)).ToHashSet();
38+
39+
Assert.That(set, Does.Contain(typeof(Invariant_Actor)));
40+
Assert.That(set, !Does.Contain(typeof(Invariant_NetworkActor)));
41+
}
42+
}
43+
}
44+
#endif

Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Tests/Editor/TypeCandidateService_GenericVarianceTests.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using System.CodeDom;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using MackySoft.SerializeReferenceExtensions.Editor;
6+
using NUnit.Framework;
7+
8+
namespace MackySoft.SerializeReferenceExtensions.Tests
9+
{
10+
[TestFixture]
11+
public sealed class TypeCandidateService_NonGenericTests
12+
{
13+
private HashSet<Type> candidates;
14+
15+
[OneTimeSetUp]
16+
public void OneTimeSetUp ()
17+
{
18+
candidates = TypeSearchService.TypeCandiateService.GetDisplayableTypes(typeof(ITestBase)).ToHashSet();
19+
}
20+
21+
public static IEnumerable<TestCaseData> Cases ()
22+
{
23+
yield return new TestCaseData(typeof(PublicSerializableClass), true).SetName("Candidates_ITestBase_PublicSerializable_OK");
24+
yield return new TestCaseData(typeof(SerializableStruct), true).SetName("Candidates_ITestBase_ValueTypeStruct_OK");
25+
yield return new TestCaseData(typeof(Outer.NestedPublicSerializableClass), true).SetName("Candidates_ITestBase_NestedPublic_OK");
26+
yield return new TestCaseData(Outer.NestedPrivateType, true).SetName("Candidates_ITestBase_NestedPrivate_OK");
27+
28+
yield return new TestCaseData(typeof(InternalSerializableClass), false).SetName("Candidates_ITestBase_Internal_NG");
29+
yield return new TestCaseData(typeof(AbstractSerializableClass), false).SetName("Candidates_ITestBase_Abstract_NG");
30+
yield return new TestCaseData(typeof(NonSerializableClass), false).SetName("Candidates_ITestBase_NoSerializable_NG");
31+
yield return new TestCaseData(typeof(HiddenSerializableClass), false).SetName("Candidates_ITestBase_HideInTypeMenu_NG");
32+
yield return new TestCaseData(typeof(UnityObjectDerived), false).SetName("Candidates_ITestBase_UnityObjectDerived_NG");
33+
yield return new TestCaseData(typeof(GenericCandidate<int>), false).SetName("Candidates_ITestBase_GenericClosed_NG");
34+
}
35+
36+
[TestCaseSource(nameof(Cases))]
37+
public void CandidatesContainment_IsExpected (Type type, bool expected)
38+
{
39+
if (expected)
40+
{
41+
Assert.That(candidates, Does.Contain(type), $"Expected to contain: {type.FullName}");
42+
}
43+
else
44+
{
45+
Assert.That(candidates, !Does.Contain(type), $"Expected NOT to contain: {type.FullName}");
46+
}
47+
}
48+
49+
[Test]
50+
public void Candidates_HaveNoDuplicates ()
51+
{
52+
var list = TypeSearchService.TypeCandiateService.GetDisplayableTypes(typeof(ITestBase)).ToList();
53+
Assert.That(list.Count, Is.EqualTo(list.Distinct().Count()));
54+
}
55+
}
56+
}

Assets/MackySoft/MackySoft.SerializeReferenceExtensions/Tests/Editor/TypeCandidateService_NonGenericTests.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,94 @@
1+
using System;
12
using System.Collections;
2-
using System.Collections.Generic;
3+
using System.Reflection;
34
using UnityEngine;
45

56
namespace MackySoft.SerializeReferenceExtensions.Tests
67
{
78

9+
public interface ITestBase { }
10+
11+
[Serializable]
12+
public sealed class PublicSerializableClass : ITestBase { }
13+
14+
[Serializable]
15+
internal sealed class InternalSerializableClass : ITestBase { }
16+
17+
[Serializable]
18+
public abstract class AbstractSerializableClass : ITestBase { }
19+
20+
public sealed class NonSerializableClass : ITestBase { }
21+
22+
[Serializable, HideInTypeMenu]
23+
public sealed class HiddenSerializableClass : ITestBase { }
24+
25+
[Serializable]
26+
public sealed class UnityObjectDerived : ScriptableObject, ITestBase { }
27+
28+
public sealed class Outer
29+
{
30+
[Serializable]
31+
public sealed class NestedPublicSerializableClass : ITestBase { }
32+
33+
[Serializable]
34+
private sealed class NestedPrivateSerializableClass : ITestBase { }
35+
36+
public static Type NestedPrivateType => typeof(Outer).GetNestedType(nameof(NestedPrivateSerializableClass), BindingFlags.NonPublic);
37+
}
38+
39+
[Serializable]
40+
public sealed class GenericCandidate<T> : ITestBase { }
41+
42+
[Serializable]
43+
public struct SerializableStruct : ITestBase { }
44+
45+
[Serializable]
46+
public class ConcreteBaseType { }
47+
48+
[Serializable]
49+
public sealed class ConcreteDerivedType : ConcreteBaseType { }
50+
51+
[Serializable]
52+
internal sealed class ConcreteInternalDerivedType : ConcreteBaseType { }
53+
54+
// ------------------------
55+
// Generic variance test types (2023.2+)
56+
// ------------------------
57+
public interface IActor { }
58+
public interface INetworkActor : IActor { }
59+
public interface IDerivedNetworkActor : INetworkActor { }
60+
61+
public interface IContravariant<in T> { }
62+
public interface ICovariant<out T> { T Create (); }
63+
public interface IInvariant<T> { }
64+
65+
[Serializable]
66+
public sealed class Contravariant_Actor : IContravariant<IActor> { }
67+
68+
[Serializable]
69+
public sealed class Contravariant_NetworkActor : IContravariant<INetworkActor> { }
70+
71+
[Serializable]
72+
public sealed class Contravariant_DerivedNetworkActor : IContravariant<IDerivedNetworkActor> { }
73+
74+
[Serializable]
75+
public sealed class Covariant_Actor : ICovariant<IActor> {
76+
public IActor Create () => null;
77+
}
78+
79+
[Serializable]
80+
public sealed class Covariant_NetworkActor : ICovariant<INetworkActor> {
81+
public INetworkActor Create () => null;
82+
}
83+
84+
[Serializable]
85+
public sealed class Covariant_Object : ICovariant<object> {
86+
public object Create () => null;
87+
}
88+
89+
[Serializable]
90+
public sealed class Invariant_Actor : IInvariant<IActor> { }
91+
92+
[Serializable]
93+
public sealed class Invariant_NetworkActor : IInvariant<INetworkActor> { }
894
}

0 commit comments

Comments
 (0)