diff options
| author | kx <kx@radix-linux.su> | 2026-10-17 16:39:23 +0300 |
|---|---|---|
| committer | kx <kx@radix-linux.su> | 2026-10-17 16:39:23 +0300 |
| commit | ec1891d58b9514b621725620453cec0e31e18389 (patch) | |
| tree | 6721f92c0afae3d933343b4a573ac8e5389827c6 /tests/test-css-file.c | |
| parent | 73d23259a690cd29c0ac74a4de963e23ecfebfac (diff) | |
| download | svgc-trunk.tar.xz | |
Diffstat (limited to 'tests/test-css-file.c')
| -rw-r--r-- | tests/test-css-file.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/tests/test-css-file.c b/tests/test-css-file.c new file mode 100644 index 0000000..fa4c159 --- /dev/null +++ b/tests/test-css-file.c @@ -0,0 +1,130 @@ + +/*************************************************************** + SVGC CSS TEST + + Exercise stylesheet inclusion and preservation of input text. + ***************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <svgc.h> + + +static int +write_file( const char *path, const void *data, size_t length ) +{ + FILE *fp; + int status; + + fp = fopen( path, "wb" ); + if( !fp ) return( 0 ); + status = (fwrite( data, 1, length, fp ) == length); + if( fclose( fp ) != 0 ) status = 0; + return( status ); +} + + +static char * +read_file( const char *path ) +{ + FILE *fp; + char *data; + long length; + + fp = fopen( path, "rb" ); + if( !fp ) return( NULL ); + if( fseek( fp, 0L, SEEK_END ) != 0 ) goto failed; + length = ftell( fp ); + if( length < 0 ) goto failed; + if( fseek( fp, 0L, SEEK_SET ) != 0 ) goto failed; + if( (unsigned long)length >= (size_t)-1 ) goto failed; + + data = (char *)malloc( (size_t)length + 1 ); + if( !data ) goto failed; + if( fread( data, 1, (size_t)length, fp ) != (size_t)length ) + { + free( data ); + goto failed; + } + data[length] = '\0'; + fclose( fp ); + return( data ); + +failed: + fclose( fp ); + return( NULL ); +} + + +int +main( void ) +{ + static const char css_text[] = + "@font-face { font-family: 'Roboto';\n" + " src: url('./fonts/Roboto/Roboto-Regular.woff2') format('woff2'); }\n" + ".a::after { content: '\xD0\xAF ]]> test'; }\n"; + static const char invalid_utf8[] = { (char)0xC0, (char)0x80 }; + char large_css[10000]; + static const char invalid_xml[] = { '.', 'a', '{', (char)0x01, '}' }; + struct __svg_sheet *sheet; + struct __svg_scene *scene = NULL; + char *svg = NULL; + char css_path[] = "svgc-test-css-XXXXXX"; + char svg_path[] = "svgc-test-svg-XXXXXX"; + int fd; + int status = 1; + + fd = mkstemp( css_path ); + if( fd < 0 ) return( 1 ); + close( fd ); + fd = mkstemp( svg_path ); + if( fd < 0 ) + { + unlink( css_path ); + return( 1 ); + } + close( fd ); + + sheet = (struct __svg_sheet *)__svg_new_sheet( 300, 200, 8, 8, 8, 8 ); + if( !sheet ) goto done; + scene = __svg_new_scene( sheet ); + if( !scene ) goto done; + + if( __svg_sheet_add_css_file( NULL, css_path ) != -1 ) goto done; + if( __svg_sheet_add_css_file( sheet, NULL ) != -1 ) goto done; + if( __svg_sheet_add_css_file( sheet, "" ) != -1 ) goto done; + if( __svg_sheet_add_css_file( sheet, "svgc-file-which-does-not-exist.css" ) != 0 ) goto done; + if( !write_file( css_path, invalid_utf8, sizeof( invalid_utf8 ) ) ) goto done; + if( __svg_sheet_add_css_file( sheet, css_path ) != 0 ) goto done; + if( !write_file( css_path, invalid_xml, sizeof( invalid_xml ) ) ) goto done; + if( __svg_sheet_add_css_file( sheet, css_path ) != 0 ) goto done; + if( !write_file( css_path, css_text, sizeof( css_text ) - 1 ) ) goto done; + if( __svg_sheet_add_css_file( sheet, css_path ) != 1 ) goto done; + memset( large_css, 'a', sizeof( large_css ) ); + memcpy( large_css, "/*", 2 ); + memcpy( large_css + sizeof( large_css ) - 2, "*/", 2 ); + if( !write_file( css_path, large_css, sizeof( large_css ) ) ) goto done; + if( __svg_sheet_add_css_file( sheet, css_path ) != 1 ) goto done; + if( !write_file( css_path, "replaced", 8 ) ) goto done; + __svg_paint_scene( scene, 0, svg_path ); + svg = read_file( svg_path ); + if( !svg ) goto done; + if( !strstr( svg, "<style type=\"text/css\">\n <![CDATA[\n" ) ) goto done; + if( !strstr( svg, "src: url('./fonts/Roboto/Roboto-Regular.woff2')" ) ) goto done; + if( !strstr( svg, "\xD0\xAF ]]]]><![CDATA[> test" ) ) goto done; + if( strstr( svg, "replaced" ) ) goto done; + if( !strstr( svg, " ]]>\n </style>\n" ) ) goto done; + if( !strstr( svg, "*/\n ]]>\n </style>" ) ) goto done; + if( !strstr( svg, "/*aaaaaaaa" ) ) goto done; + + status = 0; +done: + if( status ) fprintf( stderr, "SVGC CSS regression failed\n" ); + if( scene ) __svg_free_scene( scene ); + free( svg ); + unlink( css_path ); + unlink( svg_path ); + return( status ); +} |
