package fog import ( "crypto/md5" "fmt" "testing" ) // 瓦片编号 0..9 是合法的(tx=0, ty=0 那块就是 0),编码/解码都必须能往返。 func TestTileNameRoundtripAllIDs(t *testing.T) { for _, id := range []int{0, 1, 5, 9, 10, 11, 99, 100, 511, 512, 262143, 1 << 20} { name := tileName(id) got, ok := tileIDFromName(name) if !ok || got != id { t.Errorf("id=%d → name=%q → (%d,%v),往返不一致", id, name, got, ok) } } } // 4 位 md5("5") 前缀 + mask1 掩码 + 2 位 M2 尾缀 = 7 字节:旧的长度守卫会放行、 // md5 校验也通过,随后在 s[len(s)-2+i] 处越界 panic(上传构造过的 .fwss 即可触发)。 func TestTileIDFromNameRejectsCraftedShortName(t *testing.T) { name := fmt.Sprintf("%x", md5.Sum([]byte("5")))[:4] + string(mask1[5]) + string(mask2[5]) + string(mask2[5]) if len(name) != 7 { t.Fatalf("构造名长度应为 7,实为 %d (%q)", len(name), name) } if id, ok := tileIDFromName(name); ok { t.Fatalf("构造名 %q 不应被接受(解出 id=%d)", name, id) } } // 网格第一列(tx=0)的瓦片编号就是 0..9,Encode 不能 panic,且能原样解回。 func TestEncodeHandlesSingleDigitTile(t *testing.T) { bm := make([]byte, bitmapSize) bm[0] = 0x80 data, err := Encode([]Block{{GX: 0, GY: 0, Bitmap: bm}}, nil) if err != nil { t.Fatalf("Encode: %v", err) } blocks, cells, err := Decode(data) if err != nil { t.Fatalf("Decode: %v", err) } if len(blocks) != 1 || blocks[0].GX != 0 || blocks[0].GY != 0 || cells != 1 { t.Fatalf("往返得到 %+v (cells=%d),期望 1 块 (0,0)、1 格", blocks, cells) } }