Files
oxpoe cad41caaee Hapus tombol kosong bawaan Fyne di modal + semua format ikon dikonversi ke PNG
- dialog.NewCustom selalu menambah tombol dismiss walau labelnya kosong;
  modal kita pakai baris tombol sendiri, jadi pindah ke NewCustomWithoutButtons
  (ditambah tes yang menolak pemakaian dialog.NewCustom lagi)
- Ikon: SVG/webp/gif/bmp/ico/jpeg semuanya dikonversi ke PNG saat dipasang
  (desktop environment tidak konsisten membaca format lain), gambar besar
  diperkecil ke maksimal 512px
- Filter file picker ikon menambah webp/gif/bmp
- Perbaiki data race pada endpoint pencarian ikon (iconifyBase) yang ditemukan
  oleh go test -race; tes UI menunggu goroutine pencarian selesai
- go test -race -count=1 ./... hijau untuk semua paket
2026-10-13 08:00:12 +07:00

91 lines
2.4 KiB
Go

package icon
import (
"bytes"
"image"
"image/color"
"image/gif"
"image/jpeg"
"image/png"
"testing"
"golang.org/x/image/bmp"
)
func solidImg(size int) image.Image {
img := image.NewNRGBA(image.Rect(0, 0, size, size))
for x := 0; x < size; x++ {
for y := 0; y < size; y++ {
img.Set(x, y, color.NRGBA{R: 0x12, G: 0x9f, B: 0x55, A: 0xFF})
}
}
return img
}
func encode(t *testing.T, fn func(*bytes.Buffer) error) []byte {
t.Helper()
var buf bytes.Buffer
if err := fn(&buf); err != nil {
t.Fatal(err)
}
return buf.Bytes()
}
func TestToPNGConvertsFormats(t *testing.T) {
src := solidImg(64)
cases := map[string][]byte{
"png": encode(t, func(b *bytes.Buffer) error { return png.Encode(b, src) }),
"gif": encode(t, func(b *bytes.Buffer) error { return gif.Encode(b, src, nil) }),
"bmp": encode(t, func(b *bytes.Buffer) error { return bmp.Encode(b, src) }),
"jpg": encode(t, func(b *bytes.Buffer) error { return jpeg.Encode(b, src, nil) }),
"svg": []byte(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 8"><rect width="8" height="8"/></svg>`),
"ico": icoWithPNG(encode(t, func(b *bytes.Buffer) error { return png.Encode(b, solidImg(16)) })),
}
for name, data := range cases {
t.Run(name, func(t *testing.T) {
out, err := ToPNG(data)
if err != nil {
t.Fatalf("ToPNG(%s) gagal: %v", name, err)
}
if !bytes.HasPrefix(out, pngMagic) {
t.Fatalf("hasil %s bukan PNG", name)
}
if _, err := png.Decode(bytes.NewReader(out)); err != nil {
t.Fatalf("hasil %s tidak bisa di-decode: %v", name, err)
}
})
}
}
func TestToPNGRejectsUnknown(t *testing.T) {
if _, err := ToPNG([]byte("halo dunia")); err == nil {
t.Error("data bukan gambar harus error")
}
}
func TestToPNGShrinksHugeImages(t *testing.T) {
out, err := ToPNG(encode(t, func(b *bytes.Buffer) error { return png.Encode(b, solidImg(1024)) }))
if err != nil {
t.Fatal(err)
}
if len(out) >= 1024*1024 {
t.Errorf("gambar besar tidak diperkecil: %d byte", len(out))
}
}
func TestSaveAlwaysWritesPNG(t *testing.T) {
t.Setenv("HOME", t.TempDir())
t.Setenv("XDG_DATA_HOME", "")
// ikon webp tak disupport ditest lewat gif: hasil harus selalu .png
path, err := Save(encode(t, func(b *bytes.Buffer) error { return gif.Encode(b, solidImg(32), nil) }), "contoh")
if err != nil {
t.Fatal(err)
}
if got := path[len(path)-4:]; got != ".png" {
t.Errorf("path ikon = %s", path)
}
}