68 lines
2.8 KiB
C
68 lines
2.8 KiB
C
/* meow_launcherd/test_menu_row_gap.c — 宿主验证:主界面列表模式圆角卡列表项外边距
|
||
* (item margin/gap)几何。纯整数运算,不链 SDK / 不开设备:
|
||
* gcc test_menu_row_gap.c -o test_menu_row_gap && ./test_menu_row_gap
|
||
*
|
||
* 断言集(对应「相邻 item 顶之间 = item 高 + gap」的可见形式):
|
||
* ① 相邻卡顶间距 = MENU_LIST_ROW_H(= 卡高 + gap;SDK 行距不变);
|
||
* ② 卡片间可见外距 = MENU_LIST_ROW_GAP;
|
||
* ③ 卡在其行高内上下对称内缩 → 内容(按行高垂直居中)落卡中心;
|
||
* ④ 滚动偏移只整体平移,不改变上述间距/对称。
|
||
*
|
||
* 几何公式与 patch_v2/meow_launcherd/main_menu.c 的 menu_row_card_y/menu_row_card_h 同源:
|
||
* 卡顶 = 行顶 + gap/2;卡高 = 行高 - gap。
|
||
*/
|
||
#include <stdio.h>
|
||
#include <assert.h>
|
||
|
||
#define MENU_LIST_ROW_H 60 /* 行距(SDK listview item_h,不变) */
|
||
#define MENU_LIST_ROW_GAP 8
|
||
|
||
/* 与 main_menu.c menu_row_card_y / menu_row_card_h 同源(上下对称内缩)。 */
|
||
static int menu_row_card_y(int row_top) { return row_top + MENU_LIST_ROW_GAP / 2; }
|
||
static int menu_row_card_h(int h) { return h - MENU_LIST_ROW_GAP; }
|
||
/* 行顶 = list_y + idx*item(SDK listview 布局:行距=item)。 */
|
||
static int row_top(int idx, int item, int list_y, int off) { return list_y + idx * item - off; }
|
||
|
||
int main(void)
|
||
{
|
||
const int item = MENU_LIST_ROW_H;
|
||
const int gap = MENU_LIST_ROW_GAP;
|
||
const int list_y = 100;
|
||
|
||
int y0 = menu_row_card_y(row_top(0, item, list_y, 0));
|
||
int y1 = menu_row_card_y(row_top(1, item, list_y, 0));
|
||
int h = menu_row_card_h(item);
|
||
|
||
/* ① 卡相对行顶对称内缩 gap/2;卡高=item-gap;卡高+gap=item */
|
||
assert(y0 == list_y + gap / 2);
|
||
assert(h == item - gap);
|
||
assert(h + gap == item);
|
||
|
||
/* ① 相邻卡顶间距 = item(顶到顶 = 卡高 + gap) */
|
||
assert(y1 - y0 == item);
|
||
|
||
/* ② 卡片间可见外距 = gap(卡 0 底 到 卡 1 顶) */
|
||
assert(y1 - (y0 + h) == gap);
|
||
|
||
/* ③ 卡中心 == 行中心(内容按行高居中 → 落卡中心) */
|
||
assert(y0 - gap / 2 + item / 2 == y0 + h / 2);
|
||
/* 上行底到卡底 = gap/2(下对称) */
|
||
assert((list_y + item) - (y0 + h) == gap / 2);
|
||
|
||
/* ④ 滚动偏移只平移,不改变间距/对称(任意 off) */
|
||
for (int off = 0; off <= 2 * item; off += item / 2) {
|
||
int r2 = row_top(2, item, list_y, off);
|
||
int r3 = row_top(3, item, list_y, off);
|
||
int a2 = menu_row_card_y(r2);
|
||
int a3 = menu_row_card_y(r3);
|
||
assert(a3 - a2 == item);
|
||
assert(a3 - (a2 + h) == gap);
|
||
assert(a2 - r2 == gap / 2);
|
||
assert((r2 + item) - (a2 + h) == gap / 2);
|
||
}
|
||
|
||
printf("PASS menu_row_gap=%d card_h=%d top2top=%d visible_gap=%d symmetric=1\n",
|
||
gap, h, item, gap);
|
||
return 0;
|
||
}
|