spark-server/internal/module/group/entity/collage_test.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

68 lines
1.9 KiB
Go

package entity
import (
"image"
"image/color"
"image/draw"
"testing"
)
func TestCollageLayout(t *testing.T) {
if got := collageCells(0); len(got) != 0 {
t.Fatalf("empty %d", len(got))
}
two := collageCells(2)
if len(two) != 2 {
t.Fatalf("two %d", len(two))
}
if two[0].Min.Y != two[1].Min.Y || two[0].Max.X >= two[1].Min.X {
t.Fatalf("two should sit on one row: %+v", two)
}
nine := collageCells(9)
if len(nine) != 9 {
t.Fatalf("nine %d", len(nine))
}
if two[0].Dx() <= nine[0].Dx() {
t.Fatalf("two-person tiles should be larger than 3x3: two=%d nine=%d", two[0].Dx(), nine[0].Dx())
}
three := collageCells(3)
if len(three) != 3 {
t.Fatalf("three %d", len(three))
}
if three[0].Min.X <= three[1].Min.X {
t.Fatalf("first row should be centered: %+v", three)
}
}
func TestCollageColors(t *testing.T) {
red := solid(color.RGBA{R: 255, A: 255})
green := solid(color.RGBA{G: 255, A: 255})
blue := solid(color.RGBA{B: 255, A: 255})
img := Collage([]image.Image{red, green, blue})
if img.Bounds().Dx() != collageSize {
t.Fatalf("size %d", img.Bounds().Dx())
}
cells := collageCells(3)
assertNear(t, img.At(mid(cells[0]).X, mid(cells[0]).Y), color.RGBA{R: 255, A: 255})
assertNear(t, img.At(mid(cells[1]).X, mid(cells[1]).Y), color.RGBA{G: 255, A: 255})
assertNear(t, img.At(mid(cells[2]).X, mid(cells[2]).Y), color.RGBA{B: 255, A: 255})
}
func solid(c color.RGBA) *image.RGBA {
img := image.NewRGBA(image.Rect(0, 0, 16, 16))
draw.Draw(img, img.Bounds(), &image.Uniform{C: c}, image.Point{}, draw.Src)
return img
}
func mid(r image.Rectangle) image.Point {
return image.Pt((r.Min.X+r.Max.X)/2, (r.Min.Y+r.Max.Y)/2)
}
func assertNear(t *testing.T, got color.Color, want color.RGBA) {
t.Helper()
r, g, b, a := got.RGBA()
if r>>8 != uint32(want.R) || g>>8 != uint32(want.G) || b>>8 != uint32(want.B) || a>>8 != uint32(want.A) {
t.Fatalf("got rgba %d %d %d %d want %+v", r>>8, g>>8, b>>8, a>>8, want)
}
}