package raycast import "testing" // solidAt 只在指定方块返回 solid。 func solidAt(sx, sy, sz int32) Solid { return func(x, y, z int32) bool { return x == sx && y == sy && z == sz } } // TestCastDown 垂直向下命中顶面:face=(0,1,0),prev 在方块上方。 func TestCastDown(t *testing.T) { h, ok := Cast([3]float64{0.5, 70, 0.5}, [3]float64{0, -1, 0}, 100, solidAt(0, 64, 0)) if !ok { t.Fatal("应命中方块") } if h.X != 0 || h.Y != 64 || h.Z != 0 { t.Fatalf("命中坐标异常: %+v", h) } if h.Face != [3]int32{0, 1, 0} { t.Fatalf("面法线期望 (0,1,0),实际 %+v", h.Face) } if h.Prev != [3]int32{0, 65, 0} { t.Fatalf("放置位期望 (0,65,0),实际 %+v", h.Prev) } } // TestCastMiss 未命中(距离超限)。 func TestCastMiss(t *testing.T) { if _, ok := Cast([3]float64{0.5, 70, 0.5}, [3]float64{1, 0, 0}, 3, solidAt(100, 70, 100)); ok { t.Fatal("不应命中") } } // TestCastDiagonal 沿 +z 直线命中方块北面(face=(0,0,-1))。 func TestCastDiagonal(t *testing.T) { h, ok := Cast([3]float64{1.0, 0.5, -5}, [3]float64{0, 0, 1}, 20, solidAt(1, 0, 1)) if !ok { t.Fatal("应命中") } if h.X != 1 || h.Z != 1 { t.Fatalf("命中坐标异常: %+v", h) } if h.Face != [3]int32{0, 0, -1} { t.Fatalf("面法线期望 (0,0,-1),实际 %+v", h.Face) } if h.Prev != [3]int32{1, 0, 0} { t.Fatalf("放置位期望 (1,0,0),实际 %+v", h.Prev) } } // TestCastNegative 负坐标区域命中(负坐标安全回归)。 func TestCastNegative(t *testing.T) { h, ok := Cast([3]float64{-0.5, 70.5, -0.5}, [3]float64{0, -1, 0}, 100, solidAt(-1, 64, -1)) if !ok { t.Fatal("负坐标应命中") } if h.X != -1 || h.Z != -1 { t.Fatalf("负坐标命中异常: %+v", h) } }