From e35b1d04bdc7d531d72ebce7d1f031be2631e776 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 18 Jun 2021 14:13:05 +0200 Subject: [PATCH] test add build test again, add dropdown test, integrate gcov and gvocr --- .gitignore | 3 + src/widgets/lv_dropdown.c | 2 +- tests/Makefile | 19 ++- tests/build.py | 49 ++++++-- tests/defines.py | 53 +++++++- tests/lv_test_init.c | 2 - tests/lv_test_main.c | 134 +------------------- tests/main.py | 46 +++++-- tests/ref_imgs/dropdown_1.png | Bin 0 -> 12514 bytes tests/src/test_cases/_test_template.c | 13 ++ tests/src/test_cases/test_config.c | 19 +++ tests/src/test_cases/test_dropdown.c | 170 ++++++++++++++++++++++++++ tests/src/test_cases/test_obj_tree.c | 2 +- tests/src/test_cases/test_style.c | 13 ++ tests/test.py | 10 ++ tests/unity/unity_support.c | 48 +++++++- 16 files changed, 408 insertions(+), 175 deletions(-) create mode 100644 tests/ref_imgs/dropdown_1.png create mode 100644 tests/src/test_cases/_test_template.c create mode 100644 tests/src/test_cases/test_config.c create mode 100644 tests/src/test_cases/test_dropdown.c create mode 100644 tests/src/test_cases/test_style.c diff --git a/.gitignore b/.gitignore index 0286e4ad68..f982e497b3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ **/*bin **/*.swp **/*.swo +**/*.gcda +**/*.gcno tags docs/api_doc scripts/cppcheck_res.txt @@ -15,3 +17,4 @@ docs/env out_html __pycache__ /emscripten_builder +image_err.h diff --git a/src/widgets/lv_dropdown.c b/src/widgets/lv_dropdown.c index b5b9aa2347..42ba7600d6 100644 --- a/src/widgets/lv_dropdown.c +++ b/src/widgets/lv_dropdown.c @@ -335,7 +335,7 @@ const char * lv_dropdown_get_options(const lv_obj_t * obj) LV_ASSERT_OBJ(obj, MY_CLASS); lv_dropdown_t * dropdown = (lv_dropdown_t *)obj; - return dropdown->options; + return dropdown->options == NULL ? "" : dropdown->options; } uint16_t lv_dropdown_get_selected(const lv_obj_t * obj) diff --git a/tests/Makefile b/tests/Makefile index 34759eb014..bd7f06a1df 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -4,7 +4,6 @@ CC ?= gcc LVGL_DIR ?= ${shell pwd}/../.. LVGL_DIR_NAME ?= lvgl -OBJDIR = objs WARNINGS = -Werror -Wall -Wextra \ -Wshadow -Wundef -Wmaybe-uninitialized -Wmissing-prototypes -Wpointer-arith -Wuninitialized \ @@ -15,22 +14,18 @@ WARNINGS = -Werror -Wall -Wextra \ WARNINGS += -Wpedantic -pedantic-errors #-Wno-unused-value -Wno-unused-parameter -OPTIMIZATION ?= -O3 -g0 +OPTIMIZATION ?= -g0 -CFLAGS ?= -I$(LVGL_DIR)/ -Iunity $(DEFINES) $(WARNINGS) $(OPTIMIZATION) -I$(LVGL_DIR) -I. +CFLAGS ?= -I$(LVGL_DIR)/ --coverage -Iunity $(DEFINES) $(WARNINGS) $(OPTIMIZATION) -I$(LVGL_DIR) -I. -LDFLAGS ?= -lpng +LDFLAGS ?= -lpng --coverage BIN ?= test include ../lvgl.mk CSRCS += ${TEST_SRC} -CSRCS += unity/unity.c -CSRCS += unity/unity_support.c CSRCS += lv_test_init.c -CSRCS += src/test_fonts/font_1.c -CSRCS += src/test_fonts/font_2.c -CSRCS += src/test_fonts/font_3.c +CSRCS := $(CSRCS) $(EXTRA_CSRCS) OBJEXT ?= .o @@ -46,13 +41,13 @@ OBJS = $(AOBJS) $(COBJS) all: default -$(OBJDIR)/%.o: %.c +%.o: %.c @$(CC) $(CFLAGS) -c -o $@ $< - @echo "CC $<" +# @echo "CC $<" default: $(AOBJS) $(COBJS) $(MAINOBJ) $(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS) clean: - find . -type f -name '*.o' -exec rm -f {} + + find ../ -type f -name '*.o' -exec rm -f {} + rm -f $(BIN) diff --git a/tests/build.py b/tests/build.py index 3e5d96befd..55d782e770 100755 --- a/tests/build.py +++ b/tests/build.py @@ -1,19 +1,52 @@ #!/usr/bin/env python3 import os +import re lvgldirname = os.path.abspath('..') lvgldirname = os.path.basename(lvgldirname) lvgldirname = '"' + lvgldirname + '"' base_defines = '"-DLV_CONF_PATH=' + lvgldirname +'/tests/lv_test_conf.h -DLV_BUILD_TEST"' -optimization = '"-O3 -g0"' -def build(defines, test_name): - global base_defines, optimization +def build(defines): + global base_defines + optimization = '"-O3 -g0"' + d_all = base_defines[:-1] + " "; + + for d in defines: + d_all += " -D" + d + "=" + str(defines[d]) + + d_all += '"' + # -s makes it silence + cmd = "make -s -j BIN=test.bin " + "MAINSRC=lv_test_main.c LVGL_DIR_NAME=" + lvgldirname + " DEFINES=" + d_all + " OPTIMIZATION=" + optimization + print("") + print("Build") + print("-----------------------") +# print(cmd) + ret = os.system(cmd) + if(ret != 0): + print("BUILD ERROR! (error code " + str(ret) + ")") + exit(1) + + print("") + print("Run") + print("-----------------------") + ret = os.system("./test.bin") + if(ret != 0): + print("RUN ERROR! (error code " + str(ret) + ")") + exit(1) + + +def build_test(defines, test_name): + global base_defines + optimization = '"-g0"' + + print("") + print("") print("~~~~~~~~~~~~~~~~~~~~~~~~") - print(test_name) + print(re.search("/[a-z_]*$", test_name).group(0)[1:]) print("~~~~~~~~~~~~~~~~~~~~~~~~") d_all = base_defines[:-1] + " "; @@ -25,12 +58,14 @@ def build(defines, test_name): test_file_name = test_name + ".c" test_file_runner_name = test_name + "_Runner.c" test_file_runner_name = test_file_runner_name.replace("/test_cases/", "/test_runners/") + csrcs = " EXTRA_CSRCS=\"unity/unity.c unity/unity_support.c src/test_fonts/font_1.c src/test_fonts/font_2.c src/test_fonts/font_3.c \" " # -s makes it silence - cmd = "make -s -j BIN=test.bin MAINSRC=" + test_file_name + " TEST_SRC=" + test_file_runner_name + " LVGL_DIR_NAME=" + lvgldirname + " DEFINES=" + d_all + " OPTIMIZATION=" + optimization + cmd = "make -s -j BIN=test.bin MAINSRC=" + test_file_name + " TEST_SRC=" + test_file_runner_name + csrcs + " LVGL_DIR_NAME=" + lvgldirname + " DEFINES=" + d_all + " OPTIMIZATION=" + optimization print("") print("Build") print("-----------------------") +# print(cmd) ret = os.system(cmd) if(ret != 0): print("BUILD ERROR! (error code " + str(ret) + ")") @@ -43,10 +78,6 @@ def build(defines, test_name): if(ret != 0): print("RUN ERROR! (error code " + str(ret) + ")") exit(1) - - print("") - print("Finished") - print("-----------------------") def clean(): print("") diff --git a/tests/defines.py b/tests/defines.py index 44fe874801..eabd57ca61 100644 --- a/tests/defines.py +++ b/tests/defines.py @@ -56,14 +56,14 @@ minimal_16bit = { } -minimal_16bit_swap = { +normal_16bit_swap = { "LV_COLOR_DEPTH":16, "LV_COLOR_16_SWAP":1, "LV_MEM_SIZE":64 * 1024, "LV_DPI_DEF":40, - "LV_DRAW_COMPLEX":0, + "LV_DRAW_COMPLEX":1, "LV_USE_LOG":1, @@ -152,5 +152,52 @@ full_32bit = { "LV_BUILD_EXAMPLES":1, - "LV_FONT_DEFAULT":"\\\"&lv_font_montserrat_32\\\"", + "LV_FONT_DEFAULT":"\\\"&lv_font_montserrat_24\\\"", +} + +test = { + "LV_COLOR_DEPTH":32, + "LV_MEM_SIZE":2 * 1024 * 1024, + + "LV_SHADOW_CACHE_SIZE":10*1024, + "LV_IMG_CACHE_DEF_SIZE":32, + + "LV_USE_LOG":1, + "LV_LOG_PRINTF":1, + "LV_USE_FONT_SUBPX": 1, + "LV_FONT_SUBPX_BGR":1, + + "LV_USE_ASSERT_NULL":1, + "LV_USE_ASSERT_MALLOC":1, + "LV_USE_ASSERT_MEM_INTEGRITY":1, + "LV_USE_ASSERT_OBJ":1, + "LV_USE_ASSERT_STYLE":1, + + "LV_USE_USER_DATA": 1, + "LV_USE_LARGE_COORD": 1, + + "LV_FONT_MONTSERRAT_14":1, + "LV_FONT_MONTSERRAT_16":1, + "LV_FONT_MONTSERRAT_18":1, + "LV_FONT_MONTSERRAT_24":1, + "LV_FONT_MONTSERRAT_48":1, + "LV_FONT_MONTSERRAT_12_SUBPX":1, + "LV_FONT_MONTSERRAT_28_COMPRESSED":1, + "LV_FONT_DEJAVU_16_PERSIAN_HEBREW":1, + "LV_FONT_SIMSUN_16_CJK":1, + "LV_FONT_UNSCII_8":1, + "LV_FONT_UNSCII_16":1, + "LV_FONT_FMT_TXT_LARGE":1, + "LV_USE_FONT_COMPRESSED":1, + + "LV_USE_BIDI": 1, + "LV_USE_ARABIC_PERSIAN_CHARS":1, + "LV_USE_PERF_MONITOR":1, + "LV_USE_MEM_MONITOR":1, + + "LV_LABEL_TEXT_SELECTION":1, + + "LV_BUILD_EXAMPLES":1, + + "LV_FONT_DEFAULT":"\\\"&lv_font_montserrat_14\\\"", } diff --git a/tests/lv_test_init.c b/tests/lv_test_init.c index 7938bbf5e2..8c1cb4d88c 100644 --- a/tests/lv_test_init.c +++ b/tests/lv_test_init.c @@ -17,14 +17,12 @@ static lv_color_t disp_buf1[HOR_RES * VER_RES]; void lv_test_init(void) { - printf("Call lv_init...\n"); lv_init(); hal_init(); } void lv_test_deinit(void) { - printf("Call lv_deinit...\n"); lv_mem_deinit(); } diff --git a/tests/lv_test_main.c b/tests/lv_test_main.c index 114e18f242..645c964d36 100644 --- a/tests/lv_test_main.c +++ b/tests/lv_test_main.c @@ -4,144 +4,14 @@ #if LV_BUILD_TEST && !defined(LV_BUILD_TEST_NO_MAIN) #include - -#define HOR_RES 800 -#define VER_RES 480 - -static void hal_init(void); -static void dummy_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p); - -lv_color_t test_fb[HOR_RES * VER_RES]; +#include "lv_test_init.h" int main(void) { - printf("Call lv_init...\n"); - lv_init(); - - hal_init(); - - lv_test_core(); -// lv_test_label(); + lv_test_init(); printf("Exit with success!\n"); return 0; } -static void * open_cb(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode) -{ - (void) drv; - (void) mode; - - FILE * fp = fopen(path, "rb"); // only reading is supported - - return fp; -} - -static lv_fs_res_t close_cb(lv_fs_drv_t * drv, void * file_p) -{ - (void) drv; - - fclose(file_p); - return LV_FS_RES_OK; -} - -static lv_fs_res_t read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - (void) drv; - - *br = fread(buf, 1, btr, file_p); - return (*br <= 0) ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; -} - -static lv_fs_res_t seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t w) -{ - (void) drv; - - uint32_t w2; - switch(w) { - case LV_FS_SEEK_SET: - w2 = SEEK_SET; - break; - case LV_FS_SEEK_CUR: - w2 = SEEK_CUR; - break; - case LV_FS_SEEK_END: - w2 = SEEK_END; - break; - default: - w2 = SEEK_SET; - } - - fseek (file_p, pos, w2); - - return LV_FS_RES_OK; -} - -static lv_fs_res_t tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) -{ - (void) drv; - - *pos_p = ftell(file_p); - - return LV_FS_RES_OK; -} - - -static void hal_init(void) -{ - static lv_disp_draw_buf_t draw_buf; - lv_color_t * disp_buf1 = (lv_color_t *)malloc(LV_HOR_RES * LV_VER_RES * sizeof(lv_color_t)); - - lv_disp_draw_buf_init(&draw_buf, disp_buf1, NULL, LV_HOR_RES * LV_VER_RES); - - static lv_disp_drv_t disp_drv; - lv_disp_drv_init(&disp_drv); - disp_drv.draw_buf = &draw_buf; - disp_drv.flush_cb = dummy_flush_cb; - disp_drv.hor_res = HOR_RES; - disp_drv.ver_res = VER_RES; - lv_disp_drv_register(&disp_drv); - - static lv_fs_drv_t drv; - lv_fs_drv_init(&drv); /*Basic initialization*/ - - drv.letter = 'F'; /*An uppercase letter to identify the drive*/ - drv.open_cb = open_cb; /*Callback to open a file*/ - drv.close_cb = close_cb; /*Callback to close a file*/ - drv.read_cb = read_cb; /*Callback to read a file*/ - drv.seek_cb = seek_cb; /*Callback to seek in a file (Move cursor)*/ - drv.tell_cb = tell_cb; /*Callback to tell the cursor position*/ - - lv_fs_drv_register(&drv); /*Finally register the drive*/ -} -#include - -static void dummy_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) -{ - LV_UNUSED(area); - LV_UNUSED(color_p); - - memcpy(test_fb, color_p, lv_area_get_size(area) * sizeof(lv_color_t)); - - lv_disp_flush_ready(disp_drv); -} - -uint32_t custom_tick_get(void) -{ - static uint64_t start_ms = 0; - if(start_ms == 0) { - struct timeval tv_start; - gettimeofday(&tv_start, NULL); - start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000; - } - - struct timeval tv_now; - gettimeofday(&tv_now, NULL); - uint64_t now_ms; - now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000; - - uint32_t time_ms = now_ms - start_ms; - return time_ms; -} - #endif diff --git a/tests/main.py b/tests/main.py index bac7785625..6687c4ab47 100755 --- a/tests/main.py +++ b/tests/main.py @@ -3,21 +3,47 @@ import defines import build import test +import sys +import os + +def build_conf(title, defs): + print("") + print("") + print("============================================") + print(title) + print("============================================") + print("") + + build.clean() + build.build(defs) + + +test_only = False; +test_report = False; +test_noclean = False; +if "test" in sys.argv: test_only = True; +if "report" in sys.argv: test_report = True; +if "noclean" in sys.argv: test_noclean = True; + +if not test_only: + build_conf("Minimal config monochrome", defines.minimal_monochrome) + build_conf("Minimal config, 16 bit color depth", defines.minimal_16bit) + build_conf("Normal config, 16 bit color depth swapped", defines.normal_16bit_swap) + build_conf("Full config, 32 bit color depth", defines.full_32bit) files = test.prepare() - -print("============================================") -print("Full config, 32 bit color depth") -print("============================================") -print("") +if test_noclean == False: + build.clean() for f in files: name = f[:-2] #test_foo.c -> test_foo - build.build(defines.full_32bit, name) + build.build_test(defines.test, name) +if test_report: + print("") + print("Generating report") + print("-----------------------") + os.system("gcovr -r ../ --html-details -o report/index.html --exclude-directories '\.\./examples' --exclude-directories 'src/.*' --exclude-directories 'unity' --exclude 'lv_test_.*\.c'") + print("Done: See report/index.html") -#build("Minimal config monochrome", minimal_monochrome) -#build.build("Minimal config, 16 bit color depth", defines.minimal_16bit, "test_obj_tree") -#build("Minimal config, 16 bit color depth swapped", minimal_16bit_swap) -#build("Full config, 32 bit color depth", full_32bit) diff --git a/tests/ref_imgs/dropdown_1.png b/tests/ref_imgs/dropdown_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e41f73d90d27e6ea8a926e05ffbbef971e2cc808 GIT binary patch literal 12514 zcmeHtc|4SR|Mz7{vXhXsO_C&pvV{_oC9;#fY-5)_TRFCf93h0{Ajy_3>nKSjdy*!k zv5$RiFy{G;(|y<7eV_CE?&o>_e6BxcUNdvebzR@(^La0yPo&nx^Ne)dbO?elUQkig zMi8n42tx6NmJ+_{vQB>pZ&cS5F6h$I(qe}+zre@c9!iEDIxaRI-j?pxh^@1WllAdy zSKO_wov+!sc+65^hC?xa5^Wbc-J6Ri5TkQD=QhkQEwkVuI9G=&Aty1jQLxNTMxfc>W#*a`A!}+&+TS~XC23_ zR>NEHg>wxsppNL^Z3yyUHw8U{oDrksfFEqA1>yHrT0?kEVJ(JN@k16A2x7goSZyg&EoX&nyYNQw;=LNs*t_duWn#yXlQ=EBtl(7qrb-6#m`Tg zg?27O&D5{X4DKW+7q~LjH!+bHp{}VpSa;p~v%KXBPi@f!Sq|j0xB;DEczF2v^XKI< zX0u}DQqt1)Di}!^<#rQhYG&cm@7}$GYt{*kg%po{Ij7!Lf_%yGT|KZGA0MBUb%-@N zH5Dh}PHSUpJ2pD1I6OW+K0N#q?_L-yyM4c%Rm?U-qCkhciQDw;QWBz-4Xx&NukYe{JgPGdjQ`!f-`$+u0KghgfLur=`{T%)h`J zlTWRVUjKfocI!fP;M{L(ADhc;f0NzLeS7))50hRsC{bBi*}GPAbjv0AMHW-VV`s8T z>&n^Vod|KT?zl^zpJ~l-8TXYAK`B7`1bM0m*W=f#fK=k zWH$Q#VzCeHEf!6Vwl*>|xG~?DPKC@Rjt1)qCF$hpigTM98os_NdRrMc+1~&0qoIk( zY0OKJXjjQ6m9;i?c(uoervRB6hW68*Yw9US%oSb+!xzo9%Qwy>Ax@> zX*?(ry%}p=Wm4FKUSD4ya+OSKStjx4w?0mCsKiDpKGfo`T`8)Zi9(1TeCjI``1n`qYpYKXXs zO-!IXOe;I>o)i|EeWOCB#x;fu5%Do&-&Ofy@1(p!l*NZb%s6;0;pP>W4E@#&f)cHq+|y6{HW zB}pxe{3)9I$Z^$O+>X-4xDsn}>`$e(ddsO1kLzRNZcUC{l5a+GVU7_=HH%RTH%<>;`#SGaZrnQJep~raf~x75>}Opbdc^sFEQK0TwA{F$ zg}L1Lc%3b!!0c&?;(lk$MC4?z8*QUq8>w(EYQgwQ*;s^%XtH{4cWP=XEWSac_c#t_ zrh9ycVVLE;oT`!%x1k`?ZRM;^yQP{dihuMurjtS)#JLR!hw|Hoqz5hkaK=;^j33vn z7G=0%7jkzUbL@riTYPj=dZWiaV^_#*m&!D{AA~jeuk_irw6sk2=6Bka85huxS>(&z z?CH^C&Fewe)YOD3oRwvdZ9bN8YmKPJ%Qm(if{J^+u<+E{=-9DiC5BIW(0T$1aI8Mo z%0AZX2^#@JILH=R8}R5uc$6YaMn)zESL?!4dry+p9Z?Y@Wf-bh8BX1My0>pg#0 zM)IsMr7c?Y;5|L%Ha>jN=V!mwj3Yj83P7u7mY1LOd`etd@giv!*r!ZZYTcHppF83c z5FpDIxujV!o6!*DIa!5r4~&^*PIjD_WN7@tIdWXtzx`-}Dw?gFNF-|U-&N;Z?_-*c zf}mu~blUeM|Cxvk>wvxg*rsLs4Kv(zn2KcOHRIm^NpKNcaFg72!f^H_`^RVdR(OyG zpUiDPp$}wpTU*grMAgd?f!Or&hWQuB;RLos;nWOv(7_e&^oV z)xr7z?5{a{f#B~wJFqJ*S2JVZ-o1?3ystYuJG*l=m4;{fYveM1frC|}-=15z+Sn*7 zGBGg?1P&?KbxwG^58VI=c~z|mIscysBee2l$*-=l@!ZKa4>WpmpzeBiclV7m!6dE8 zF8p$J|IGaSe5q~w`yD#){mwaauYbY6x9|{)W9`XzY&tdqNog|Py4d!s7VXcM)dv7l zMtx#~52NbLW{1hgAK2-I>v>5(VEf`g(1*TjuAcD$uu=yHT+DW7v`YZ`!0`YLi^kWm zUT#6rdxrC1VYrY2f{RLyJ8_1=y?MP_N50BwRg5278 z7NB5J%kz5^9@2vWtENT0smaNgx*t7U|Ni|)N0k9{RScem_4V~tRY|c* zNlQyhNzGUDAU@30f(*Y+^005AZWvAPDKW8Yq|E?Usne&Ymi^30hxV z<^P6O4cWZ8Dw=5RYq|}wc)?mMGWmAIT_E9>auz*3J%CK7oe8mO&z?O|QBh+_Tw$zC z;hsGe#l7u>8y?uS9(k@1+WOWt`I{5nf1_TiO_5hr6 zx9D6x#u3F`xdXX}Pzy#2wLIl%_FWpk#LIR`t!tv}t>L_niBh3D-%h4*#>PiI=xHw* zj;LL9p+2XDf*5U4Y`2w_hTp^=K?gL7tewa=5$Z*gL*G^Me#^-FQ|qa_0OLEID|bdJ zW@?Qmbtb9vDFL{(c=kUJ+J^*}oaH>Id>3DRTltEo=d!|+6B^y(t?pHy&7YQ+1FWiM zcR~K)Wiv81e(H2t5k3NMkmMN{7zkV%?;J@oyi9)f36E;yf|Q)(_Ay~cub?0d8UGG9 zyNy#*BPM%~8**I|;62P1*}@Dji-$@SGCM{`b1b<~+5!pMdAix!kgnoX6p!mN8goj< zl$Mu6PF3$_kGm>r&!t>q_-@2~Od{Voym2Ty8!jp&VMT$s?uM&g7ud5ro08M#cxsR! z*mM0+SHi=!?Rv%W7%$RMfrnBtS$S8HhTjfZSSseJccaUNBen$*ab zIuRQBEH%bQYg47|iAhO%Gxp-#1^O-Gt(y~ps4nM9oxJyxlaC|dX8ryB3Yib~K|%-2 zKAfwFa;rabf-O=|Som^c`O~LxS>pozY;7YWqurA-)QCDiC5N(cotc5yQAZ~yU@$(X z2lgip*rwPBa$LTAS*Kgv(Zyx;a;AE>?orj-hL{fN^7{IHk&0{G;_P&xi&czBu*0IK z^xh(e25MZv0n)MAj$2{6RvEFCG99FMuFBV}e638T@yw7O_y@Rx5<~r0NQk15DS}-oKcu z^hc+iVPbi0ZEbyhU>#$k>fzfXPL7VS4gk8b&3l`VCbdA=niV?-NVrCgv7L=!+>i~l9gjo=`;GtN$20Hv9J`VxLm zSZAye&_wDgJ>nI=NH6@7zGBE-3Gd)1_=@Y01UV4~}LdU}99bA?qqa4E}Wc$-#Y zsDW^HDn+o4R6A#N8k(Bcu{fxAi))mc2(2c;ngcV^&MT{{1CEfGnCOV*h=Y%{wLDDW zm6etIW&Jz|hd+GyaI48mI;~JYKgWJ_kwBl?KR751JXQOR+kJJu#ZS`0wnw{mA;BDi z(fqr9XN!C}5)LnfIKxaWyKC2Uno_j$fW|_A=IP#2M4>a$9n}qP_X`T(&R0`%B6#C3 zG>X6-gpy=1MxHV}Ov1;HOT}EPV#U|GSHax+*R9ec_jt=JET{4u-(wt7Y)bq5$4Yf) zGgS?4P43rye$lCdbmx{G@E+@sJl(e<(GJW^RERno?Cra6#S8TD3+D>-)n=1}-^yqr zj+Iy!KP!O*HrB98DukVUjwM%)y|bgEiJb%*W>Yz9FzyJd)n?KE6nq@plQF;xS|g!d z{?b54#y1WD)7@cbt0|GC6aVjH(zl3CuiD*IBJJYp`r$)yud(513WRSTB#Z*HqWolb zpxz3ZTBrBTGONvsktGn!VV*sAMP=oBfmV+FWA<$2C+2o(#^&a+iYTHzH(lrp!e_5t zTZGN)8*_3FJtDH(KkZ^Oo?GMwFc8J7fq{V?!XB1p$J8I!)ya~z?_xCz@{H}(mcsuY zK_?8kT!>X?C=jl_Wj}xa_g29PW)2$uH4;;u5XH`~^6$KhsF17>j=%5{eu>q8Hy@rE zJtm2muC3b_sR{xgZ!yGohOoCEru{JZPEUNZ>v#BNB=^K9022n{*cqUgxGx5CNAlgmc*BG1dWY_t#d()~C&g65dwV0$EGyB?|)rCd=BjNt^!j<}yj< z4~w}>hzFk;Y{{6cAR6YIiW^kS9ovf_*DBSemyJ5L1rvSGn#ubWx z3`TjINe+`IV(qKp?Qt}bkbS-DGTeKi$3CdEPk!TL$4FWGB&KR769I5FQpK??W3%aQ zw_Hnrd(B2q)F~$rUAWGhp(VX*i!F=EFkFfG#mlq)iFB@G%`N#uI**st%v!w!9x5pm z$(wmGw}}Qx3Ir{`*pSpBwWc}LZUX>52s75VU07+j{L)dvV(=?5iuLFRv!9NYZEm>Z z@y_t7Dle-KIo65gxz8AMWkn{w|hkq{wV3i8nCt7`wl9Xs?%` z*#pY^g!w_gH$Bt6D@W=tjDKZkM34wFE~_&>`b5B#!v0zJ;}zC8b4(!I;gsr@C`e&E? z)7l&^ns1luc>erG#74%e^C5wm^oz!p+Qe`|TEx57Rz`wnY)nkLe30B)OgL{Ym3kc%<H{42odfij|()& zKRmxiyz#&|VR4MKC{MZuHs;Bb%ick&-e7#PvNnpm=XwCbB;xfrCMwcn^YQ~$JYN=w zUo$s%cNFT7T-c~^5TS+abArs>91#wh5H_&R-@W_l@L;yO0Y<^)xjWszXWuf{GUW@$mm35(4{aZhq{st2n zNHW~?t<_q&S0Clp+{|=vE770lJV-PCMqaFe!*6OjV9av|GPlp}`G2quX~w6f-r?Cq zc6^LOqW4mA(0u(+a2fT`CWS`s&ZoHd7q=l-ZUl$kprxinx%>N1c^%c3B?06sZ((@WcG%NWME7RCO3fy#QamI@6yD<^naPxY8GmpY~(2 zw6Ck5pC4=&d^Pfg$WknF28?D9=r_)MfrZY^%^eIP)%EVOy#I~3DdRo!$V-dirW008 zO$}ThJRWb>OR3IXO?$#sOiWCkIH5V)Uz4j`f8CTxIgPtL5H6IlxsiSdb z&$c|};N;Y6w}8Q36$SGyUB8wCLRnmlA$1tX@2{)Vk&6bs^9*wR=@VFv>K?+QbI zN9MSG4-E~qBhzfLEw(1J(x~&wLY`;V@!#$4)?uvzbFnwH zL2aX*1`)qzDv{dC#}?^VS6^D1^{Rpy$~jx!;t)pseRE+wF35)u@WrU$| z?s1rfh>yEF_>1F~j1nJ)hB6~MynGtTLrZDGxsk12loi%XE@OWn<3F56gS3W-OgGa? z?DQIO6I$w`Cwji-!@K6xR@Jm9@0KmbA7ci;&i~;()hUDw{4%* zq1vUHA-5~8#(Q?F>UJaPPnwTd{Kmt>6Y+XuqqaA+wiVYL+dddD_vI{UWndtkjMR|; zVMCpraj+N1vtps>6>c)D0j6^O`b>>kk%X97R@ZT7QIG=-FaI(>7LNamCHW=X%q%qUxM^)<61n@H?mKWK z&OQB4g{K)$Q)CHBoWX&uHl>DwP`HAmbyd`epPiu*1T>Tw!Ym(oGBmy(TP(z{Bq8^> z$cZE{LA6P|6Rd!c`CD$LvES{26dMUVdsB&WsMMrGg*dn@0)u0fc z(>*b2o;IsYEpmcv$)xNKyHudRNboN)WC(8rPt8#9mP&y>c5sk0Zu3GY>S=B5I~75T zg>TYnF}){|23n~xp^)JsuHmAR9$30#eNLwc4iNC2GUrC`seD;Dd zPB(ydn@^~bkqN3H4w7U)Ya_KZFjv16nSbPx#;4T+bpuU72p_90D`i9R1{U)Mpb|Ho zv7s19x=!eyJ$;sk1rkVfAS4CFY04+;54-iB(r+bX7gyi-BNS- z=F$ad8qvPw` z4Atxf+`=Hq?BOMt7Z`Y?au84C@<`G?eL9OX<0xvRA4VcaG6`J2Jh5z+JT;lId7*wo z8$J?=?2`{1nF-k*R8vH*ODAWISTS2e{K;H3|g=#v4iaaJ}!$fN?kd9e@yzW*&PFCO~`y4B@_`!!_B@D-FZdEr2baz--kZ~phoda|L z^U{r{Q3MdkK4rq=Q{yLufr5<0TfiXa|4nO|>QhC5aWSCyCiw^y=bkQl;>Qdg8gBlX z?Jla0+do3JO(c4;1yU?3P7-s~-rnBY`f!}eoxtfYy7we4TxVc4c!xod&1nL zRFqJxUAshl$pHKl_M?qB4iyIPdEGnVQCmoXD8D9)v3Kq5*G*qzPX}&%+vwlUyl=^6 z_RmuE=VAv+SEj#w1a~KIKyK}r+pV*=35~QOfU~&x&6*Z*doK3 z_xqXB20usr=iJExq>e38Q8am}`V11%#3hJy6lv$(%P}g@@9ph%!d3{X9rxxrfA}~O z-}>vI@Sk82-`SL+pXkBV3dc5CK{d43q1EqSc+1YXs;Vl7MEWz^$wc7i#CrAm^~;JT zy-t-_;LfS7a(+ud)qD(&2H$utp zq0#NW7XPs4rN2Z%mNIoY6;e&k3S!s_ zCElbK)A9AFW?Yf1?HwTniv=i|QCH6v?2ru`y*U zpPG`wMsD@VAWqqW-S7p)$Gt6h{@Peunw|Kh=PqO*;@=(CD-0Y6!<$c^K7o-R8am|a zV{6+S@Ao}&kMJ;Y(uHoCwmb#t626RZv23lRO=+@f_QUUd2_(`;m?bYsRq@lbmr&AT znKnW-1l=}fy$Et>_U?o3FRefIE$rW*b>HKH(Kp{DpiA* z?H{Vm)GV{pPGpVlp2b!qRyake2qlRz;L4BPZ5aU}0G#s9;Kb%qxh1X zUxO?|jSG~4r0pRm^B=MbZS)~j5cb5qG>UsZ>fH!Z)FG-75`Hg-f@|A<;ef-g`)9M< z4~T4pRv=i6KSR*a5Xza?OndPUk#WvBXvBMVRpn^(fwbu~DGfSD)!4R8XHs#trgx)w`eQ z=Y#K1;dD7MJF(fS#JFG-B2O}=+fLl75SJ&^=>>hc#P~=HatpZ=`htv>D zP+h+KSoao;B2()T$o6=Uynts%QBd(W-(bOVmpkbk-sLzojs%i1c$Gy!L z_~HRlo2;PU?v@Hvf6dIC#kmK_$(BqPTTOaF3_%N=S<&p&6jbvz&q3Q4v;f5JlUqm0U_R5%RWtsh2^g7lQ-EuaGJ7{wu<;jl9<1!|TC&TVi zE^6CE4%CyKJw`-C;d^0g0IyJJ@8Y6K_IGQAsGoIm4KpGC6O8=#(lPRi6|_(x zgrY8{xX&?1JI_wMy0}|_IX`dr1j-MS;9D9^f zv)hN>-nx9&;C(-)9_sa54O8@?H!Zo|T-8>D{c6&ymp`&dP(+nL2j0vpoLkG&t=7oZ zCmx7&hY~HarYEqgTRgvKa&4{J37cqbYS!#_AHoax*Gkg8oZWPg)jqHs+a|KbOah6@ zM_G4l<=O@57+i!3FPjubge?;C3RCrIB!rxq$cTGO>lRLu^C^4q4rRz3kYo$FtIdjf zy}i8Ne_UzN9gyDt;(foN;HhW<3I^z5_(!~&@Uop?z-i8+T}~SXw5|PVcm#E)K$}4i8p7DPprWK?s})pKHnM^GfCaFqFiYM19^(Rz z+sZv<^e)C?$?E#~dcB^YPz&@g8yQ)$30jE$2QgZe^P_tCMVV}&|CIv$a%uVjyW6TUl4Q?b!tIl{vbMc5iT{S$)@*Cctp% z9Wm+owN)%QmFy65ZVP#yoV=SAw04J&Y{?J5?A=Js{)gQYkB)6X3v-7&Z8Rl~0%e24 zySBC!zdGo2bHNZlc=kh;1U!=MlsA~|d7$Qw(iY?}zrGr<>{sVpdEMWCW2#TgbK%R< z($dt_RCx>416I!KG{F+kXypeM&A6rz*eD< literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/_test_template.c b/tests/src/test_cases/_test_template.c new file mode 100644 index 0000000000..722cf05dea --- /dev/null +++ b/tests/src/test_cases/_test_template.c @@ -0,0 +1,13 @@ +#include "../lvgl.h" +#if LV_BUILD_TEST + +#include "unity/unity.h" + +void test_func_1(void); + +void test_func_1(void) +{ + TEST_ASSERT_EQUAL(actual, expected); +} + +#endif diff --git a/tests/src/test_cases/test_config.c b/tests/src/test_cases/test_config.c new file mode 100644 index 0000000000..d7aa4e4e52 --- /dev/null +++ b/tests/src/test_cases/test_config.c @@ -0,0 +1,19 @@ +#include "../lvgl.h" +#if LV_BUILD_TEST + +#include "unity/unity.h" + +void test_config(void); + +void test_config(void) +{ + TEST_ASSERT_EQUAL(130, LV_DPI_DEF); + TEST_ASSERT_EQUAL(130, lv_disp_get_dpi(NULL)); + TEST_ASSERT_EQUAL(800, LV_HOR_RES); + TEST_ASSERT_EQUAL(800, lv_disp_get_hor_res(NULL)); + TEST_ASSERT_EQUAL(480, LV_VER_RES); + TEST_ASSERT_EQUAL(480, lv_disp_get_ver_res(NULL)); + TEST_ASSERT_EQUAL(32, LV_COLOR_DEPTH); +} + +#endif diff --git a/tests/src/test_cases/test_dropdown.c b/tests/src/test_cases/test_dropdown.c new file mode 100644 index 0000000000..de2e2dc822 --- /dev/null +++ b/tests/src/test_cases/test_dropdown.c @@ -0,0 +1,170 @@ +#include "../lvgl.h" +#if LV_BUILD_TEST + +#include "unity/unity.h" + +void test_dropdown_create_delete(void); +void test_dropdown_set_text_and_symbol(void); +void test_dropdown_set_options(void); +void test_dropdown_select(void); +void test_dropdown_render(void); + +void test_dropdown_create_delete(void) +{ + lv_dropdown_create(lv_scr_act()); + TEST_ASSERT_EQUAL(1, lv_obj_get_child_cnt(lv_scr_act())); + + lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act()); + lv_obj_set_pos(dd2, 200, 0); + TEST_ASSERT_EQUAL(2, lv_obj_get_child_cnt(lv_scr_act())); + TEST_ASSERT_NULL(lv_dropdown_get_list(dd2)); + lv_dropdown_open(dd2); + TEST_ASSERT_EQUAL(3, lv_obj_get_child_cnt(lv_scr_act())); + TEST_ASSERT_NOT_NULL(lv_dropdown_get_list(dd2)); + lv_dropdown_open(dd2); /*Try to pen again*/ + TEST_ASSERT_EQUAL(3, lv_obj_get_child_cnt(lv_scr_act())); + + lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act()); + lv_obj_set_pos(dd3, 400, 0); + TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act())); + lv_dropdown_open(dd3); + TEST_ASSERT_EQUAL(5, lv_obj_get_child_cnt(lv_scr_act())); + lv_dropdown_close(dd3); + TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act())); + lv_dropdown_close(dd3); /*Try to close again*/ + TEST_ASSERT_EQUAL(4, lv_obj_get_child_cnt(lv_scr_act())); + + lv_obj_del(dd2); + TEST_ASSERT_EQUAL(2, lv_obj_get_child_cnt(lv_scr_act())); + + lv_obj_clean(lv_scr_act()); + TEST_ASSERT_EQUAL(0, lv_obj_get_child_cnt(lv_scr_act())); + +} + +void test_dropdown_set_text_and_symbol(void) +{ + TEST_ASSERT_EQUAL(0, 0); +} + +void test_dropdown_set_options(void) +{ + + lv_mem_monitor_t m1; + lv_mem_monitor(&m1); + + lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act()); + TEST_ASSERT_EQUAL_STRING("Option 1\nOption 2\nOption 3", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(3, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_set_options(dd1, "a1\nb2\nc3\nd4\ne5\nf6"); + TEST_ASSERT_EQUAL_STRING("a1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(6, lv_dropdown_get_option_cnt(dd1)); + + lv_obj_set_width(dd1, 200); + lv_dropdown_open(dd1); + lv_obj_update_layout(dd1); + TEST_ASSERT_EQUAL(200, lv_obj_get_width(lv_dropdown_get_list(dd1))); + + lv_dropdown_close(dd1); + + lv_dropdown_add_option(dd1, "x0", 0); + TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(7, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_add_option(dd1, "y0", 3); + TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(8, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_add_option(dd1, "z0", LV_DROPDOWN_POS_LAST); + TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6\nz0", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(9, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_clear_options(dd1); + TEST_ASSERT_EQUAL_STRING("", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(0, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_set_options(dd1, "o1\no2"); /*Just to add some content before lv_dropdown_set_options_static*/ + + lv_dropdown_set_options_static(dd1, "a1\nb2\nc3\nd4\ne5\nf6"); + TEST_ASSERT_EQUAL_STRING("a1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(6, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_add_option(dd1, "x0", 0); + TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(7, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_add_option(dd1, "y0", 3); + TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(8, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_add_option(dd1, "z0", LV_DROPDOWN_POS_LAST); + TEST_ASSERT_EQUAL_STRING("x0\na1\nb2\ny0\nc3\nd4\ne5\nf6\nz0", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(9, lv_dropdown_get_option_cnt(dd1)); + + lv_dropdown_clear_options(dd1); + TEST_ASSERT_EQUAL_STRING("", lv_dropdown_get_options(dd1)); + TEST_ASSERT_EQUAL(0, lv_dropdown_get_option_cnt(dd1)); + + lv_obj_del(dd1); + + lv_mem_monitor_t m2; + lv_mem_monitor(&m2); + TEST_ASSERT_UINT32_WITHIN(48, m1.free_size, m2.free_size); +} + +void test_dropdown_select(void) +{ + lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act()); + lv_dropdown_set_selected(dd1, 2); + + TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1)); + + char buf[32]; + memset(buf, 0x00, sizeof(buf)); + lv_dropdown_get_selected_str(dd1, buf, sizeof(buf)); + TEST_ASSERT_EQUAL_STRING("Option 3", buf); + + memset(buf, 0x00, sizeof(buf)); + lv_dropdown_get_selected_str(dd1, buf, 4); + TEST_ASSERT_EQUAL_STRING("Opt", buf); + + /*Out of range*/ + lv_dropdown_set_selected(dd1, 3); + TEST_ASSERT_EQUAL(2, lv_dropdown_get_selected(dd1)); +} + +void test_dropdown_render(void) +{ + lv_obj_clean(lv_scr_act()); + + lv_obj_t * dd1 = lv_dropdown_create(lv_scr_act()); + lv_obj_set_pos(dd1, 10, 10); + lv_dropdown_set_selected(dd1, 1); + + lv_obj_t * dd2 = lv_dropdown_create(lv_scr_act()); + lv_obj_set_pos(dd2, 200, 10); + lv_obj_set_width(dd2, 200); + lv_dropdown_set_selected(dd2, 2); + lv_dropdown_open(dd2); + + lv_obj_t * dd3 = lv_dropdown_create(lv_scr_act()); + lv_obj_set_style_pad_hor(dd3, 5, 0); + lv_obj_set_style_pad_ver(dd3, 20, 0); + lv_obj_set_pos(dd3, 500, 150); + lv_dropdown_set_selected(dd3, 2); + lv_dropdown_set_dir(dd3, LV_DIR_LEFT); + lv_dropdown_set_symbol(dd3, LV_SYMBOL_LEFT); + lv_dropdown_set_options(dd3, "a0\na1\na2\na3\na4\na5\na6\na7\na8\na9\na10\na11\na12\na13\na14\na15\na16"); + lv_dropdown_open(dd3); + lv_dropdown_set_selected(dd3, 3); + lv_obj_t * list = lv_dropdown_get_list(dd3); + lv_obj_set_style_text_line_space(list, 5, 0); + lv_obj_set_style_bg_color(list, lv_color_hex3(0xf00), LV_PART_SELECTED | LV_STATE_CHECKED); + + + TEST_ASSERT_EQUAL_SCREENSHOT("dropdown_1.png"); +} + + +#endif diff --git a/tests/src/test_cases/test_obj_tree.c b/tests/src/test_cases/test_obj_tree.c index 0d0f8ba46a..0b4c2be9b0 100644 --- a/tests/src/test_cases/test_obj_tree.c +++ b/tests/src/test_cases/test_obj_tree.c @@ -33,7 +33,7 @@ void test_obj_tree_2(void) lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0x112233), 0); lv_obj_set_style_bg_opa(lv_scr_act(), LV_OPA_COVER, 0); - TEST_ASSERT_EQUAL_SCREENSHOT("scr1.png") + //TEST_ASSERT_EQUAL_SCREENSHOT("scr1.png") } #endif diff --git a/tests/src/test_cases/test_style.c b/tests/src/test_cases/test_style.c new file mode 100644 index 0000000000..0574a1aa5b --- /dev/null +++ b/tests/src/test_cases/test_style.c @@ -0,0 +1,13 @@ +#include "../lvgl.h" +#if LV_BUILD_TEST + +#include "unity/unity.h" + +//void test_func_1(void); + +//void test_func_1(void) +//{ +// TEST_ASSERT_EQUAL(actual, expected); +//} + +#endif diff --git a/tests/test.py b/tests/test.py index 35f623b99c..f8e6d16a43 100644 --- a/tests/test.py +++ b/tests/test.py @@ -5,6 +5,16 @@ def prepare(): os.system("rm src/test_runners/test_*_Runner.c") os.system("rm src/*.o") files = glob.glob("./src/test_cases/test_*.c") + + for index, item in enumerate(files): + if item == "./src/test_cases/test_config.c": + files.pop(index) + break + + files.insert(0, "./src/test_cases/test_config.c") + print(files) + + for f in files: r = f[:-2] + "_Runner.c" r = r.replace("/test_cases/", "/test_runners/") diff --git a/tests/unity/unity_support.c b/tests/unity/unity_support.c index 8bc8402acc..eab6209018 100644 --- a/tests/unity/unity_support.c +++ b/tests/unity/unity_support.c @@ -63,7 +63,6 @@ static void png_release(png_img_t * p); 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); @@ -86,15 +85,21 @@ bool lv_test_assert_img_eq(const char * fn_ref) int x, y, i_buf = 0; for (y = 0; y < p.height; y++) { png_byte* row = p.row_pointers[y]; + //printf("\n"); + 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; + uint32_t ref_px = 0; + uint32_t act_px = 0; + memcpy(&ref_px, ptr_ref, 3); + memcpy(&act_px, ptr_act, 3); + //printf("0xFF%06x, ", act_px); + + uint8_t act_swap[3] = {ptr_act[2], ptr_act[1], ptr_act[0]}; - if(memcmp(ptr_act, ptr_ref, 3) != 0) { + if(memcmp(act_swap, ptr_ref, 3) != 0) { err = true; break; } @@ -111,6 +116,39 @@ bool lv_test_assert_img_eq(const char * fn_ref) 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); + + FILE * f = fopen("../image_err.h", "w"); + + fprintf(f, "static const uint32_t img_data[] = {\n"); + + i_buf = 0; + for (y = 0; y < 480; y++) { + fprintf(f, "\n"); + for (x = 0; x < 800; x++) { + ptr_act = &(screen_buf[i_buf * 4]); + act_px = 0; + memcpy(&act_px, ptr_act, 3); + fprintf(f, "0xFF%06X, ", act_px); + i_buf++; + } + } + fprintf(f, "};\n\n"); + + fprintf(f, "static lv_img_dsc_t dsc = { \n" + " .header.w = 800,\n" + " .header.h = 480,\n" + " .header.always_zero = 0,\n" + " .header.cf = LV_IMG_CF_TRUE_COLOR,\n" + " .data_size = 800 * 480 * 4,\n" + " .data = img_data};\n\n" + "static inline void show_test_img_error(void)\n" + "{\n" + " lv_obj_t * img = lv_img_create(lv_scr_act());\n" + " lv_img_set_src(img, &dsc);\n" + "}\n"); + + fclose(f); + return false; }