133 lines
4.4 KiB
Django/Jinja
133 lines
4.4 KiB
Django/Jinja
{% extends "base/header.j2" %}
|
|
{% block main %}
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
{{ super() }}
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
{% endblock %}
|
|
|
|
{% block content %}
|
|
{{ super() }}
|
|
const char *mock_name(int func);
|
|
void *mock_cur();
|
|
void *mock_get(int idx);
|
|
void *mock_peek();
|
|
void *mock_shift();
|
|
void *mock_slide(int func);
|
|
void mock_print(const indexed_call_t *packed);
|
|
void mock_push(void *call);
|
|
|
|
static int verbose_test = 0;
|
|
static int failed_test = 0;
|
|
#define verbose { verbose_test = 1; }
|
|
|
|
#define mock_warningf(...) { printf("WARNING: "), printf(__VA_ARGS__); }
|
|
#define mock_errorf(...) { printf("ERROR: "); printf(__VA_ARGS__); failed_test = 1; }
|
|
#define mock_assert(cond, ...) { if (!(cond)) { mock_errorf(__VA_ARGS__); }}
|
|
#define assert(cond) mock_assert(cond, "%s\n", #cond)
|
|
|
|
#define mock_print_ptr(prefix, ptr, size) \
|
|
printf("%s ", prefix); \
|
|
if (ptr == NULL) { \
|
|
printf("NULL"); \
|
|
} else { \
|
|
for (size_t i = 0; i < size; i++) { \
|
|
if (i > 0 && i % 4 == 0) printf(" "); \
|
|
printf("%02X", *(uint8_t *)(ptr+i)); \
|
|
} \
|
|
} \
|
|
printf("\n");
|
|
|
|
#define mock_return { \
|
|
indexed_call_t *call = NULL; \
|
|
while ((call = mock_shift()) != NULL) { \
|
|
mock_warningf("extra "); \
|
|
mock_print(call); \
|
|
} \
|
|
if (state.error) { \
|
|
mock_warningf("Ended with GL error flag: %s\n", gl_str(state.error)); \
|
|
} \
|
|
return failed_test; \
|
|
}
|
|
|
|
{% for func in functions %}
|
|
#define pack_{{ func.name }}({{ func.args|args(0) }}) ({ \
|
|
{{ func.name }}_INDEXED *packed_data = malloc(sizeof({{ func.name }}_INDEXED)); \
|
|
packed_data->func = {{ func.name }}_INDEX; \
|
|
{% if func.args %}
|
|
{% for arg in func.args %}
|
|
packed_data->args.a{{ loop.index }} = ({{ arg.type|unconst }}){{ arg.name }}; \
|
|
{% endfor %}
|
|
{% endif %}
|
|
packed_data; \
|
|
})
|
|
#define emit_{{ func.name }}({{ func.args|args(0) }}) { \
|
|
mock_push(pack_{{ func.name }}({{ func.args|args(0) }})); \
|
|
}
|
|
#define test_{{ func.name }}({{ func.args|args(0) }}) { \
|
|
{{ func.name }}_INDEXED *packed = mock_cur(); \
|
|
if (packed == NULL) { \
|
|
mock_errorf("{{ func.name }} missing (no calls left)\n"); \
|
|
} else if (packed->func != {{ func.name }}_INDEX) { \
|
|
if (verbose_test) { \
|
|
mock_print(mock_cur()); \
|
|
} \
|
|
indexed_call_t *tmp = (indexed_call_t *)packed; \
|
|
packed = mock_slide({{ func.name }}_INDEX); \
|
|
if (! packed) { \
|
|
mock_errorf("{{ func.name }} missing\n"); \
|
|
} else { \
|
|
mock_warningf("unexpected call while looking for {{ func.name }}:\n "); \
|
|
mock_print(tmp); \
|
|
}\
|
|
} else { \
|
|
if (verbose_test) { \
|
|
mock_print(mock_cur()); \
|
|
} \
|
|
mock_shift(); \
|
|
} \
|
|
if (packed) { \
|
|
int match = 1; \
|
|
void *a, *b; \
|
|
{% for arg in func.args %}
|
|
{% if '*' in arg.type %}
|
|
a = packed->args.a{{ loop.index }}, b = {{ arg.name }}; \
|
|
if (b == NULL && a != NULL || (a != NULL && b != NULL && (memcmp(a, b, sizeof({{ arg.name }})) != 0))) { \
|
|
printf(" ERROR: arg mismatch: {{ arg.name }}\n"); \
|
|
mock_print_ptr(" expected:", b, sizeof({{ arg.name }})); \
|
|
mock_print_ptr(" found:", a, sizeof({{ arg.name }})); \
|
|
{% elif 'float' in arg.type or 'double' in arg.type %}
|
|
if (packed->args.a{{ loop.index }} - {{ arg.name }} >= 0.01) { \
|
|
{% else %}
|
|
if (packed->args.a{{ loop.index }} != {{ arg.name }}) { \
|
|
{% endif %}
|
|
match = 0; \
|
|
} \
|
|
{% endfor %}
|
|
if (! match) { \
|
|
mock_errorf("calls do not match:\n"); \
|
|
printf(" have: "); mock_print((const indexed_call_t *)packed); \
|
|
printf(" want: {{ func.name }}({{ func.args|printf }});\n", {{ func.args|args(0) }}); \
|
|
} \
|
|
} \
|
|
}
|
|
{% endfor %}
|
|
|
|
{% for func in functions %}
|
|
#define gles_{{ func.name }}_INDEX {{ loop.index }}
|
|
#define gles_{{ func.name }}_RETURN {{ func.return }}
|
|
#define gles_{{ func.name }}_ARG_NAMES {{ func.args|args(0) }}
|
|
#define gles_{{ func.name }}_ARG_EXPAND {{ func.args|args }}
|
|
#define gles_{{ func.name }}_PACKED PACKED_{{ func.types }}
|
|
#define gles_{{ func.name }}_INDEXED INDEXED_{{ func.types }}
|
|
#define gles_{{ func.name }}_FORMAT FORMAT_{{ func.types }}
|
|
{% endfor %}
|
|
|
|
{% for func in functions %}
|
|
{{ func.return }} gles_{{ func.name }}({{ func.name }}_ARG_EXPAND);
|
|
{% endfor %}
|
|
{% endblock %}
|