mirror of
https://github.com/mpv-player/mpv
synced 2025-01-12 01:49:33 +00:00
1edb3d061b
This is fragile enough that it warrants getting "monitored". This takes the commented test program code from img_format.c, makes it output to a text file, and then compares it to a "ref" file stored in git. Originally, I wanted to do the comparison etc. in a shell or Python script. But why not do it in C. So mpv calls /usr/bin/diff as a sub-process now. This test will start producing different output if FFmpeg adds new pixel formats or pixel format flags, or if mpv adds new IMGFMT (either aliases to FFmpeg formats or own formats). That is unavoidable, and requires manual inspection of the results, and then updating the ref file. The changes in the non-test code are to guarantee that the format ID conversion functions only translate between valid IDs.
72 lines
2.4 KiB
C
72 lines
2.4 KiB
C
#pragma once
|
|
|
|
#include <float.h>
|
|
#include <inttypes.h>
|
|
#include <math.h>
|
|
|
|
#include "common/common.h"
|
|
|
|
struct MPContext;
|
|
|
|
bool run_tests(struct MPContext *mpctx);
|
|
|
|
struct test_ctx {
|
|
struct mpv_global *global;
|
|
struct mp_log *log;
|
|
|
|
// Path for ref files, without trailing "/".
|
|
const char *ref_path;
|
|
|
|
// Path for result files, without trailing "/".
|
|
const char *out_path;
|
|
};
|
|
|
|
struct unittest {
|
|
// This is used to select the test on command line with --unittest=<name>.
|
|
const char *name;
|
|
|
|
// Cannot run without additional arguments supplied.
|
|
bool is_complex;
|
|
|
|
// Entrypoints. There are various for various purposes. Only 1 of them must
|
|
// be set.
|
|
|
|
// Entrypoint for tests which have a simple dependency on the mpv core. The
|
|
// core is sufficiently initialized at this point.
|
|
void (*run)(struct test_ctx *ctx);
|
|
};
|
|
|
|
extern const struct unittest test_chmap;
|
|
extern const struct unittest test_gl_video;
|
|
extern const struct unittest test_img_format;
|
|
extern const struct unittest test_json;
|
|
extern const struct unittest test_linked_list;
|
|
|
|
#define assert_true(x) assert(x)
|
|
#define assert_false(x) assert(!(x))
|
|
#define assert_int_equal(a, b) \
|
|
assert_int_equal_impl(__FILE__, __LINE__, (a), (b))
|
|
#define assert_string_equal(a, b) \
|
|
assert_string_equal_impl(__FILE__, __LINE__, (a), (b))
|
|
#define assert_float_equal(a, b, tolerance) \
|
|
assert_float_equal_impl(__FILE__, __LINE__, (a), (b), (tolerance))
|
|
|
|
// Require that the files "ref" and "new" are the same. The paths can be
|
|
// relative to ref_path and out_path respectively. If they're not the same,
|
|
// the output of "diff" is shown, the err message (if not NULL), and the test
|
|
// fails.
|
|
#define assert_text_files_equal(ctx, ref, new, err) \
|
|
assert_text_files_equal_impl(__FILE__, __LINE__, (ctx), (ref), (new), (err))
|
|
|
|
void assert_int_equal_impl(const char *file, int line, int64_t a, int64_t b);
|
|
void assert_string_equal_impl(const char *file, int line,
|
|
const char *a, const char *b);
|
|
void assert_float_equal_impl(const char *file, int line,
|
|
double a, double b, double tolerance);
|
|
void assert_text_files_equal_impl(const char *file, int line,
|
|
struct test_ctx *ctx, const char *ref,
|
|
const char *new, const char *err);
|
|
|
|
// Open a new file in the out_path. Always succeeds.
|
|
FILE *test_open_out(struct test_ctx *ctx, const char *name);
|