合并:重复地点不再反复判「备份新增」,到访的活动改按身份比
- DiffPlaces 的 byCoord/byName 改为多值索引 + take() 逐条认领未用项:真机一个坐标下会有 多条同名同坐标的地点(实测「柳州站」3 条),单槽位时同一坐标最多只配上 2 条,第 3 条 永远判「备份新增」⇒ 每次合并都再插一条重复地点、差异永远归不了零(实测 368→438→439)。 修完:地点新增 70→67、合并后再比对归零、再点合并直接「没有要写入的改动」。 - 到访的「活动」由按名称比改为按身份(ZUID_)比,两边都缺 UUID 才退回名称:16 个活动改名 曾把 355 条到访全变成同因冲突,且逐条选「用实机」只写回 activity_id(映射回同一个活动) 改不掉名字。loadStoredVisits 为此多 JOIN 一次 entity_raw 取 ZACTIVITY.ZUID_。 - 回归用例 4 条(重复地点一一配上、活动改名不算冲突、换活动仍要报、缺 UUID 退回名称)+ 「合并后地点差异归零」断言 3 处;两处改动都做过变异验证。 - 实测(09-28 备份并进 09-14 数据集):到访冲突 253→6,合并两次地点数 438→439 变为 435→435。
This commit is contained in:
@@ -62,16 +62,22 @@ func previewBackupToken(t *testing.T, f *movementFixture, path string) (string,
|
||||
}
|
||||
|
||||
// visitCounts 从概览表里取出「到访」那一行的 (备份新增, 仅站内有, 冲突)。
|
||||
// 不能全页 Contains 数字——地点行也有同样的 data-label,会张冠李戴。
|
||||
func visitCounts(t *testing.T, page string) (added, gone, clash int) {
|
||||
t.Helper()
|
||||
row := regexp.MustCompile(`(?s)<td>到访</td>(.*?)</tr>`).FindStringSubmatch(page)
|
||||
return overviewCounts(t, page, "到访")
|
||||
}
|
||||
|
||||
// overviewCounts 取概览表里任意一行(到访 / 地点 / 活动类型)的三个计数。
|
||||
// 不能全页 Contains 数字——三行有同样的 data-label,会张冠李戴。
|
||||
func overviewCounts(t *testing.T, page, label string) (added, gone, clash int) {
|
||||
t.Helper()
|
||||
row := regexp.MustCompile(`(?s)<td>` + label + `</td>(.*?)</tr>`).FindStringSubmatch(page)
|
||||
if row == nil {
|
||||
t.Fatal("概览表里找不到「到访」行")
|
||||
t.Fatalf("概览表里找不到「%s」行", label)
|
||||
}
|
||||
nums := regexp.MustCompile(`data-label="(备份新增|仅站内有|冲突)">(\d+)<`).FindAllStringSubmatch(row[1], -1)
|
||||
if len(nums) != 3 {
|
||||
t.Fatalf("到访行应有三个计数,实际 %d", len(nums))
|
||||
t.Fatalf("「%s」行应有三个计数,实际 %d", label, len(nums))
|
||||
}
|
||||
for _, n := range nums {
|
||||
v, _ := strconv.Atoi(n[2])
|
||||
@@ -121,12 +127,20 @@ func (f *movementFixture) shiftSrcPKs(t *testing.T, delta int) {
|
||||
//
|
||||
// 只断言到访,不断言「完全一致」整句:导入后站点会反查补全地点(改名称/地址),
|
||||
// 地点层面因此真的存在差异,那是预期行为,不该由这个用例来管。
|
||||
//
|
||||
// 但**「备份新增」必须是 0**:导入就是把备份的地点一条一条写进去的(含同名同坐标的重复项),
|
||||
// 比对再认不出它们就会每次都判「多出来一条」⇒ 合并时反复插重复地点。真机备份里
|
||||
// 「柳州站」在同一个坐标上有 3 条,正是这个形状。
|
||||
func TestBackupDiffIdentical(t *testing.T) {
|
||||
f := newMovementFixture(t)
|
||||
page := previewBackup(t, f, f.src)
|
||||
if a, g, c := visitCounts(t, page); a != 0 || g != 0 || c != 0 {
|
||||
t.Fatalf("同一份备份的到访不该有差异: 新增 %d 仅站内有 %d 冲突 %d", a, g, c)
|
||||
}
|
||||
if a, g, _ := overviewCounts(t, page, "地点"); a != 0 || g != 0 {
|
||||
t.Fatalf("刚导入就到比对,地点不该有新增或仅站内有: 新增 %d 仅站内有 %d"+
|
||||
"(同名同坐标的重复地点没被一一配上)", a, g)
|
||||
}
|
||||
}
|
||||
|
||||
// 编号全被平移后(= 数据来自另一份重排过 Z_PK 的备份),同一份内容再比一次仍须零差异。
|
||||
|
||||
Reference in New Issue
Block a user