'Asserts that a field behaves correctly with various inputs.
Args:
fieldclass: the class of the field to be tested.
valid: a dictionary mapping valid inputs to their expected
cleaned values.
invalid: a dictionary mapping invalid inputs to one or more
raised error messages.
field_args: the args passed to instantiate the field
field_kwargs: the kwargs passed to instantiate the field
empty_value: the expected clean output for inputs in EMPTY_VALUES'

def assertFieldOutput(self, fieldclass, valid, invalid, field_args=[], field_kwargs={}, empty_value=u''):

    required = fieldclass(*field_args, **field_kwargs)
    optional = fieldclass(*field_args, **dict(field_kwargs, required=False))
    for (input, output) in valid.items():
        self.assertEqual(required.clean(input), output)
        self.assertEqual(optional.clean(input), output)
    for (input, errors) in invalid.items():
        try:
            required.clean(input)
        except ValidationError as e:
            self.assertEqual(errors, e.messages)
        else:
            self.fail()
        try:
            optional.clean(input)
        except ValidationError as e:
            self.assertEqual(errors, e.messages)
        else:
            self.fail()
    error_required = [u'This    field    is    required.']
    for val in EMPTY_VALUES:
        try:
            required.clean(val)
        except ValidationError as e:
            self.assertEqual(error_required, e.messages)
        else:
            self.fail()
        self.assertEqual(optional.clean(val), empty_value)
