public static void BuildAssemblyName___Should_build_the_expected_assembly_name___When_TypeRepresentation_is_unversioned()
        {
            // Arrange
            var types = TypeGenerator.GenerateTypesForTesting();

            var expected = types.Select(_ => _.Assembly.GetName().Name).ToList();

            // Act
            var actual = types.Select(_ => _.ToRepresentation().RemoveAssemblyVersions().BuildAssemblyName().FullName).ToList();

            // Assert
            actual.AsTest().Must().BeEqualTo(expected);
        }
        public static void BuildAssemblyQualifiedName___Should_build_the_expected_assembly_qualified_name___When_TypeRepresentation_is_unversioned()
        {
            // Arrange
            var types = TypeGenerator.GenerateTypesForTesting();

            var expected = types.Select(_ => Regex.Replace(_.AssemblyQualifiedName, ", Version=.*?, Culture=.*?, PublicKeyToken=[a-z0-9]*", string.Empty)).ToList();

            // Act
            var actual = types.Select(_ => _.ToRepresentation().RemoveAssemblyVersions().BuildAssemblyQualifiedName()).ToList();

            // Assert
            actual.AsTest().Must().BeEqualTo(expected);
        }
        public static void ResolvedFromLoadedTypes_typeRepresentation___Should_roundtrip_a_type_from_its_representation___When_called()
        {
            // Arrange
            var expectedTypes = TypeGenerator.GenerateTypesForTesting().ToList();

            var representations = expectedTypes.Select(_ => _.ToRepresentation()).ToList();

            // Act
            var actualTypes = representations.Select(_ => _.ResolveFromLoadedTypes(throwIfCannotResolve: true)).ToList();

            // Assert
            actualTypes.AsTest().Must().BeEqualTo(expectedTypes);
        }
        public static void ToTypeRepresentationFromAssemblyQualifiedName___Should_roundtrip_a_TypeRepresentation___When_assembly_qualified_name_generated_using_unversioned_TypeRepresentation_BuildAssemblyQualifiedName()
        {
            // Arrange
            var types = TypeGenerator.GenerateTypesForTesting().ToList();

            var expected = types.Select(_ => _.ToRepresentation().RemoveAssemblyVersions()).ToList();

            var assemblyQualifiedNames = expected.Select(_ => _.BuildAssemblyQualifiedName()).ToList();

            // Act
            var actual = assemblyQualifiedNames.Select(_ => _.ToTypeRepresentationFromAssemblyQualifiedName()).ToList();

            // Assert
            actual.AsTest().Must().BeEqualTo(expected);
        }
        public static void ToTypeRepresentationFromAssemblyQualifiedName___Should_return_same_result_as_ToRepresentation___When_assembly_qualified_name_generated_using_old_OBC_serialization_inherited_type_concrete_type_logic()
        {
            // versioned

            // Arrange
            var types = TypeGenerator.GenerateTypesForTesting().ToList();

            var expected = types.Select(_ => _.ToRepresentation().DeepCloneWithAssemblyVersion(null)).ToList();

            var assemblyQualifiedNames = types.Select(_ => _.FullName + ", " + _.Assembly.GetName().Name).ToList();

            // Act
            var actual = assemblyQualifiedNames.Select(_ => _.ToTypeRepresentationFromAssemblyQualifiedName()).ToList();

            // Assert
            actual.AsTest().Must().BeEqualTo(expected);
        }
        public static void ToTypeRepresentationFromAssemblyQualifiedName___Should_return_same_result_as_ToRepresentation___When_assembly_qualified_name_generated_using_Type_AssemblyQualifiedName()
        {
            // versioned

            // Arrange
            var types = TypeGenerator.GenerateTypesForTesting().ToList();

            var expected = types.Select(_ => _.ToRepresentation()).ToList();

            var assemblyQualifiedNames = types.Select(_ => _.AssemblyQualifiedName).ToList();

            // Act
            var actual = assemblyQualifiedNames.Select(_ => _.ToTypeRepresentationFromAssemblyQualifiedName()).ToList();

            // Assert
            actual.AsTest().Must().BeEqualTo(expected);
        }