def test_does_quack_base_explanation_negative(self):
        class NoMethod(object):
            @property
            def id(self):
                return 'some_other_string'

            @property
            def model_task(self):
                return 'model_task_string'

            @property
            def model_type(self):
                return 'model_type_string'
        assert not BaseExplanation._does_quack(NoMethod())

        class NoModelTask(object):
            @property
            def method(self):
                return 'some_string'

            @property
            def id(self):
                return 'some_other_string'

            @property
            def model_type(self):
                return 'model_type_string'
        assert not BaseExplanation._does_quack(NoModelTask())

        class NoModelType(object):
            @property
            def method(self):
                return 'some_string'

            @property
            def id(self):
                return 'some_other_string'

            @property
            def model_task(self):
                return 'model_task_string'
        assert not BaseExplanation._does_quack(NoModelType())

        class NoId(object):
            @property
            def model_task(self):
                return 'model_task_string'

            @property
            def model_type(self):
                return 'model_type_string'

            @property
            def method(self):
                return 'some_string'
        assert not BaseExplanation._does_quack(NoId())

        class MethodInt(object):
            @property
            def model_task(self):
                return 'model_task_string'

            @property
            def model_type(self):
                return 'model_type_string'

            @property
            def method(self):
                return 5

            @property
            def id(self):
                return 'some_other_string'
        assert not BaseExplanation._does_quack(MethodInt())

        class ModelTaskInt(object):
            @property
            def model_task(self):
                return 12

            @property
            def model_type(self):
                return 'model_type_string'

            @property
            def method(self):
                return 5

            @property
            def id(self):
                return 'some_other_string'
        assert not BaseExplanation._does_quack(MethodInt())

        class IdInt(object):
            @property
            def model_task(self):
                return 'model_task_string'

            @property
            def model_type(self):
                return 'model_type_string'

            @property
            def method(self):
                return 'some_string'

            @property
            def id(self):
                return 5
        assert not BaseExplanation._does_quack(IdInt())
 def test_does_quack_base_explanation_non_property(self):
     class FeatureNonProp(object):
         def features(self):
             return None
     assert not BaseExplanation._does_quack(FeatureNonProp())
 def test_does_quack_base_explanation(self):
     assert BaseExplanation._does_quack(BaseValid())