test: make tests part of the mpv binary
Until now, each .c file in test/ was built as separate, self-contained
binary. Each binary could be run to execute the tests it contained.
Change this and make them part of the normal mpv binary. Now the tests
have to be invoked via the --unittest option. Do this for two reasons:
- Tests now run within a "properly" initialized mpv instance, so all
services are available.
- Possibly simplifying the situation for future build systems.
The first point is the main motivation. The mpv code is entangled with
mp_log and the option system. It feels like a bad idea to duplicate some
of the initialization of this just so you can call code using them.
I'm also getting rid of cmocka. There wouldn't be any problem to keep it
(it's a perfectly sane set of helpers), but NIH calls. I would have had
to aggregate all tests into a CMUnitTest list, and I don't see how I'd
get different types of entry points easily. Probably easily solvable,
but since we made only pretty basic use of this library, NIH-ing this is
actually easier (I needed a list of tests with custom metadata anyway,
so all what was left was reimplement the assert_* helpers).
Unit tests now don't output anything, and if they fail, they'll simply
crash and leave a message that typically requires inspecting the test
code to figure out what went wrong (and probably editing the test code
to get more information). I even merged the various test functions into
single ones. Sucks, but here you go.
chmap_sel.c is merged into chmap.c, because I didn't see the point of
this being separate. json.c drops the print_message() to go along with
the new silent-by-default idea, also there's a memory leak fix unrelated
to the rest of this commit.
The new code is enabled with --enable-tests (--enable-test goes away).
Due to waf's option parser, --enable-test still works, because it's a
unique prefix to --enable-tests.
2019-11-07 21:42:14 +00:00
|
|
|
#pragma once
|
|
|
|
|
2019-11-08 13:35:35 +00:00
|
|
|
#include <float.h>
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include <math.h>
|
|
|
|
|
|
|
|
#include "common/common.h"
|
test: make tests part of the mpv binary
Until now, each .c file in test/ was built as separate, self-contained
binary. Each binary could be run to execute the tests it contained.
Change this and make them part of the normal mpv binary. Now the tests
have to be invoked via the --unittest option. Do this for two reasons:
- Tests now run within a "properly" initialized mpv instance, so all
services are available.
- Possibly simplifying the situation for future build systems.
The first point is the main motivation. The mpv code is entangled with
mp_log and the option system. It feels like a bad idea to duplicate some
of the initialization of this just so you can call code using them.
I'm also getting rid of cmocka. There wouldn't be any problem to keep it
(it's a perfectly sane set of helpers), but NIH calls. I would have had
to aggregate all tests into a CMUnitTest list, and I don't see how I'd
get different types of entry points easily. Probably easily solvable,
but since we made only pretty basic use of this library, NIH-ing this is
actually easier (I needed a list of tests with custom metadata anyway,
so all what was left was reimplement the assert_* helpers).
Unit tests now don't output anything, and if they fail, they'll simply
crash and leave a message that typically requires inspecting the test
code to figure out what went wrong (and probably editing the test code
to get more information). I even merged the various test functions into
single ones. Sucks, but here you go.
chmap_sel.c is merged into chmap.c, because I didn't see the point of
this being separate. json.c drops the print_message() to go along with
the new silent-by-default idea, also there's a memory leak fix unrelated
to the rest of this commit.
The new code is enabled with --enable-tests (--enable-test goes away).
Due to waf's option parser, --enable-test still works, because it's a
unique prefix to --enable-tests.
2019-11-07 21:42:14 +00:00
|
|
|
|
|
|
|
struct MPContext;
|
|
|
|
|
|
|
|
bool run_tests(struct MPContext *mpctx);
|
|
|
|
|
2019-11-08 13:21:40 +00:00
|
|
|
struct test_ctx {
|
|
|
|
struct mpv_global *global;
|
|
|
|
struct mp_log *log;
|
2019-11-08 16:20:57 +00:00
|
|
|
|
|
|
|
// Path for ref files, without trailing "/".
|
|
|
|
const char *ref_path;
|
|
|
|
|
|
|
|
// Path for result files, without trailing "/".
|
|
|
|
const char *out_path;
|
2019-11-08 13:21:40 +00:00
|
|
|
};
|
|
|
|
|
test: make tests part of the mpv binary
Until now, each .c file in test/ was built as separate, self-contained
binary. Each binary could be run to execute the tests it contained.
Change this and make them part of the normal mpv binary. Now the tests
have to be invoked via the --unittest option. Do this for two reasons:
- Tests now run within a "properly" initialized mpv instance, so all
services are available.
- Possibly simplifying the situation for future build systems.
The first point is the main motivation. The mpv code is entangled with
mp_log and the option system. It feels like a bad idea to duplicate some
of the initialization of this just so you can call code using them.
I'm also getting rid of cmocka. There wouldn't be any problem to keep it
(it's a perfectly sane set of helpers), but NIH calls. I would have had
to aggregate all tests into a CMUnitTest list, and I don't see how I'd
get different types of entry points easily. Probably easily solvable,
but since we made only pretty basic use of this library, NIH-ing this is
actually easier (I needed a list of tests with custom metadata anyway,
so all what was left was reimplement the assert_* helpers).
Unit tests now don't output anything, and if they fail, they'll simply
crash and leave a message that typically requires inspecting the test
code to figure out what went wrong (and probably editing the test code
to get more information). I even merged the various test functions into
single ones. Sucks, but here you go.
chmap_sel.c is merged into chmap.c, because I didn't see the point of
this being separate. json.c drops the print_message() to go along with
the new silent-by-default idea, also there's a memory leak fix unrelated
to the rest of this commit.
The new code is enabled with --enable-tests (--enable-test goes away).
Due to waf's option parser, --enable-test still works, because it's a
unique prefix to --enable-tests.
2019-11-07 21:42:14 +00:00
|
|
|
struct unittest {
|
|
|
|
// This is used to select the test on command line with --unittest=<name>.
|
|
|
|
const char *name;
|
|
|
|
|
2019-11-08 13:21:40 +00:00
|
|
|
// Cannot run without additional arguments supplied.
|
|
|
|
bool is_complex;
|
|
|
|
|
test: make tests part of the mpv binary
Until now, each .c file in test/ was built as separate, self-contained
binary. Each binary could be run to execute the tests it contained.
Change this and make them part of the normal mpv binary. Now the tests
have to be invoked via the --unittest option. Do this for two reasons:
- Tests now run within a "properly" initialized mpv instance, so all
services are available.
- Possibly simplifying the situation for future build systems.
The first point is the main motivation. The mpv code is entangled with
mp_log and the option system. It feels like a bad idea to duplicate some
of the initialization of this just so you can call code using them.
I'm also getting rid of cmocka. There wouldn't be any problem to keep it
(it's a perfectly sane set of helpers), but NIH calls. I would have had
to aggregate all tests into a CMUnitTest list, and I don't see how I'd
get different types of entry points easily. Probably easily solvable,
but since we made only pretty basic use of this library, NIH-ing this is
actually easier (I needed a list of tests with custom metadata anyway,
so all what was left was reimplement the assert_* helpers).
Unit tests now don't output anything, and if they fail, they'll simply
crash and leave a message that typically requires inspecting the test
code to figure out what went wrong (and probably editing the test code
to get more information). I even merged the various test functions into
single ones. Sucks, but here you go.
chmap_sel.c is merged into chmap.c, because I didn't see the point of
this being separate. json.c drops the print_message() to go along with
the new silent-by-default idea, also there's a memory leak fix unrelated
to the rest of this commit.
The new code is enabled with --enable-tests (--enable-test goes away).
Due to waf's option parser, --enable-test still works, because it's a
unique prefix to --enable-tests.
2019-11-07 21:42:14 +00:00
|
|
|
// 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.
|
2019-11-08 13:21:40 +00:00
|
|
|
void (*run)(struct test_ctx *ctx);
|
test: make tests part of the mpv binary
Until now, each .c file in test/ was built as separate, self-contained
binary. Each binary could be run to execute the tests it contained.
Change this and make them part of the normal mpv binary. Now the tests
have to be invoked via the --unittest option. Do this for two reasons:
- Tests now run within a "properly" initialized mpv instance, so all
services are available.
- Possibly simplifying the situation for future build systems.
The first point is the main motivation. The mpv code is entangled with
mp_log and the option system. It feels like a bad idea to duplicate some
of the initialization of this just so you can call code using them.
I'm also getting rid of cmocka. There wouldn't be any problem to keep it
(it's a perfectly sane set of helpers), but NIH calls. I would have had
to aggregate all tests into a CMUnitTest list, and I don't see how I'd
get different types of entry points easily. Probably easily solvable,
but since we made only pretty basic use of this library, NIH-ing this is
actually easier (I needed a list of tests with custom metadata anyway,
so all what was left was reimplement the assert_* helpers).
Unit tests now don't output anything, and if they fail, they'll simply
crash and leave a message that typically requires inspecting the test
code to figure out what went wrong (and probably editing the test code
to get more information). I even merged the various test functions into
single ones. Sucks, but here you go.
chmap_sel.c is merged into chmap.c, because I didn't see the point of
this being separate. json.c drops the print_message() to go along with
the new silent-by-default idea, also there's a memory leak fix unrelated
to the rest of this commit.
The new code is enabled with --enable-tests (--enable-test goes away).
Due to waf's option parser, --enable-test still works, because it's a
unique prefix to --enable-tests.
2019-11-07 21:42:14 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
extern const struct unittest test_chmap;
|
|
|
|
extern const struct unittest test_gl_video;
|
2019-11-08 16:20:57 +00:00
|
|
|
extern const struct unittest test_img_format;
|
test: make tests part of the mpv binary
Until now, each .c file in test/ was built as separate, self-contained
binary. Each binary could be run to execute the tests it contained.
Change this and make them part of the normal mpv binary. Now the tests
have to be invoked via the --unittest option. Do this for two reasons:
- Tests now run within a "properly" initialized mpv instance, so all
services are available.
- Possibly simplifying the situation for future build systems.
The first point is the main motivation. The mpv code is entangled with
mp_log and the option system. It feels like a bad idea to duplicate some
of the initialization of this just so you can call code using them.
I'm also getting rid of cmocka. There wouldn't be any problem to keep it
(it's a perfectly sane set of helpers), but NIH calls. I would have had
to aggregate all tests into a CMUnitTest list, and I don't see how I'd
get different types of entry points easily. Probably easily solvable,
but since we made only pretty basic use of this library, NIH-ing this is
actually easier (I needed a list of tests with custom metadata anyway,
so all what was left was reimplement the assert_* helpers).
Unit tests now don't output anything, and if they fail, they'll simply
crash and leave a message that typically requires inspecting the test
code to figure out what went wrong (and probably editing the test code
to get more information). I even merged the various test functions into
single ones. Sucks, but here you go.
chmap_sel.c is merged into chmap.c, because I didn't see the point of
this being separate. json.c drops the print_message() to go along with
the new silent-by-default idea, also there's a memory leak fix unrelated
to the rest of this commit.
The new code is enabled with --enable-tests (--enable-test goes away).
Due to waf's option parser, --enable-test still works, because it's a
unique prefix to --enable-tests.
2019-11-07 21:42:14 +00:00
|
|
|
extern const struct unittest test_json;
|
|
|
|
extern const struct unittest test_linked_list;
|
2019-11-09 00:50:46 +00:00
|
|
|
extern const struct unittest test_repack_sws;
|
|
|
|
extern const struct unittest test_repack_zimg;
|
2020-02-06 12:44:16 +00:00
|
|
|
extern const struct unittest test_paths;
|
2019-11-08 13:35:35 +00:00
|
|
|
|
|
|
|
#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))
|
|
|
|
|
2019-11-08 16:20:57 +00:00
|
|
|
// 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))
|
|
|
|
|
2019-11-08 13:35:35 +00:00
|
|
|
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,
|
2019-11-08 16:20:57 +00:00
|
|
|
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);
|
2019-11-09 00:50:46 +00:00
|
|
|
|
|
|
|
// Sorted list of valid imgfmts. Call init_imgfmts_list() before use.
|
|
|
|
extern int imgfmts[];
|
|
|
|
extern int num_imgfmts;
|
|
|
|
|
|
|
|
void init_imgfmts_list(void);
|