def test_strictbool_with_custom_base():
    """Test :func:`moretools.strictbool` class creator
       with a custom intermediate :class:`moretools.StrictBool`-derived
       ``base=`` class argument.
    """
    with pytest.raises(TypeError):
        strictbool('Bool', base=bool)

    class Bool(StrictBool):
        pass

    boolclass = strictbool('Bool', base=Bool)
    assert boolclass is not Bool
    assert issubclass(boolclass, Bool)
def test_strictbool(true_values, false_values):
    """Test :func:`moretools.strictbool` class creator.
    """
    boolclass = strictbool('Bool', true=true_values, false=false_values)
    assert boolclass.__name__ == 'Bool'
    assert boolclass is not StrictBool
    assert issubclass(boolclass, StrictBool)
    assert type(boolclass) is not StrictBoolMeta
    assert issubclass(type(boolclass), StrictBoolMeta)
    assert boolclass.true == type(boolclass).true == true_values
    assert boolclass.false == type(boolclass).false == false_values
def test_strictbool_without_true_false(true_values, false_values):
    """Test :func:`moretools.strictbool` class creator
       without passing ``true=`` and ``false=`` value lists.
    """
    boolclass = strictbool('Bool')
    assert boolclass.true is type(boolclass).true is None
    assert boolclass.false is type(boolclass).false is None
    assert boolclass(True) is True
    assert boolclass(False) is False
    for value in true_values + false_values:
        with pytest.raises(ValueError):
            boolclass(value)