== BlutterPick 回归 ==

1) Dart 版本解析
  [PASS] majorMinor(3.10.1) = 3.10
  [PASS] majorMinor 容忍后缀 3.4.2-0.1.pre -> 3.4
  [PASS] majorMinor(null) = null
  [PASS] majorMinor(abc) = null
  [PASS] patchOf(3.10.1) = 1
  [PASS] patchOf(3.6.1) = 1

2) 文件名解析（与 Blutter GUI 同规则）
  [PASS] libblutter_3_10.so -> 3.10 无 tag
  [PASS] libblutter_3_0_90.so -> 3.0 tag=90
  [PASS] libblutter.so 不匹配（被跳过）
  [PASS] libr_core.so 不匹配
  [PASS] libr2.so 不匹配

3) 候选排序
  [PASS] Dart 3.10.1 -> libblutter_3_10.so
  [PASS] Dart 2.16.2 -> libblutter_2_16.so
  [PASS] Dart 3.0.3 同时给出 3_0_90 / 3_0_aa 两个候选
  [PASS] 目标比内置新（3.13）-> 退到同 major 最高 3.12
  [PASS] 目标 major 更高（4.0）-> 无可信候选，返回 null
  [PASS] 目标 major 过低（1.0）-> 返回 null
  [PASS] available 数量 = 20 且按版本降序

4) 读二进制内嵌的真实 Dart 版本（文件名会骗人）
  [PASS] libblutter_3_10.so 内嵌版本 = 3.10.0
  [PASS] libblutter_3_6.so 内嵌版本 = 3.6.1
  [PASS] libblutter_3_0_90.so 内嵌版本 = 3.0.3
  [PASS] libblutter_3_0_aa.so 内嵌版本 = 3.0.0
  [PASS] libblutter_2_14.so 内嵌版本 = 2.14.0
  [PASS] libblutter_3_12.so 内嵌版本 = 3.12.0
  [PASS] 3.6.1 的候选首位是 libblutter_3_6.so

PASS: 25 / 25  (全绿)
