LCOV - code coverage report
Current view: top level - tests - vector-sprite-sheet.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 131 131 100.0 %
Date: 2024-05-11 21:41:31 Functions: 5 5 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 70 136 51.5 %

           Branch data     Line data    Source code
       1                 :            : #undef G_DISABLE_ASSERT
       2                 :            : 
       3                 :            : #include <shumate/shumate.h>
       4                 :            : #include "shumate/shumate-vector-sprite-sheet.h"
       5                 :            : 
       6                 :            : static void
       7                 :          3 : test_vector_sprite_sheet (void)
       8                 :            : {
       9                 :          6 :   g_autoptr(GError) error = NULL;
      10         [ -  + ]:          3 :   g_autoptr(ShumateVectorSpriteSheet) sprites = NULL;
      11         [ +  - ]:          3 :   g_autoptr(GdkTexture) texture = NULL;
      12         [ +  - ]:          3 :   g_autoptr(GBytes) json_bytes = NULL;
      13         [ +  - ]:          3 :   g_autoptr(ShumateVectorSprite) sprite = NULL;
      14                 :            : 
      15                 :          3 :   json_bytes = g_resources_lookup_data ("/org/gnome/shumate/Tests/sprites.json", G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
      16         [ -  + ]:          3 :   g_assert_no_error (error);
      17                 :          3 :   texture = gdk_texture_new_from_resource ("/org/gnome/shumate/Tests/sprites.png");
      18                 :            : 
      19                 :          3 :   sprites = shumate_vector_sprite_sheet_new ();
      20                 :            : 
      21                 :          3 :   shumate_vector_sprite_sheet_add_page (sprites, texture, g_bytes_get_data (json_bytes, NULL), 1, &error);
      22         [ -  + ]:          3 :   g_assert_no_error (error);
      23         [ -  + ]:          3 :   g_assert_nonnull (sprites);
      24                 :            : 
      25                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "sprite", 1);
      26         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
      27         [ +  - ]:          3 :   g_clear_object (&sprite);
      28                 :            : 
      29                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "not-a-sprite", 1);
      30         [ -  + ]:          3 :   g_assert_null (sprite);
      31   [ -  +  +  - ]:          3 :   g_clear_object (&sprite);
      32                 :          3 : }
      33                 :            : 
      34                 :            : typedef struct {
      35                 :            :   char *expected_name;
      36                 :            :   gboolean called;
      37                 :            :   gboolean return_null;
      38                 :            : } FallbackData;
      39                 :            : 
      40                 :            : static ShumateVectorSprite *
      41                 :        312 : fallback_func (ShumateVectorSpriteSheet *sprite_sheet,
      42                 :            :                const char               *name,
      43                 :            :                double                    scale_factor,
      44                 :            :                gpointer                  user_data)
      45                 :            : {
      46                 :        312 :   FallbackData *data = user_data;
      47                 :        624 :   g_autoptr(GdkPaintable) paintable = NULL;
      48                 :            : 
      49         [ -  + ]:        312 :   g_assert_cmpstr (name, ==, data->expected_name);
      50                 :        312 :   data->called = TRUE;
      51                 :            : 
      52                 :            :   /* Test reentrancy */
      53                 :        312 :   g_object_unref (shumate_vector_sprite_sheet_get_sprite (sprite_sheet, "sprite", 1));
      54                 :            : 
      55         [ +  + ]:        312 :   if (data->return_null)
      56                 :            :     return NULL;
      57                 :            :   else
      58                 :            :     {
      59                 :        309 :       paintable = GDK_PAINTABLE (gdk_texture_new_from_resource ("/org/gnome/shumate/Tests/sprites.png"));
      60                 :        309 :       return shumate_vector_sprite_new (paintable);
      61                 :            :     }
      62                 :            : }
      63                 :            : 
      64                 :            : 
      65                 :            : static void
      66                 :          3 : test_vector_sprite_sheet_fallback (void)
      67                 :            : {
      68                 :          6 :   g_autoptr(GError) error = NULL;
      69         [ -  + ]:          3 :   g_autoptr(ShumateVectorSpriteSheet) sprites = NULL;
      70         [ +  - ]:          3 :   g_autoptr(GdkTexture) texture = NULL;
      71         [ +  - ]:          3 :   g_autoptr(GBytes) json_bytes = NULL;
      72         [ +  - ]:          3 :   g_autoptr(ShumateVectorSprite) sprite = NULL;
      73                 :          3 :   FallbackData *user_data;
      74                 :            : 
      75                 :          3 :   json_bytes = g_resources_lookup_data ("/org/gnome/shumate/Tests/sprites.json", G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
      76         [ -  + ]:          3 :   g_assert_no_error (error);
      77                 :          3 :   texture = gdk_texture_new_from_resource ("/org/gnome/shumate/Tests/sprites.png");
      78                 :            : 
      79                 :          3 :   sprites = shumate_vector_sprite_sheet_new ();
      80                 :          3 :   shumate_vector_sprite_sheet_add_page (sprites, texture, g_bytes_get_data (json_bytes, NULL), 1, &error);
      81         [ -  + ]:          3 :   g_assert_no_error (error);
      82         [ -  + ]:          3 :   g_assert_nonnull (sprites);
      83                 :            : 
      84                 :          3 :   user_data = g_new0 (FallbackData, 1);
      85                 :          3 :   shumate_vector_sprite_sheet_set_fallback (sprites, fallback_func, user_data, g_free);
      86                 :            : 
      87                 :            :   /* the fallback function should not be called for sprites in the sheet */
      88                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "sprite", 1);
      89         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
      90         [ -  + ]:          3 :   g_assert_false (user_data->called);
      91         [ +  - ]:          3 :   g_clear_object (&sprite);
      92                 :            : 
      93                 :            :   /* the fallback function should provide a sprite */
      94                 :          3 :   user_data->expected_name = "not-a-sprite";
      95                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "not-a-sprite", 1);
      96         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
      97         [ -  + ]:          3 :   g_assert_true (user_data->called);
      98                 :            : 
      99         [ +  - ]:          3 :   g_clear_object (&sprite);
     100                 :          3 :   user_data->called = FALSE;
     101                 :            : 
     102                 :            :   /* should be cached */
     103                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "not-a-sprite", 1);
     104         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
     105         [ -  + ]:          3 :   g_assert_false (user_data->called);
     106         [ +  - ]:          3 :   g_clear_object (&sprite);
     107                 :            : 
     108                 :            :   /* test the case when the fallback function returns NULL */
     109                 :          3 :   user_data->expected_name = "not-a-sprite-2";
     110                 :          3 :   user_data->return_null = TRUE;
     111                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "not-a-sprite-2", 1);
     112         [ -  + ]:          3 :   g_assert_null (sprite);
     113         [ -  + ]:          3 :   g_assert_true (user_data->called);
     114                 :            : 
     115                 :          3 :   user_data->called = FALSE;
     116                 :            : 
     117                 :            :   /* NULL responses should also be cached */
     118                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "not-a-sprite-2", 1);
     119         [ -  + ]:          3 :   g_assert_null (sprite);
     120         [ -  + ]:          3 :   g_assert_false (user_data->called);
     121                 :            : 
     122                 :            :   /* test cache purging */
     123                 :          3 :   user_data->expected_name = "cached-sprite";
     124                 :          3 :   user_data->return_null = FALSE;
     125                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "cached-sprite", 1);
     126         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
     127         [ +  - ]:          3 :   g_clear_object (&sprite);
     128         [ +  + ]:        303 :   for (int i = 0; i < 100; i ++)
     129                 :            :     {
     130                 :        300 :       g_autoptr(ShumateVectorSprite) filler_sprite = NULL;
     131         [ +  - ]:        600 :       g_autofree char *name = g_strdup_printf ("filler-sprite-%d", i);
     132                 :        300 :       user_data->expected_name = name;
     133                 :        300 :       filler_sprite = shumate_vector_sprite_sheet_get_sprite (sprites, name, 1);
     134                 :            :     }
     135                 :          3 :   user_data->called = FALSE;
     136                 :            : 
     137                 :            :   /* should not be cached anymore */
     138                 :          3 :   user_data->expected_name = "cached-sprite";
     139                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "cached-sprite", 1);
     140         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
     141         [ -  + ]:          3 :   g_assert_true (user_data->called);
     142   [ +  -  +  - ]:          3 :   g_clear_object (&sprite);
     143                 :          3 : }
     144                 :            : 
     145                 :            : void
     146                 :          3 : test_scale_factor (void)
     147                 :            : {
     148                 :          6 :   g_autoptr(GError) error = NULL;
     149         [ -  + ]:          3 :   g_autoptr(ShumateVectorSpriteSheet) sprites = NULL;
     150         [ +  - ]:          3 :   g_autoptr(GdkTexture) texture = NULL;
     151         [ +  - ]:          3 :   g_autoptr(GBytes) json_bytes = NULL;
     152         [ +  - ]:          3 :   g_autoptr(GdkTexture) texture_2x = NULL;
     153         [ +  - ]:          3 :   g_autoptr(GBytes) json_bytes_2x = NULL;
     154                 :          3 :   ShumateVectorSprite *sprite;
     155         [ +  - ]:          3 :   g_autoptr(ShumateVectorSprite) new_sprite = NULL;
     156                 :            : 
     157                 :          3 :   sprites = shumate_vector_sprite_sheet_new ();
     158                 :            : 
     159                 :          3 :   json_bytes = g_resources_lookup_data ("/org/gnome/shumate/Tests/sprites.json", G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
     160         [ -  + ]:          3 :   g_assert_no_error (error);
     161                 :          3 :   texture = gdk_texture_new_from_resource ("/org/gnome/shumate/Tests/sprites.png");
     162                 :          3 :   shumate_vector_sprite_sheet_add_page (sprites, texture, g_bytes_get_data (json_bytes, NULL), 1, &error);
     163         [ -  + ]:          3 :   g_assert_no_error (error);
     164                 :            : 
     165                 :          3 :   json_bytes_2x = g_resources_lookup_data ("/org/gnome/shumate/Tests/sprites@2x.json", G_RESOURCE_LOOKUP_FLAGS_NONE, &error);
     166         [ -  + ]:          3 :   g_assert_no_error (error);
     167                 :          3 :   texture_2x = gdk_texture_new_from_resource ("/org/gnome/shumate/Tests/sprites@2x.png");
     168         [ -  + ]:          3 :   g_assert_no_error (error);
     169                 :          3 :   shumate_vector_sprite_sheet_add_page (sprites, texture_2x, g_bytes_get_data (json_bytes_2x, NULL), 2, &error);
     170         [ -  + ]:          3 :   g_assert_no_error (error);
     171                 :            : 
     172                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "sprite", 1);
     173         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
     174         [ -  + ]:          3 :   g_assert_cmpint (shumate_vector_sprite_get_scale_factor (sprite), ==, 1);
     175         [ -  + ]:          3 :   g_assert_cmpint (shumate_vector_sprite_get_width (sprite), ==, 16);
     176         [ -  + ]:          3 :   g_assert_cmpfloat (gdk_paintable_get_intrinsic_width (shumate_vector_sprite_get_source_paintable (sprite)), ==, 16);
     177         [ +  - ]:          3 :   g_clear_object (&sprite);
     178                 :            : 
     179                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "sprite", 2);
     180         [ -  + ]:          3 :   g_assert_true (SHUMATE_IS_VECTOR_SPRITE (sprite));
     181         [ -  + ]:          3 :   g_assert_cmpint (shumate_vector_sprite_get_scale_factor (sprite), ==, 2);
     182         [ -  + ]:          3 :   g_assert_cmpint (shumate_vector_sprite_get_width (sprite), ==, 16);
     183         [ -  + ]:          3 :   g_assert_cmpfloat (gdk_paintable_get_intrinsic_width (shumate_vector_sprite_get_source_paintable (sprite)), ==, 32);
     184         [ +  - ]:          3 :   g_clear_object (&sprite);
     185                 :            : 
     186                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "sprite", 3);
     187         [ -  + ]:          3 :   g_assert_cmpint (shumate_vector_sprite_get_scale_factor (sprite), ==, 2);
     188         [ +  - ]:          3 :   g_clear_object (&sprite);
     189                 :            : 
     190                 :          3 :   sprite = shumate_vector_sprite_sheet_get_sprite (sprites, "sprite", 0.5);
     191         [ -  + ]:          3 :   g_assert_cmpint (shumate_vector_sprite_get_scale_factor (sprite), ==, 1);
     192   [ +  -  +  - ]:          3 :   g_clear_object (&sprite);
     193                 :          3 : }
     194                 :            : 
     195                 :            : 
     196                 :            : int
     197                 :          3 : main (int argc, char *argv[])
     198                 :            : {
     199                 :          3 :   g_test_init (&argc, &argv, NULL);
     200                 :            : 
     201                 :          3 :   g_test_add_func ("/vector-sprite-sheet/sprites", test_vector_sprite_sheet);
     202                 :          3 :   g_test_add_func ("/vector-sprite-sheet/fallback", test_vector_sprite_sheet_fallback);
     203                 :          3 :   g_test_add_func ("/vector-sprite-sheet/scale-factor", test_scale_factor);
     204                 :            : 
     205                 :          3 :   return g_test_run ();
     206                 :            : }

Generated by: LCOV version 1.14