def METHOD_NAME(test_id, o):
    def warning(prop_id, val_real, val_default, *, repr_fn=repr):
        print("Error %s: '%s.%s' is:%s, expected:%s" %
              (test_id, o.__class__.__name__, prop_id,
               repr_fn(val_real), repr_fn(val_default)))
        GLOBALS["error_num"] += 1
    properties = type(o).bl_rna.properties.items()
    for prop_id, prop in properties:
        if prop_id == "rna_type":
            continue
        prop_type = prop.type
        if prop_type in {'STRING', 'COLLECTION'}:
            continue
        if prop_type == 'POINTER':
            # traverse down pointers if they're set
            val_real = getattr(o, prop_id)
            if (val_real is not None) and (not isinstance(val_real, bpy.types.ID)):
                METHOD_NAME("%s.%s" % (test_id, prop_id), val_real)
        elif prop_type in {'INT', 'BOOL'}:
            # array_length = prop.array_length
            if not prop.is_array:
                val_real = getattr(o, prop_id)
                val_default = prop.default
                if val_real != val_default:
                    warning(prop_id, val_real, val_default)
            else:
                pass  # TODO, array defaults
        elif prop_type == 'FLOAT':
            # array_length = prop.array_length
            if not prop.is_array:
                val_real = getattr(o, prop_id)
                val_default = prop.default
                if val_real != val_default:
                    warning(prop_id, val_real, val_default, repr_fn=repr_float_32)
            else:
                pass  # TODO, array defaults
        elif prop_type == 'ENUM':
            val_real = getattr(o, prop_id)
            if prop.is_enum_flag:
                val_default = prop.default_flag
            else:
                val_default = prop.default
            if val_real != val_default:
                warning(prop_id, val_real, val_default)
        # print(prop_id, prop_type)