#!/bin/bash # verify_t33.sh — 验收 T-3.3:筛选过滤逻辑(严格版) set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" FILE="$PROJECT_ROOT/frontend/src/pages/Explorer.tsx" echo "=== T-3.3 验收检查 ===" # T-3.3.1: filterModels 函数存在 if grep -q 'function filterModels' "$FILE"; then echo "filterModels PASS — filterModels 函数已定义" else echo "filterModels FAIL" exit 1 fi # T-3.3.1: 组件声明存在 if grep -q 'const ExplorerPage: React.FC = () =>' "$FILE"; then echo "ExplorerPage PASS — 组件声明存在" else echo "ExplorerPage FAIL — 缺少组件声明" exit 1 fi # T-3.3.2: filteredResults 共享变量存在 if grep -q 'const filteredResults' "$FILE"; then echo "filteredResults PASS — 过滤结果收敛为 shared variable" else echo "filteredResults FAIL" exit 1 fi # T-3.3.2: filterModels 在 JSX 中未被重复调用(只在 filteredResults 赋值处出现一次) # 允许出现 1 次(在赋值语句中),不允许在 JSX 渲染分支中出现 call_count=$(grep -c 'filterModels(getMockModels(), filters)' "$FILE" || true) if [ "$call_count" -eq 1 ]; then echo "shared-var PASS — filterModels 仅在 filteredResults 赋值处调用一次" else echo "shared-var FAIL — filterModels 调用次数: $call_count(期望 1)" exit 1 fi # T-3.3.2: filteredResults 被双视图共用(卡片和表格分支都用它) filtered_card=$(grep -c 'filteredResults.map.*card\|filteredResults.length.*card' "$FILE" || true) if grep -q 'filteredResults.length === 0' "$FILE" && \ grep -q 'filteredResults.map' "$FILE"; then echo "dual-view PASS — filteredResults 同时被空判断和渲染分支引用" else echo "dual-view FAIL" exit 1 fi echo "" echo "all PASS" exit 0