package internal import ( "strings" "testing" ) // TestSkillsListLinesViewportByLines 验证技能列表视口按行数(含描述行)收口, // 返回行数不超过 listH,避免变长行撑爆面板 func TestSkillsListLinesViewportByLines(t *testing.T) { m := NewModel() m.Skills.Loaded = true for i := 0; i < 3; i++ { m.Skills.Skills = append(m.Skills.Skills, &SkillInfo{ Name: "skill-" + strings.Repeat("x", i), Description: "描述行 " + string(rune('A'+i)), }) } m.Skills.SkillCur = 0 m.Skills.FocusPanel = 0 listH := 3 // 足够只显示部分(总共 6 行:3 技能 × 2 行) lines := m.skillsListLines(30, listH) if len(lines) > listH { t.Fatalf("skillsListLines 应返回 ≤ %d 行, got %d", listH, len(lines)) } // 光标在首个技能时,视口应从头开始且光标行可见 if !strings.Contains(lines[0], "▸") { t.Fatalf("首行应含光标标记, got %q", lines[0]) } }