Skip to content

Commit 126c8a9

Browse files
committed
Throw TomlException for invalid polymorphism configuration
1 parent e658e7b commit 126c8a9

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using NUnit.Framework;
2+
using Tomlyn.Serialization;
3+
4+
namespace Tomlyn.Tests;
5+
6+
public sealed class NewApiPolymorphismValidationTests
7+
{
8+
[TomlPolymorphic]
9+
[TomlDerivedType(typeof(DerivedEmptyDiscriminator), "")]
10+
private abstract class BaseEmptyDiscriminator
11+
{
12+
}
13+
14+
private sealed class DerivedEmptyDiscriminator : BaseEmptyDiscriminator
15+
{
16+
public int Value { get; set; } = 1;
17+
}
18+
19+
[TomlPolymorphic]
20+
[TomlDerivedType(typeof(string), "x")]
21+
private abstract class BaseNotAssignable
22+
{
23+
}
24+
25+
private sealed class DerivedNotAssignable : BaseNotAssignable
26+
{
27+
public int Value { get; set; } = 1;
28+
}
29+
30+
[Test]
31+
public void TomlDerivedType_EmptyDiscriminator_ThrowsTomlException()
32+
{
33+
Assert.Throws<TomlException>(() => TomlSerializer.Serialize<BaseEmptyDiscriminator>(new DerivedEmptyDiscriminator()));
34+
}
35+
36+
[Test]
37+
public void TomlDerivedType_NotAssignable_ThrowsTomlException()
38+
{
39+
Assert.Throws<TomlException>(() => TomlSerializer.Serialize<BaseNotAssignable>(new DerivedNotAssignable()));
40+
}
41+
42+
[Test]
43+
public void PolymorphismOptions_EmptyDiscriminatorPropertyName_ThrowsTomlException()
44+
{
45+
var options = TomlSerializerOptions.Default with
46+
{
47+
PolymorphismOptions = new TomlPolymorphismOptions { TypeDiscriminatorPropertyName = "" },
48+
};
49+
50+
Assert.Throws<TomlException>(() => TomlSerializer.Serialize<BaseNotAssignable>(new DerivedNotAssignable(), options));
51+
}
52+
}
53+

src/Tomlyn/Serialization/Internal/TomlPolymorphicTypeInfo.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static TomlTypeInfo TryWrap(TomlTypeInfo typeInfo)
7474

7575
if (string.IsNullOrEmpty(discriminatorPropertyName))
7676
{
77-
throw new InvalidOperationException($"Polymorphic type '{type.FullName}' must specify a discriminator property name.");
77+
throw new TomlException($"Polymorphic type '{type.FullName}' must specify a discriminator property name.");
7878
}
7979

8080
var derivedByDiscriminator = new Dictionary<string, Type>(StringComparer.Ordinal);
@@ -131,22 +131,22 @@ private static void AddDerivedType(
131131

132132
if (discriminator.Length == 0)
133133
{
134-
throw new InvalidOperationException($"Derived type discriminator for base '{baseType.FullName}' cannot be empty.");
134+
throw new TomlException($"Derived type discriminator for base '{baseType.FullName}' cannot be empty.");
135135
}
136136

137137
if (!baseType.IsAssignableFrom(derivedType))
138138
{
139-
throw new InvalidOperationException($"Derived type '{derivedType.FullName}' is not assignable to base type '{baseType.FullName}'.");
139+
throw new TomlException($"Derived type '{derivedType.FullName}' is not assignable to base type '{baseType.FullName}'.");
140140
}
141141

142142
if (derivedTypeByDiscriminator.ContainsKey(discriminator))
143143
{
144-
throw new InvalidOperationException($"Multiple derived types are registered with discriminator '{discriminator}' for base '{baseType.FullName}'.");
144+
throw new TomlException($"Multiple derived types are registered with discriminator '{discriminator}' for base '{baseType.FullName}'.");
145145
}
146146

147147
if (discriminatorByDerivedType.ContainsKey(derivedType))
148148
{
149-
throw new InvalidOperationException($"Derived type '{derivedType.FullName}' is registered multiple times for base '{baseType.FullName}'.");
149+
throw new TomlException($"Derived type '{derivedType.FullName}' is registered multiple times for base '{baseType.FullName}'.");
150150
}
151151

152152
derivedTypeByDiscriminator.Add(discriminator, derivedType);

0 commit comments

Comments
 (0)