public void Should_return_item_if_parameter_is_enum_already()
    {
        StringBasedTypeConverter.ConvertFrom(null, null, TestEnum.Item1).Should().Be(TestEnum.Item1);

        ExtensibleTestEnumTypeConverter.ConvertFrom(null, null, ExtensibleTestEnum.Item1).Should().Be(ExtensibleTestEnum.Item1);
        ExtendedTestEnumTypeConverter.ConvertFrom(null, null, ExtendedTestEnum.Item1).Should().Be(ExtendedTestEnum.Item1);
        DifferentAssemblyExtendedTestEnumTypeConverter.ConvertFrom(null, null, DifferentAssemblyExtendedTestEnum.Item1).Should().Be(DifferentAssemblyExtendedTestEnum.Item1);
    }
    public void Should_return_item_if_parameter_matches_the_key_type_and_item_exists()
    {
        StringBasedTypeConverter.ConvertFrom(null, null, "item1").Should().Be(TestEnum.Item1);

        ExtensibleTestEnumTypeConverter.ConvertFrom(null, null, "item1").Should().Be(ExtensibleTestEnum.Item1);
        ExtendedTestEnumTypeConverter.ConvertFrom(null, null, "item1").Should().Be(ExtendedTestEnum.Item1);
        DifferentAssemblyExtendedTestEnumTypeConverter.ConvertFrom(null, null, "item1").Should().Be(DifferentAssemblyExtendedTestEnum.Item1);
    }
    public void Should_return_null_if_key_is_null()
    {
        StringBasedTypeConverter.ConvertFrom(null, null, null).Should().BeNull();

        ExtensibleTestEnumTypeConverter.ConvertFrom(null, null, null).Should().BeNull();
        ExtendedTestEnumTypeConverter.ConvertFrom(null, null, null).Should().BeNull();
        DifferentAssemblyExtendedTestEnumTypeConverter.ConvertFrom(null, null, null).Should().BeNull();
    }
    public void Should_throw_if_parameter_type_doesnt_match_the_enum_and_key()
    {
        Action action = () => StringBasedTypeConverter.ConvertFrom(Guid.Empty);

        action.Should().Throw <NotSupportedException>();

        action = () => ExtensibleTestEnumTypeConverter.ConvertFrom(Guid.Empty);
        action.Should().Throw <NotSupportedException>();

        action = () => ExtendedTestEnumTypeConverter.ConvertFrom(Guid.Empty);
        action.Should().Throw <NotSupportedException>();

        action = () => DifferentAssemblyExtendedTestEnumTypeConverter.ConvertFrom(Guid.Empty);
        action.Should().Throw <NotSupportedException>();
    }
    public void Should_return_invalid_item_if_parameter_matches_the_key_type_but_item_dont_exist()
    {
        var item = (TestEnum)StringBasedTypeConverter.ConvertFrom(null, null, "item 1");

        item.Key.Should().Be("item 1");
        item.IsValid.Should().BeFalse();

        var extensibleItem = (ExtensibleTestValidatableEnum)ExtensibleTestValidatableEnumTypeConverter.ConvertFrom(null, null, "item 1");

        extensibleItem.Key.Should().Be("item 1");
        extensibleItem.IsValid.Should().BeFalse();

        var extendedItem = (ExtendedTestValidatableEnum)ExtendedTestValidatableEnumTypeConverter.ConvertFrom(null, null, "item 1");

        extendedItem.Key.Should().Be("item 1");
        extendedItem.IsValid.Should().BeFalse();
    }