implemented null object design pattern

This commit is contained in:
tylerlaberge
2016-08-06 16:33:15 -04:00
parent 87bcb4b270
commit c643902979
2 changed files with 155 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
class Null(object):
"""
A class for implementing Null objects.
This class ignores all parameters passed when constructing or
calling instances and traps all attribute and method requests.
Instances of it always (and reliably) do 'nothing'.
The code might benefit from implementing some further special
Python methods depending on the context in which its instances
are used. Especially when comparing and coercing Null objects
the respective methods' implementation will depend very much
on the environment and, hence, these special methods are not
provided here.
Dinu C. Gherman,
August 2001
http://code.activestate.com/recipes/68205-null-object-design-pattern/
"""
# object constructing
def __init__(self, *args, **kwargs):
"""
Ignore parameters.
"""
pass
# object calling
def __call__(self, *args, **kwargs):
"""
Ignore method calls.
"""
return self
# attribute handling
def __getattr__(self, mname):
"""
Ignore attribute requests.
"""
return self
def __setattr__(self, name, value):
"""
Ignore attribute setting.
"""
return self
def __delattr__(self, name):
"""
Ignore deleting attributes.
"""
return self
# misc.
def __repr__(self):
"""
Return a string representation.
"""
return ''
def __str__(self):
"""
Convert to a string and return it.
"""
return ''
def __bool__(self):
"""
Boolean of Null object is always False.
"""
return False

View File

@@ -0,0 +1,80 @@
from unittest import TestCase
from pypatterns.behavioral.null import Null
class NullTestCase(TestCase):
"""
Unit testing class for the Null class.
"""
def setUp(self):
"""
Initialize testing data.
"""
self.null = Null()
def test_constructing(self):
"""
Test constructing a Null object.
@raise AssertionError: If the test fails.
"""
try:
n = Null()
n = Null('value')
n = Null('value', param='value')
except:
raise AssertionError()
def test_calling(self):
"""
Test calling a Null object.
@raise AssertionError: If the test fails.
"""
self.assertEquals(self.null, self.null())
self.assertEquals(self.null, self.null('value'))
self.assertEquals(self.null, self.null('value', param='value'))
def test_attribute_handling(self):
"""
Test attribute handling on a Null object.
@raise AssertionError: If the test fails.
"""
self.assertEquals(self.null, self.null.attr1)
self.assertEquals(self.null, self.null.attr2)
self.assertEquals(self.null, self.null.method1())
self.assertEquals(self.null, self.null.method1().method2())
self.assertEquals(self.null, self.null.method('value'))
self.assertEquals(self.null, self.null.method(param='value'))
self.assertEquals(self.null, self.null.method('value', param='value'))
self.assertEquals(self.null, self.null.attr1.method1())
self.assertEquals(self.null, self.null.method1().attr1)
try:
self.null.attr1 = 'value'
self.null.attr1.attr2 = 'value'
del self.null.attr1
del self.null.attr1.attr2.attr3
except:
raise AssertionError()
def test_string_representation(self):
"""
Test the string representation of a Null object.
@raise AssertionError:
"""
self.assertEquals('', repr(self.null))
self.assertEquals('', str(self.null))
def test_truthiness(self):
"""
Test the truthiness of a Null object.
@raise AssertionError: If the test fails.
"""
self.assertFalse(bool(self.null))
self.assertFalse(bool(self.null.attr1))
self.assertFalse(bool(self.null.attr1.method1()))
self.assertFalse(bool(self.null.method2().attr2.method1().attr1))