1if(ESP_PLATFORM)
2
3###################################
4# Tests do not build for ESP-IDF. #
5###################################
6
7else()
8
9cmake_minimum_required(VERSION 3.13)
10project(lvgl_tests LANGUAGES C)
11
12include(CTest)
13
14set(LVGL_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR})
15
16set(LVGL_TEST_COMMON_EXAMPLE_OPTIONS
17    -DLV_BUILD_EXAMPLES=1
18    -DLV_USE_DEMO_WIDGETS=1
19    -DLV_USE_DEMO_STRESS=1
20)
21
22set(LVGL_TEST_OPTIONS_MINIMAL_MONOCHROME
23    -DLV_COLOR_DEPTH=1
24    -DLV_MEM_SIZE=65535
25    -DLV_DPI_DEF=40
26    -DLV_DRAW_COMPLEX=0
27    -DLV_USE_METER=0
28    -DLV_USE_LOG=1
29    -DLV_USE_ASSERT_NULL=0
30    -DLV_USE_ASSERT_MALLOC=0
31    -DLV_USE_ASSERT_MEM_INTEGRITY=0
32    -DLV_USE_ASSERT_OBJ=0
33    -DLV_USE_ASSERT_STYLE=0
34    -DLV_USE_USER_DATA=0
35    -DLV_FONT_UNSCII_8=1
36    -DLV_USE_BIDI=0
37    -DLV_USE_ARABIC_PERSIAN_CHARS=0
38    -DLV_BUILD_EXAMPLES=1
39    -DLV_FONT_DEFAULT=&lv_font_montserrat_14
40    -DLV_USE_PNG=1
41    -DLV_USE_BMP=1
42    -DLV_USE_GIF=1
43    -DLV_USE_QRCODE=1
44)
45
46set(LVGL_TEST_OPTIONS_NORMAL_8BIT
47    -DLV_COLOR_DEPTH=8
48    -DLV_MEM_SIZE=65535
49    -DLV_DPI_DEF=40
50    -DLV_DRAW_COMPLEX=1
51    -DLV_USE_LOG=1
52    -DLV_USE_ASSERT_NULL=0
53    -DLV_USE_ASSERT_MALLOC=0
54    -DLV_USE_ASSERT_MEM_INTEGRITY=0
55    -DLV_USE_ASSERT_OBJ=0
56    -DLV_USE_ASSERT_STYLE=0
57    -DLV_USE_USER_DATA=1
58    -DLV_FONT_UNSCII_8=1
59    -DLV_USE_FONT_SUBPX=1
60    -DLV_USE_BIDI=0
61    -DLV_USE_ARABIC_PERSIAN_CHARS=0
62    ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
63    -DLV_FONT_DEFAULT=&lv_font_montserrat_14
64    -DLV_USE_PNG=1
65    -DLV_USE_BMP=1
66    -DLV_USE_SJPG=1
67    -DLV_USE_GIF=1
68    -DLV_USE_QRCODE=1
69)
70
71set(LVGL_TEST_OPTIONS_16BIT
72    -DLV_COLOR_DEPTH=16
73    -DLV_COLOR_16_SWAP=0
74    -DLV_MEM_SIZE=65536
75    -DLV_DPI_DEF=40
76    -DLV_DRAW_COMPLEX=1
77    -DLV_DITHER_GRADIENT=1
78    -DLV_USE_LOG=1
79    -DLV_USE_ASSERT_NULL=0
80    -DLV_USE_ASSERT_MALLOC=0
81    -DLV_USE_ASSERT_MEM_INTEGRITY=0
82    -DLV_USE_ASSERT_OBJ=0
83    -DLV_USE_ASSERT_STYLE=0
84    -DLV_USE_USER_DATA=1
85    -DLV_FONT_UNSCII_8=1
86    -DLV_USE_FONT_SUBPX=1
87    -DLV_USE_BIDI=0
88    -DLV_USE_ARABIC_PERSIAN_CHARS=0
89    ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
90    -DLV_FONT_DEFAULT=&lv_font_montserrat_14
91    -DLV_USE_PNG=1
92    -DLV_USE_BMP=1
93    -DLV_USE_SJPG=1
94    -DLV_USE_GIF=1
95    -DLV_USE_QRCODE=1
96)
97
98set(LVGL_TEST_OPTIONS_16BIT_SWAP
99    -DLV_COLOR_DEPTH=16
100    -DLV_COLOR_16_SWAP=1
101    -DLV_MEM_SIZE=65536
102    -DLV_DPI_DEF=40
103    -DLV_DRAW_COMPLEX=1
104    -DLV_DITHER_GRADIENT=1
105    -DLV_DITHER_ERROR_DIFFUSION=1
106    -DLV_GRAD_CACHE_DEF_SIZE=8*1024
107    -DLV_USE_LOG=1
108    -DLV_USE_ASSERT_NULL=0
109    -DLV_USE_ASSERT_MALLOC=0
110    -DLV_USE_ASSERT_MEM_INTEGRITY=0
111    -DLV_USE_ASSERT_OBJ=0
112    -DLV_USE_ASSERT_STYLE=0
113    -DLV_USE_USER_DATA=1
114    -DLV_FONT_UNSCII_8=1
115    -DLV_USE_FONT_SUBPX=1
116    -DLV_USE_BIDI=0
117    -DLV_USE_ARABIC_PERSIAN_CHARS=0
118    ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
119    -DLV_FONT_DEFAULT=&lv_font_montserrat_14
120    -DLV_USE_PNG=1
121    -DLV_USE_BMP=1
122    -DLV_USE_SJPG=1
123    -DLV_USE_GIF=1
124    -DLV_USE_QRCODE=1
125)
126
127set(LVGL_TEST_OPTIONS_FULL_32BIT
128    -DLV_COLOR_DEPTH=32
129    -DLV_MEM_SIZE=8388608
130    -DLV_DPI_DEF=160
131    -DLV_DRAW_COMPLEX=1
132    -DLV_SHADOW_CACHE_SIZE=1
133    -DLV_IMG_CACHE_DEF_SIZE=32
134    -DLV_USE_LOG=1
135    -DLV_LOG_LEVEL=LV_LOG_LEVEL_TRACE
136    -DLV_LOG_PRINTF=1
137    -DLV_USE_FONT_SUBPX=1
138    -DLV_FONT_SUBPX_BGR=1
139    -DLV_USE_PERF_MONITOR=1
140    -DLV_USE_ASSERT_NULL=1
141    -DLV_USE_ASSERT_MALLOC=1
142    -DLV_USE_ASSERT_MEM_INTEGRITY=1
143    -DLV_USE_ASSERT_OBJ=1
144    -DLV_USE_ASSERT_STYLE=1
145    -DLV_USE_USER_DATA=1
146    -DLV_USE_LARGE_COORD=1
147    -DLV_FONT_MONTSERRAT_8=1
148    -DLV_FONT_MONTSERRAT_10=1
149    -DLV_FONT_MONTSERRAT_12=1
150    -DLV_FONT_MONTSERRAT_14=1
151    -DLV_FONT_MONTSERRAT_16=1
152    -DLV_FONT_MONTSERRAT_18=1
153    -DLV_FONT_MONTSERRAT_20=1
154    -DLV_FONT_MONTSERRAT_22=1
155    -DLV_FONT_MONTSERRAT_24=1
156    -DLV_FONT_MONTSERRAT_26=1
157    -DLV_FONT_MONTSERRAT_28=1
158    -DLV_FONT_MONTSERRAT_30=1
159    -DLV_FONT_MONTSERRAT_32=1
160    -DLV_FONT_MONTSERRAT_34=1
161    -DLV_FONT_MONTSERRAT_36=1
162    -DLV_FONT_MONTSERRAT_38=1
163    -DLV_FONT_MONTSERRAT_40=1
164    -DLV_FONT_MONTSERRAT_42=1
165    -DLV_FONT_MONTSERRAT_44=1
166    -DLV_FONT_MONTSERRAT_46=1
167    -DLV_FONT_MONTSERRAT_48=1
168    -DLV_FONT_MONTSERRAT_12_SUBPX=1
169    -DLV_FONT_MONTSERRAT_28_COMPRESSED=1
170    -DLV_FONT_DEJAVU_16_PERSIAN_HEBREW=1
171    -DLV_FONT_SIMSUN_16_CJK=1
172    -DLV_FONT_UNSCII_8=1
173    -DLV_FONT_UNSCII_16=1
174    -DLV_FONT_FMT_TXT_LARGE=1
175    -DLV_USE_FONT_COMPRESSED=1
176    -DLV_USE_BIDI=1
177    -DLV_USE_ARABIC_PERSIAN_CHARS=1
178    -DLV_USE_PERF_MONITOR=1
179    -DLV_USE_MEM_MONITOR=1
180    -DLV_LABEL_TEXT_SELECTION=1
181    ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
182    -DLV_FONT_DEFAULT=&lv_font_montserrat_24
183    -DLV_USE_FS_STDIO=1
184    -DLV_FS_STDIO_LETTER='A'
185    -DLV_USE_FS_POSIX=1
186    -DLV_FS_POSIX_LETTER='B'
187    -DLV_USE_PNG=1
188    -DLV_USE_BMP=1
189    -DLV_USE_SJPG=1
190    -DLV_USE_GIF=1
191    -DLV_USE_QRCODE=1
192    -DLV_USE_FRAGMENT=1
193    -DLV_USE_IMGFONT=1
194    -DLV_USE_MSG=1
195)
196
197set(LVGL_TEST_OPTIONS_TEST_COMMON
198    --coverage
199    -DLV_COLOR_DEPTH=32
200    -DLV_MEM_SIZE=2097152
201    -DLV_SHADOW_CACHE_SIZE=10240
202    -DLV_IMG_CACHE_DEF_SIZE=32
203    -DLV_DITHER_GRADIENT=1
204    -DLV_DITHER_ERROR_DIFFUSION=1
205    -DLV_GRAD_CACHE_DEF_SIZE=8*1024
206    -DLV_USE_LOG=1
207    -DLV_LOG_PRINTF=1
208    -DLV_USE_FONT_SUBPX=1
209    -DLV_FONT_SUBPX_BGR=1
210    -DLV_USE_ASSERT_NULL=0
211    -DLV_USE_ASSERT_MALLOC=0
212    -DLV_USE_ASSERT_MEM_INTEGRITY=0
213    -DLV_USE_ASSERT_OBJ=0
214    -DLV_USE_ASSERT_STYLE=0
215    -DLV_USE_USER_DATA=1
216    -DLV_USE_LARGE_COORD=1
217    -DLV_FONT_MONTSERRAT_14=1
218    -DLV_FONT_MONTSERRAT_16=1
219    -DLV_FONT_MONTSERRAT_18=1
220    -DLV_FONT_MONTSERRAT_24=1
221    -DLV_FONT_MONTSERRAT_48=1
222    -DLV_FONT_MONTSERRAT_12_SUBPX=1
223    -DLV_FONT_MONTSERRAT_28_COMPRESSED=1
224    -DLV_FONT_DEJAVU_16_PERSIAN_HEBREW=1
225    -DLV_FONT_SIMSUN_16_CJK=1
226    -DLV_FONT_UNSCII_8=1
227    -DLV_FONT_UNSCII_16=1
228    -DLV_FONT_FMT_TXT_LARGE=1
229    -DLV_USE_FONT_COMPRESSED=1
230    -DLV_USE_BIDI=1
231    -DLV_USE_ARABIC_PERSIAN_CHARS=1
232    -DLV_LABEL_TEXT_SELECTION=1
233    -DLV_USE_FS_STDIO=1
234    -DLV_FS_STDIO_LETTER='A'
235    -DLV_FS_STDIO_CACHE_SIZE=100
236    -DLV_USE_FS_POSIX=1
237    -DLV_FS_POSIX_LETTER='B'
238    -DLV_FS_POSIX_CACHE_SIZE=0
239    ${LVGL_TEST_COMMON_EXAMPLE_OPTIONS}
240    -DLV_FONT_DEFAULT=&lv_font_montserrat_14
241    -Wno-unused-but-set-variable # unused variables are common in the dual-heap arrangement
242    -Wno-unused-variable
243)
244
245set(LVGL_TEST_OPTIONS_TEST_SYSHEAP
246    ${LVGL_TEST_OPTIONS_TEST_COMMON}
247    -DLVGL_CI_USING_SYS_HEAP
248    -DLV_MEM_CUSTOM=1
249    -fsanitize=address
250)
251
252set(LVGL_TEST_OPTIONS_TEST_DEFHEAP
253    ${LVGL_TEST_OPTIONS_TEST_COMMON}
254    -DLVGL_CI_USING_DEF_HEAP
255    -DLV_MEM_SIZE=2097152
256    -fsanitize=address
257)
258
259if (OPTIONS_MINIMAL_MONOCHROME)
260    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_MINIMAL_MONOCHROME})
261elseif (OPTIONS_NORMAL_8BIT)
262    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_NORMAL_8BIT})
263elseif (OPTIONS_16BIT)
264    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_16BIT})
265elseif (OPTIONS_16BIT_SWAP)
266    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_16BIT_SWAP})
267elseif (OPTIONS_FULL_32BIT)
268    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_FULL_32BIT})
269elseif (OPTIONS_TEST_SYSHEAP)
270    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_SYSHEAP})
271    set (TEST_LIBS --coverage -fsanitize=address)
272elseif (OPTIONS_TEST_DEFHEAP)
273    set (BUILD_OPTIONS ${LVGL_TEST_OPTIONS_TEST_DEFHEAP})
274    set (TEST_LIBS --coverage -fsanitize=address)
275else()
276    message(FATAL_ERROR "Must provide a known options value (check main.py?).")
277endif()
278
279# Options lvgl and examples are compiled with.
280set(COMPILE_OPTIONS
281    -DLV_CONF_PATH=${LVGL_TEST_DIR}/src/lv_test_conf.h
282    -DLV_BUILD_TEST
283    -pedantic-errors
284    -Wall
285    -Wclobbered
286    -Wdeprecated
287    -Wdouble-promotion
288    -Wempty-body
289    -Werror
290    -Wextra
291    -Wformat-security
292    -Wmaybe-uninitialized
293    -Wmissing-prototypes
294    -Wpointer-arith
295    -Wmultichar
296    -Wno-discarded-qualifiers
297    -Wpedantic
298    -Wreturn-type
299    -Wshadow
300    -Wshift-negative-value
301    -Wsizeof-pointer-memaccess
302    -Wstack-usage=5000
303    -Wtype-limits
304    -Wundef
305    -Wuninitialized
306    -Wunreachable-code
307    ${BUILD_OPTIONS}
308)
309
310# Options test cases are compiled with.
311set(LVGL_TESTFILE_COMPILE_OPTIONS
312    ${COMPILE_OPTIONS}
313    -Wno-missing-prototypes
314)
315
316get_filename_component(LVGL_DIR ${LVGL_TEST_DIR} DIRECTORY)
317
318# Include lvgl project file.
319include(${LVGL_DIR}/CMakeLists.txt)
320target_compile_options(lvgl PUBLIC ${COMPILE_OPTIONS})
321target_compile_options(lvgl_examples PUBLIC ${COMPILE_OPTIONS})
322
323
324set(TEST_INCLUDE_DIRS
325    $<BUILD_INTERFACE:${LVGL_TEST_DIR}/src>
326    $<BUILD_INTERFACE:${LVGL_TEST_DIR}/unity>
327    $<BUILD_INTERFACE:${LVGL_TEST_DIR}>
328)
329
330add_library(test_common
331    STATIC
332        src/lv_test_indev.c
333        src/lv_test_init.c
334        src/test_fonts/font_1.c
335        src/test_fonts/font_2.c
336        src/test_fonts/font_3.c
337        src/test_fonts/ubuntu_font.c
338        unity/unity_support.c
339        unity/unity.c
340)
341target_include_directories(test_common PUBLIC ${TEST_INCLUDE_DIRS})
342target_compile_options(test_common PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS})
343
344# Some examples `#include "lvgl/lvgl.h"` - which is a path which is not
345# in this source repository. If this repo is in a directory names 'lvgl'
346# then we can add our parent directory to the include path.
347# TODO: This is not good practice and should be fixed.
348get_filename_component(LVGL_PARENT_DIR ${LVGL_DIR} DIRECTORY)
349target_include_directories(lvgl_examples PUBLIC $<BUILD_INTERFACE:${LVGL_PARENT_DIR}>)
350
351# Generate one test executable for each source file pair.
352# The sources in src/test_runners is auto-generated, the
353# sources in src/test_cases is the actual test case.
354file( GLOB TEST_CASE_FILES src/test_cases/*.c )
355foreach( test_case_fname ${TEST_CASE_FILES} )
356    # If test file is foo/bar/baz.c then test_name is "baz".
357    get_filename_component(test_name ${test_case_fname} NAME_WLE)
358    if (${test_name} STREQUAL "_test_template")
359        continue()
360    endif()
361    # Create path to auto-generated source file.
362    set(test_runner_fname src/test_runners/${test_name}_Runner.c)
363    add_executable( ${test_name}
364        ${test_case_fname}
365        ${test_runner_fname}
366    )
367    target_link_libraries(${test_name} test_common lvgl_examples lvgl_demos lvgl png m ${TEST_LIBS})
368    target_include_directories(${test_name} PUBLIC ${TEST_INCLUDE_DIRS})
369    target_compile_options(${test_name} PUBLIC ${LVGL_TESTFILE_COMPILE_OPTIONS})
370
371    add_test(
372        NAME ${test_name}
373        WORKING_DIRECTORY ${LVGL_TEST_DIR}
374        COMMAND ${test_name})
375endforeach( test_case_fname ${TEST_CASE_FILES} )
376
377endif()
378