def test_should_deserialize_complex_object(self):
        test_json = {
            "name": "John",
            "age": 51,
            "salary": {
                "basic": 10000.50,
                "allowance": 5000.75,
            },
            "address": {
                "line1": "foo",
                "line2": "bar",
                "postal_code": "123456"
            }}

        deserialized_obj = pyobj_serializer.deserialize(json.dumps(test_json),
                                                        ComplicatedPerson)

        self.assertEqual(deserialized_obj.__class__, ComplicatedPerson)
        self.assertEqual(deserialized_obj.name, 'John')
        self.assertEqual(deserialized_obj.age, 51)

        self.assertEqual(deserialized_obj.salary.__class__, Salary)
        self.assertEqual(deserialized_obj.salary.basic, 10000.50)
        self.assertEqual(deserialized_obj.salary.allowance, 5000.75)

        self.assertEqual(deserialized_obj.address.__class__, Address)
        self.assertEqual(deserialized_obj.address.line1, 'foo')
        self.assertEqual(deserialized_obj.address.line2, 'bar')
        self.assertEqual(deserialized_obj.address.postal_code, '123456')
    def test_should_deserialize_when_list_attrs_are_empty(self):
        test_json = {
            'objects': []
        }

        deserialized_object = pyobj_serializer.deserialize(json.dumps(test_json), PersonList)

        self.assertEqual(deserialized_object.objects, [])
    def test_should_deserialize_when_attrs_are_none(self):
        test_json = {
            'name': None
        }

        deserialized_object = pyobj_serializer.deserialize(json.dumps(test_json), SimplePerson)

        self.assertEqual(deserialized_object.name, None)
    def test_should_deserialize_simple_object(self):
        test_json = {
            'name': 'John'
        }

        deserialized_obj = pyobj_serializer.deserialize(json.dumps(test_json), SimplePerson)

        self.assertEqual(deserialized_obj.__class__, SimplePerson)
        self.assertEqual(deserialized_obj.name, 'John')
    def test_should_deserialize_to_dict_if_no_type_info_given_and_is_complex_type(self):
        test_generic_attrs = {'age': 10, 'nationality': 'unkown'}
        test_json = {
            'name': 'John Doe',
            'generic_attrs': test_generic_attrs
        }

        deserialized_object = pyobj_serializer.deserialize(json.dumps(test_json), GenericPerson)

        self.assertEqual(deserialized_object.__class__, GenericPerson)
        self.assertEqual(deserialized_object.name, 'John Doe')
        self.assertEqual(deserialized_object.generic_attrs, test_generic_attrs)
    def test_should_deserialize_with_lists_in_object(self):
        test_json = {
            'objects': [{'name': 'John'},
                        {'name': 'Doe'}]
        }

        deserialized_object = pyobj_serializer.deserialize(json.dumps(test_json), PersonList)

        self.assertEqual(deserialized_object.objects.__class__, list)
        self.assertEqual(len(deserialized_object.objects), 2)
        self.assertEqual(deserialized_object.objects[0].__class__, SimplePerson)
        self.assertEqual(deserialized_object.objects[0].name, 'John')
        self.assertEqual(deserialized_object.objects[1].__class__, SimplePerson)
        self.assertEqual(deserialized_object.objects[1].name, 'Doe')
    def test_should_deserialize_object_with_tuples_in_it(self):
        test_json = {
            'objects': [{'name': 'cujo', 'species': 'Canis lupus'},
                        {'name': 'jinxy', 'species': 'Canis lupus'}]
        }

        deserialized_object = pyobj_serializer.deserialize(
            json.dumps(test_json),
            AnimalList)

        self.assertEqual(deserialized_object.__class__, AnimalList)
        self.assertEqual(deserialized_object.objects.__class__, tuple)
        self.assertEqual(len(deserialized_object.objects), 2)
        self.assertEqual(deserialized_object.objects[0].__class__, Animal)
        self.assertEqual(deserialized_object.objects[0].name, 'cujo')
        self.assertEqual(deserialized_object.objects[0].species, 'Canis lupus')
        self.assertEqual(deserialized_object.objects[1].__class__, Animal)
        self.assertEqual(deserialized_object.objects[1].name, 'jinxy')
        self.assertEqual(deserialized_object.objects[1].species, 'Canis lupus')
    def test_should_deserialize_with_simple_inheritance(self):
        test_json = {
            'name': 'cujo',
            'species': 'Canis lupus',
            'breed': {
                'name': 'Labrador',
                'type': 'Retriever'
            }
        }

        deserialized_obj = pyobj_serializer.deserialize(json.dumps(test_json), Dog)

        self.assertEqual(deserialized_obj.__class__, Dog)
        self.assertEqual(deserialized_obj.name, 'cujo')
        self.assertEqual(deserialized_obj.species, 'Canis lupus')

        self.assertEqual(deserialized_obj.breed.__class__, Breed)
        self.assertEqual(deserialized_obj.breed.name, 'Labrador')
        self.assertEqual(deserialized_obj.breed.type, 'Retriever')