LCOV - code coverage report
Current view: top level - src/tests - options.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 81 81 100.0 %
Date: 2025-03-29 09:04:10 Functions: 3 3 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 45 90 50.0 %

           Branch data     Line data    Source code
       1                 :            : #include "utils.h"
       2                 :            : 
       3                 :            : #include <libplacebo/options.h>
       4                 :            : 
       5                 :          6 : static void count_cb(void *priv, pl_opt_data data)
       6                 :            : {
       7                 :            :     int *num = priv;
       8                 :          6 :     printf("Iterating over option: %s = %s\n", data->opt->key, data->text);
       9                 :          6 :     (*num)++;
      10                 :          6 : }
      11                 :            : 
      12                 :          9 : static void set_cb(void *priv, pl_opt_data data)
      13                 :            : {
      14                 :            :     pl_options dst = priv;
      15         [ -  + ]:          9 :     REQUIRE(pl_options_set_str(dst, data->opt->key, data->text));
      16                 :          9 : }
      17                 :            : 
      18                 :          1 : int main()
      19                 :            : {
      20                 :          1 :     pl_log log = pl_test_logger();
      21                 :          1 :     pl_options test = pl_options_alloc(log);
      22                 :            : 
      23         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "");
      24         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, ""));
      25         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "");
      26                 :            : 
      27                 :          1 :     pl_options_reset(test, &pl_render_fast_params);
      28         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "");
      29         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, "preset=fast"));
      30         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "");
      31                 :            : 
      32                 :            :     const char *def_opts = "upscaler=lanczos,downscaler=hermite,frame_mixer=oversample,sigmoid=yes,peak_detect=yes,dither=yes";
      33                 :          1 :     pl_options_reset(test, &pl_render_default_params);
      34         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), def_opts);
      35                 :          1 :     struct pl_options_t def_pre = *test;
      36                 :          1 :     pl_options_reset(test, NULL);
      37         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "");
      38         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, def_opts));
      39         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), def_opts);
      40                 :          1 :     REQUIRE_MEMEQ(test, &def_pre, sizeof(*test));
      41                 :          1 :     pl_options_reset(test, NULL);
      42         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, "preset=default"));
      43         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), def_opts);
      44                 :          1 :     REQUIRE_MEMEQ(test, &def_pre, sizeof(*test));
      45                 :            : 
      46                 :          1 :     int num = 0;
      47                 :          1 :     pl_options_iterate(test, count_cb, &num);
      48         [ -  + ]:          1 :     REQUIRE_CMP(num, ==, 6, "d");
      49                 :            : 
      50                 :            :     pl_opt_data data;
      51         [ -  + ]:          1 :     REQUIRE((data = pl_options_get(test, "tile_size")));
      52         [ -  + ]:          1 :     REQUIRE_STREQ(data->opt->key, "tile_size");
      53         [ -  + ]:          1 :     REQUIRE_CMP(*(int *) data->value, =, pl_render_default_params.tile_size, "d");
      54         [ -  + ]:          1 :     REQUIRE_STREQ(data->text, "32");
      55                 :            : 
      56                 :            :     const char *hq_opts = "upscaler=ewa_lanczossharp,downscaler=hermite,frame_mixer=oversample,deband=yes,sigmoid=yes,peak_detect=yes,peak_percentile=99.99500274658203,contrast_recovery=0.30000001192092896,dither=yes";
      57                 :            :     // fallback can produce different precision
      58                 :            :     const char *hq_opts2 = "upscaler=ewa_lanczossharp,downscaler=hermite,frame_mixer=oversample,deband=yes,sigmoid=yes,peak_detect=yes,peak_percentile=99.99500274658203125,contrast_recovery=0.30000001192092896,dither=yes";
      59                 :            : 
      60                 :          1 :     pl_options_reset(test, &pl_render_high_quality_params);
      61                 :          1 :     const char *opts = pl_options_save(test);
      62         [ -  + ]:          1 :     if (!strcmp(opts, hq_opts2))
      63                 :            :         hq_opts = hq_opts2;
      64         [ -  + ]:          1 :     REQUIRE_STREQ(opts, hq_opts);
      65                 :          1 :     struct pl_options_t hq_pre = *test;
      66                 :          1 :     pl_options_reset(test, NULL);
      67         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "");
      68         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, hq_opts));
      69         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), hq_opts);
      70                 :          1 :     REQUIRE_MEMEQ(test, &hq_pre, sizeof(*test));
      71         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, "preset=high_quality"));
      72         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), hq_opts);
      73                 :          1 :     REQUIRE_MEMEQ(test, &hq_pre, sizeof(*test));
      74                 :            : 
      75                 :          1 :     pl_options test2 = pl_options_alloc(log);
      76                 :          1 :     pl_options_iterate(test, set_cb, test2);
      77         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), pl_options_save(test2));
      78                 :          1 :     pl_options_free(&test2);
      79                 :            : 
      80                 :            :     // Test custom scalers
      81                 :          1 :     pl_options_reset(test, pl_render_params(
      82                 :            :         .upscaler = &(struct pl_filter_config) {
      83                 :            :             .kernel = &pl_filter_function_jinc,
      84                 :            :             .window = &pl_filter_function_jinc,
      85                 :            :             .radius = 4.0,
      86                 :            :             .polar  = true,
      87                 :            :         },
      88                 :            :     ));
      89                 :            :     const char *jinc4_opts = "upscaler=custom,upscaler_kernel=jinc,upscaler_window=jinc,upscaler_radius=4,upscaler_polar=yes";
      90         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), jinc4_opts);
      91                 :          1 :     struct pl_options_t jinc4_pre = *test;
      92                 :          1 :     pl_options_reset(test, NULL);
      93         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, "upscaler=custom,upscaler_preset=ewa_lanczos,upscaler_radius=4.0,upscaler_clamp=0.0"));
      94         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), jinc4_opts);
      95                 :          1 :     REQUIRE_MEMEQ(test, &jinc4_pre, sizeof(*test));
      96                 :            : 
      97                 :            :     // Test params presets
      98                 :          1 :     pl_options_reset(test, NULL);
      99         [ -  + ]:          1 :     REQUIRE(pl_options_load(test, "cone=yes,cone_preset=deuteranomaly"));
     100         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(test), "cone=yes,cones=m,cone_strength=0.5");
     101                 :            : 
     102                 :            :     // Test error paths
     103                 :          1 :     pl_options bad = pl_options_alloc(NULL);
     104         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "scale_preset=help"));
     105         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "dither_method=invalid"));
     106         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "lut_entries=-1"));
     107         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "deband_iterations=100"));
     108         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "tone_lut_size=abc"));
     109         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "show_clipping=hello"));
     110         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "brightness=2.0"));
     111         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "gamma=oops"));
     112         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "invalid"));
     113         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "="));
     114         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "preset==bar"));
     115         [ -  + ]:          1 :     REQUIRE(!pl_options_load(bad, "peak_percentile=E8203125"));
     116         [ -  + ]:          1 :     REQUIRE(!pl_options_get(bad, "invalid"));
     117         [ -  + ]:          1 :     REQUIRE_STREQ(pl_options_save(bad), "");
     118                 :          1 :     pl_options_free(&bad);
     119                 :            : 
     120                 :          1 :     pl_options_free(&test);
     121                 :          1 :     pl_log_destroy(&log);
     122                 :            :     return 0;
     123                 :            : }

Generated by: LCOV version 1.16