using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Text.Json.Serialization;
using NUnit.Framework.Constraints;
public class FullTypeNameConstraint : Constraint
readonly string expectedFullTypeName;
public FullTypeNameConstraint(string expectedFullTypeName) : base(expectedFullTypeName) => this.expectedFullTypeName = expectedFullTypeName;
public override string DisplayName => "FullTypeNameOf";
public override ConstraintResult ApplyTo<TActual>(TActual actual)
var actualTypeName = actual?.GetType().FullName;
return new ConstraintResult(this, actualTypeName, actualTypeName == expectedFullTypeName);
public class Is : NUnit.Framework.Is
public static FullTypeNameConstraint FullTypeNameOf(string expectedFullTypeName) => new FullTypeNameConstraint(expectedFullTypeName);
public static class CustomConstraintExtensions
public static FullTypeNameConstraint FullTypeNameOf(this ConstraintExpression expression, string expectedFullTypeName)
var constraint = new FullTypeNameConstraint(expectedFullTypeName);
expression.Append(constraint);
public static void Test()
Assert.Throws(Is.InstanceOf<JsonException>(), () => JsonDocument.Parse(json).Dispose());
Assert.AreEqual("System.Text.Json.JsonReaderException",
Assert.Throws(Is.InstanceOf<JsonException>(), () => JsonDocument.Parse(json).Dispose()).GetType().FullName);
Assert.Throws(Is.InstanceOf<JsonException>().And.Matches(new FullTypeNameConstraint("System.Text.Json.JsonReaderException")),
() => JsonDocument.Parse(json).Dispose());
Assert.Throws(Is.InstanceOf<JsonException>().And.Matches(new FullTypeNameConstraint("System.Text.Json.JsonReaderException")),
() => JsonDocument.Parse(json).Dispose());
Assert.Throws(Is.InstanceOf<JsonException>().And.FullTypeNameOf("System.Text.Json.JsonReaderException"), () => JsonDocument.Parse(json).Dispose());
Assert.Throws(Is.FullTypeNameOf("System.Text.Json.JsonReaderException"), () => JsonDocument.Parse(json).Dispose());
Assert.That(1, Is.FullTypeNameOf(typeof(int).FullName));
Assert.That(1, Is.InstanceOf<object>().And.Matches(new FullTypeNameConstraint(typeof(int).FullName)));
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("System.Text.Json version: " + typeof(JsonSerializer).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];