diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 000000000..56c9223b9 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,58 @@ +# Tests for LVGL + +The tests in the folder can be run locally and automatically by GitHub CI. + +## Running locally + +### Requirements (Linux) +1. Be sure GCC and Python3 is installed. +2. Install [gcovr](https://gcovr.com/en/stable/index.html) with `pip install gcovr` +3. Install Ruby with `sudo apt-get install ruby-full` + +### Run test +1. Enter `lvgl/tests/` +2. Run the tests with `./main.py [OPTIONS]`. The options are + - `report` Create a html page in the `report` folder with the coverage report. + - `test` Build and run only test. Without this option LVGL will be built with various configurations. + - `noclean` Do not clean the project before building. Useful while writing test to save some times. + +For example: +- `./main.py` Run all the test as they run in the CI. +- `./main.py report test noclean` Run only the test, should be sued when writing tests. + + +## Running automatically +TODO + +GitHub's CI automatically runs these tests on pushes and pull requests to `master` and `releasev8.*` branches. + +## Directory structure +- `src` Source files of the tests + - `test_cases` The written tests, + - `test_runners` Generated automatically from the files in `test_cases`. + - other miscellaneous files and folders +- `ref_imgs` - Reference images for screenshot compare +- `report` - Coverage report. Generated if the `report` flag was passed to `./main.py` +- `unity` Source files of the test engine + +## Add new tests + +### Create new test file +New test needs to be added into the `src/test_cases` folder. The name of the files should look like `test_.c`. The the basic skeleton of a test file copy `_test_template.c`. + +### Asserts +See the list of asserts [here](https://github.com/ThrowTheSwitch/Unity/blob/master/docs/UnityAssertionsReference.md). + +There are some custom, LVGL specific asserts: +- `TEST_ASSERT_EQUAL_SCREENSHOT("image1.png")` Render the active screen and compare its content with an image in the `ref_imgs` folder. +If the compare fails `lvgl/test_screenshot_error.h` is created with the content of the frame buffer as an image. +To see the that image `#include "test_screenshot_error.h"` and call `test_screenshot_error_show();`. +- `TEST_ASSERT_EQUAL_COLOR(color1, color2)` Compare two colors. + +### Adding new reference images +The reference images can be taken by copy-pasting the test code in to LVGL simulator and saving the screen. +LVGL needs to +- 800x480 resolution +- 32 bit color depth +- `LV_USE_PERF_MONITOR` and `LV_USE_MEM_MONITOR` disabled +- use the default theme, with the default color (don't set a theme manually) diff --git a/tests/unity/unity_support.c b/tests/unity/unity_support.c index eab620901..cceefba14 100644 --- a/tests/unity/unity_support.c +++ b/tests/unity/unity_support.c @@ -117,9 +117,9 @@ bool lv_test_assert_img_eq(const char * fn_ref) 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"); + FILE * f = fopen("../test_screenshot_error.h", "w"); - fprintf(f, "static const uint32_t img_data[] = {\n"); + fprintf(f, "static const uint32_t test_screenshot_error_data[] = {\n"); i_buf = 0; for (y = 0; y < 480; y++) { @@ -134,17 +134,17 @@ bool lv_test_assert_img_eq(const char * fn_ref) } fprintf(f, "};\n\n"); - fprintf(f, "static lv_img_dsc_t dsc = { \n" + fprintf(f, "static lv_img_dsc_t test_screenshot_error_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" + " .data = test_screenshot_error_data};\n\n" + "static inline void test_screenshot_error_show(void)\n" "{\n" " lv_obj_t * img = lv_img_create(lv_scr_act());\n" - " lv_img_set_src(img, &dsc);\n" + " lv_img_set_src(img, &test_screenshot_error_dsc);\n" "}\n"); fclose(f);