-
-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(test) add assert for screenshot compare
- Loading branch information
1 parent
0c4bca0
commit 2f7a005
Showing
11 changed files
with
262 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
/** | ||
* @file lv_test_assert.c | ||
* | ||
* Copyright 2002-2010 Guillaume Cottenceau. | ||
* | ||
* This software may be freely redistributed under the terms | ||
* of the X11 license. | ||
* | ||
*/ | ||
|
||
/********************* | ||
* INCLUDES | ||
*********************/ | ||
#if LV_BUILD_TEST | ||
#include "../lvgl.h" | ||
|
||
#include <unistd.h> | ||
#include <stdlib.h> | ||
#include <stdio.h> | ||
#include <string.h> | ||
#include <stdarg.h> | ||
#include "unity.h" | ||
#define PNG_DEBUG 3 | ||
#include <png.h> | ||
|
||
/********************* | ||
* DEFINES | ||
*********************/ | ||
//#define REF_IMGS_PATH "lvgl/tests/lv_test_ref_imgs/" | ||
#define REF_IMGS_PATH "ref_imgs/" | ||
|
||
/********************** | ||
* TYPEDEFS | ||
**********************/ | ||
typedef struct { | ||
int width, height; | ||
png_byte color_type; | ||
png_byte bit_depth; | ||
|
||
png_structp png_ptr; | ||
png_infop info_ptr; | ||
int number_of_passes; | ||
png_bytep * row_pointers; | ||
}png_img_t; | ||
|
||
/********************** | ||
* STATIC PROTOTYPES | ||
**********************/ | ||
static int read_png_file(png_img_t * p, const char* file_name); | ||
static void png_release(png_img_t * p); | ||
|
||
/********************** | ||
* STATIC VARIABLES | ||
**********************/ | ||
|
||
/********************** | ||
* MACROS | ||
**********************/ | ||
|
||
/********************** | ||
* GLOBAL FUNCTIONS | ||
**********************/ | ||
|
||
bool lv_test_assert_img_eq(const char * fn_ref) | ||
{ | ||
|
||
char fn_ref_full[512]; | ||
sprintf(fn_ref_full, "%s%s", REF_IMGS_PATH, fn_ref); | ||
|
||
png_img_t p; | ||
int res = read_png_file(&p, fn_ref_full); | ||
if(res < 0) return false; | ||
uint8_t * screen_buf; | ||
|
||
lv_obj_invalidate(lv_scr_act()); | ||
lv_refr_now(NULL); | ||
|
||
extern lv_color_t test_fb[]; | ||
|
||
screen_buf = (uint8_t *)test_fb; | ||
|
||
uint8_t * ptr_act = NULL; | ||
const png_byte* ptr_ref = NULL; | ||
|
||
bool err = false; | ||
int x, y, i_buf = 0; | ||
for (y = 0; y < p.height; y++) { | ||
png_byte* row = p.row_pointers[y]; | ||
for (x = 0; x < p.width; x++) { | ||
ptr_ref = &(row[x*3]); | ||
ptr_act = &(screen_buf[i_buf*4]); | ||
|
||
uint8_t tmp = ptr_act[0]; | ||
ptr_act[0] = ptr_act[2]; | ||
ptr_act[2] = tmp; | ||
|
||
if(memcmp(ptr_act, ptr_ref, 3) != 0) { | ||
err = true; | ||
break; | ||
} | ||
i_buf++; | ||
} | ||
if(err) break; | ||
} | ||
|
||
png_release(&p); | ||
|
||
if(err) { | ||
uint32_t ref_px = 0; | ||
uint32_t act_px = 0; | ||
memcpy(&ref_px, ptr_ref, 3); | ||
memcpy(&act_px, ptr_act, 3); | ||
TEST_PRINTF("Diff in %s at (%d;%d), %x instead of %x)", fn_ref, x, y, act_px, ref_px); | ||
return false; | ||
} | ||
|
||
return true; | ||
|
||
} | ||
|
||
/********************** | ||
* STATIC FUNCTIONS | ||
**********************/ | ||
|
||
static int read_png_file(png_img_t * p, const char* file_name) | ||
{ | ||
char header[8]; // 8 is the maximum size that can be checked | ||
|
||
/*open file and test for it being a png*/ | ||
FILE *fp = fopen(file_name, "rb"); | ||
if (!fp) { | ||
TEST_PRINTF("%s", "PNG file %s could not be opened for reading"); | ||
return -1; | ||
} | ||
|
||
size_t rcnt = fread(header, 1, 8, fp); | ||
if (rcnt != 8 || png_sig_cmp((png_const_bytep)header, 0, 8)) { | ||
TEST_PRINTF("%s is not recognized as a PNG file", file_name); | ||
return -1; | ||
} | ||
|
||
/*initialize stuff*/ | ||
p->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); | ||
|
||
if (!p->png_ptr) { | ||
TEST_PRINTF("%s", "png_create_read_struct failed"); | ||
return -1; | ||
} | ||
|
||
p->info_ptr = png_create_info_struct(p->png_ptr); | ||
if (!p->info_ptr) { | ||
TEST_PRINTF("%s", "png_create_info_struct failed"); | ||
return -1; | ||
} | ||
if (setjmp(png_jmpbuf(p->png_ptr))) { | ||
TEST_PRINTF("%s", "Error during init_io"); | ||
return -1; | ||
} | ||
png_init_io(p->png_ptr, fp); | ||
png_set_sig_bytes(p->png_ptr, 8); | ||
|
||
png_read_info(p->png_ptr, p->info_ptr); | ||
|
||
p->width = png_get_image_width(p->png_ptr, p->info_ptr); | ||
p->height = png_get_image_height(p->png_ptr, p->info_ptr); | ||
p->color_type = png_get_color_type(p->png_ptr, p->info_ptr); | ||
p->bit_depth = png_get_bit_depth(p->png_ptr, p->info_ptr); | ||
|
||
p->number_of_passes = png_set_interlace_handling(p->png_ptr); | ||
png_read_update_info(p->png_ptr, p->info_ptr); | ||
|
||
/*read file*/ | ||
if (setjmp(png_jmpbuf(p->png_ptr))) { | ||
TEST_PRINTF("%s", "Error during read_image"); | ||
return -1; | ||
} | ||
p->row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * p->height); | ||
|
||
int y; | ||
for (y=0; y<p->height; y++) | ||
p->row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(p->png_ptr,p->info_ptr)); | ||
|
||
png_read_image(p->png_ptr, p->row_pointers); | ||
|
||
fclose(fp); | ||
return 0; | ||
} | ||
|
||
static void png_release(png_img_t * p) | ||
{ | ||
int y; | ||
for (y=0; y<p->height; y++) free(p->row_pointers[y]); | ||
|
||
free(p->row_pointers); | ||
} | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
|
||
#ifndef LV_UNITY_SUPPORT_H | ||
#define LV_UNITY_SUPPORT_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#include <stdbool.h> | ||
#include "../../lvgl.h" | ||
|
||
bool lv_test_assert_img_eq(const char * fn_ref); | ||
|
||
|
||
#if LV_COLOR_DEPTH != 32 | ||
# define TEST_ASSERT_EQUAL_SCREENSHOT(path) TEST_IGNORE_MESSAGE("Requires LV_COLOR_DEPTH 32"); | ||
# define TEST_ASSERT_EQUAL_SCREENSHOT_MESSAGE(path, msg) TEST_PRINTF(msg); TEST_IGNORE_MESSAGE("Requires LV_COLOR_DEPTH 32"); | ||
#else | ||
|
||
# define TEST_ASSERT_EQUAL_SCREENSHOT(path) if(LV_HOR_RES != 800 || LV_VER_RES != 480) { \ | ||
TEST_IGNORE_MESSAGE("Requires 800x480 resolution"); \ | ||
} else { \ | ||
TEST_ASSERT(lv_test_assert_img_eq(path)); \ | ||
} | ||
|
||
# define TEST_ASSERT_EQUAL_SCREENSHOT_MESSAGE(path, msg) if(LV_HOR_RES != 800 || LV_VER_RES != 480) { \ | ||
TEST_PRINTF(msg); \ | ||
TEST_IGNORE_MESSAGE("Requires 800x480 resolution"); \ | ||
} else { \ | ||
TEST_ASSERT_MESSAGE(lv_test_assert_img_eq(path), msg); \ | ||
} | ||
#endif | ||
|
||
# define TEST_ASSERT_EQUAL_COLOR(c1, c2) TEST_ASSERT_EQUAL_UINT32(c1.full, c2.full) | ||
# define TEST_ASSERT_EQUAL_COLOR_MESSAGE(c1, c2, msg) TEST_ASSERT_EQUAL_UINT32_MESSAGE(c1.full, c2.full, msg) | ||
|
||
#ifdef __cplusplus | ||
} /*extern "C"*/ | ||
#endif | ||
|
||
#endif /*LV_UNITY_SUPPORT_H*/ | ||
|