acid-drop/lib/lvgl/tests/src/test_cases/test_table.c

248 lines
8.1 KiB
C

#if LV_BUILD_TEST
#include "../lvgl.h"
#include "unity/unity.h"
static lv_obj_t * scr = NULL;
static lv_obj_t * table = NULL;
void setUp(void)
{
scr = lv_scr_act();
table = lv_table_create(scr);
}
void tearDown(void)
{
lv_obj_clean(lv_scr_act());
}
void test_table_should_return_assigned_cell_value(void)
{
uint16_t row = 0;
uint16_t column = 0;
const char * value = "LVGL";
lv_table_set_cell_value(table, row, column, value);
TEST_ASSERT_EQUAL_STRING(value, lv_table_get_cell_value(table, row, column));
}
void test_table_should_grow_columns_automatically_when_setting_formatted_cell_value(void)
{
/* Newly created tables have 1 column and 1 row */
uint16_t original_column_count = lv_table_get_col_cnt(table);
TEST_ASSERT_EQUAL_UINT16(1, original_column_count);
/* Table currently only has a cell at 0,0 (row, colum) */
lv_table_set_cell_value_fmt(table, 0, 1, "LVGL %s", "Rocks!");
/* Table now should have cells at 0,0 and 0,1, so 2 columns */
uint16_t expected_column_count = original_column_count + 1;
TEST_ASSERT_EQUAL_UINT16(expected_column_count, lv_table_get_col_cnt(table));
}
void test_table_should_identify_cell_with_ctrl(void)
{
bool has_ctrl = false;
has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
TEST_ASSERT_FALSE(has_ctrl);
lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
TEST_ASSERT_TRUE(has_ctrl);
}
void test_table_should_clear_selected_cell_ctrl(void)
{
bool has_ctrl = false;
lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
TEST_ASSERT_TRUE(has_ctrl);
lv_table_clear_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
TEST_ASSERT_FALSE(has_ctrl);
}
void test_table_should_keep_not_selected_cell_ctrl(void)
{
bool has_ctrl = false;
lv_table_add_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT | LV_TABLE_CELL_CTRL_TEXT_CROP);
lv_table_clear_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
TEST_ASSERT_FALSE(has_ctrl);
has_ctrl = lv_table_has_cell_ctrl(table, 0, 0, LV_TABLE_CELL_CTRL_TEXT_CROP);
TEST_ASSERT_TRUE(has_ctrl);
}
/* We're using a newly created table */
void test_table_cell_value_should_return_empty_string_when_cell_is_empty(void)
{
TEST_ASSERT_EQUAL_STRING("", lv_table_get_cell_value(table, 0, 0));
}
void test_table_row_height_should_increase_with_multiline_cell_value(void)
{
lv_table_t * table_ptr = (lv_table_t *) table;
const char * singleline_value = "LVGL";
const char * multiline_value = "LVGL\nRocks";
lv_table_set_cell_value(table, 0, 0, singleline_value);
lv_coord_t singleline_row_height = table_ptr->row_h[0];
lv_table_set_cell_value(table, 0, 0, multiline_value);
lv_coord_t multiline_row_height = table_ptr->row_h[0];
TEST_ASSERT_GREATER_THAN(singleline_row_height, multiline_row_height);
}
void test_table_should_wrap_long_texts(void)
{
lv_table_t * table_ptr = (lv_table_t *) table;
const char * long_text = "Testing automatic text wrap with a very long text";
const char * small_text = "Hi";
lv_table_set_col_width(table, 0, 50);
lv_table_set_cell_value(table, 0, 0, small_text);
lv_coord_t row_height = table_ptr->row_h[0];
lv_table_set_cell_value(table, 0, 0, long_text);
lv_coord_t wrapped_row_height = table_ptr->row_h[0];
/* Row height on cells with wrapped text is bigger than cells with small texts */
TEST_ASSERT_GREATER_THAN(row_height, wrapped_row_height);
}
static void draw_part_event_cb(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);
lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
/*If the cells are drawn...*/
if(dsc->part == LV_PART_ITEMS) {
uint32_t row = dsc->id / lv_table_get_col_cnt(obj);
uint32_t col = dsc->id - row * lv_table_get_col_cnt(obj);
/*Make the texts in the first cell center aligned*/
if(row == 0) {
dsc->label_dsc->align = LV_TEXT_ALIGN_CENTER;
dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_BLUE), dsc->rect_dsc->bg_color, LV_OPA_40);
dsc->rect_dsc->bg_opa = LV_OPA_COVER;
}
/*In the first column align the texts to the right*/
else if(col == 0) {
dsc->label_dsc->align = LV_TEXT_ALIGN_RIGHT;
}
/*Make every 2nd row grayish*/
if(row != 0 && (row % 2 == 0)) {
dsc->rect_dsc->bg_color = lv_color_mix(lv_palette_main(LV_PALETTE_RED), dsc->rect_dsc->bg_color, LV_OPA_30);
dsc->rect_dsc->bg_opa = LV_OPA_COVER;
}
}
}
void test_table_rendering(void)
{
lv_obj_center(table);
lv_obj_add_event_cb(table, draw_part_event_cb, LV_EVENT_DRAW_PART_BEGIN, NULL);
lv_obj_set_style_border_side(table, LV_BORDER_SIDE_FULL, LV_PART_ITEMS);
lv_obj_set_style_pad_all(table, 10, LV_PART_ITEMS);
lv_obj_set_style_border_width(table, 5, LV_PART_ITEMS);
lv_table_set_col_cnt(table, 5);
lv_table_set_row_cnt(table, 5);
lv_table_set_col_width(table, 1, 60);
lv_table_set_col_width(table, 2, 100);
lv_table_add_cell_ctrl(table, 0, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, 0, 1, "2 cells are merged");
lv_table_add_cell_ctrl(table, 1, 0, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_add_cell_ctrl(table, 1, 1, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_add_cell_ctrl(table, 1, 2, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_add_cell_ctrl(table, 1, 3, LV_TABLE_CELL_CTRL_MERGE_RIGHT);
lv_table_set_cell_value(table, 1, 0, "5 cells are merged");
uint32_t i;
for(i = 0; i < 5; i++) {
lv_table_set_cell_value_fmt(table, 3, i, "%d", i);
}
lv_table_set_cell_value_fmt(table, 2, 3, "Multi\nline text");
lv_table_set_cell_value_fmt(table, 2, 4, "Very long text wrapped automatically");
lv_table_add_cell_ctrl(table, 4, 3, LV_TABLE_CELL_CTRL_TEXT_CROP);
lv_table_set_cell_value_fmt(table, 4, 3, "crop crop crop crop crop crop crop crop ");
TEST_ASSERT_EQUAL_SCREENSHOT("table_1.png");
}
/* See #3120 for context */
void test_table_should_reduce_cells(void)
{
const uint16_t initial_col_num = 8;
const uint16_t initial_row_num = 1;
const uint16_t final_col_num = 4;
const uint16_t final_row_num = 1;
lv_obj_center(table);
lv_table_set_col_cnt(table, initial_col_num);
lv_table_set_row_cnt(table, initial_row_num);
uint32_t row_idx, col_idx;
for(row_idx = 0; row_idx < initial_row_num; row_idx++) {
for(col_idx = 0; col_idx < initial_col_num; col_idx++) {
lv_table_set_cell_value(table, row_idx, col_idx, "00");
}
}
lv_table_set_col_cnt(table, final_col_num);
lv_table_set_row_cnt(table, final_row_num);
for(row_idx = 0; row_idx < final_row_num; row_idx++) {
for(col_idx = 0; col_idx < final_col_num; col_idx++) {
lv_table_set_cell_value(table, row_idx, col_idx, "00");
}
}
}
/* See #3120 for context */
void test_table_should_reduce_cells_with_more_than_one_row(void)
{
const uint16_t initial_col_num = 8;
const uint16_t initial_row_num = 2;
const uint16_t final_col_num = 4;
const uint16_t final_row_num = 1;
lv_obj_center(table);
lv_table_set_col_cnt(table, initial_col_num);
lv_table_set_row_cnt(table, initial_row_num);
uint32_t row_idx, col_idx;
for(row_idx = 0; row_idx < initial_row_num; row_idx++) {
for(col_idx = 0; col_idx < initial_col_num; col_idx++) {
lv_table_set_cell_value(table, row_idx, col_idx, "00");
}
}
lv_table_set_col_cnt(table, final_col_num);
lv_table_set_row_cnt(table, final_row_num);
for(row_idx = 0; row_idx < final_row_num; row_idx++) {
for(col_idx = 0; col_idx < final_col_num; col_idx++) {
lv_table_set_cell_value(table, row_idx, col_idx, "00");
}
}
}
#endif