Ein Feld an der App, kein zweites Datenmodell: Eine Kategorie besteht genau so lange, wie eine App sie traegt. Damit gibt es nichts anzulegen, nichts zu loeschen und keine zweite Reihenfolge, die mit der bestehenden aus dem Tritt geraten koennte. Die Reihenfolge der Ueberschriften ist die ihres ersten Auftretens in der Liste -- also ordnen dieselben Pfeile wie bisher beides. Am Rand einer Gruppe haengt der Pfeil die App in die Nachbargruppe um, statt zu tauschen: derselbe Knopf zum Sortieren und zum Umkategorisieren, und keine App kann zwischen zwei Gruppen liegen bleiben. Eingesammelt wird im Server, beim Schreiben wie beim Lesen. Das war nicht der erste Entwurf: Zuerst sortierte die Oberflaeche und die HoneyBar setzte ihre Ueberschriften beim Durchlaufen -- prompt stand eine App ohne Kategorie in der HoneyBar unter der letzten Ueberschrift und auf dem Schreibtisch ganz oben. Bei zwei Lesern derselben Liste gehoert die Reihenfolge dorthin, wo die Liste liegt. Ueberschriften erscheinen, wo man sucht: Kacheln, Schublade beider Leisten, Programme-Fenster. Nicht im App-Streifen (32 Pixel) und nicht bei den Schreibtischsymbolen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
package store
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// Die Reihenfolge der Apps ist die Anzeige-Reihenfolge — für den Schreibtisch
|
|
// wie für die HoneyBar in fremden Apps. Deshalb legt der Server sie fest und
|
|
// nicht jeder Leser für sich: Als die HoneyBar ihre Überschriften noch selbst
|
|
// beim Durchlaufen setzte, landete eine App ohne Kategorie am Ende unter der
|
|
// letzten Überschrift, während der Schreibtisch sie oben zeigte.
|
|
func TestKategorienWerdenEingesammelt(t *testing.T) {
|
|
s, err := Open(filepath.Join(t.TempDir(), "honeyos.json"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Absichtlich durcheinander: zwei Gruppen verschränkt, die App ohne
|
|
// Kategorie zuletzt.
|
|
err = s.SetApps([]App{
|
|
{ID: "a", URL: "https://e.test/a", Kategorie: "Apps"},
|
|
{ID: "g", URL: "https://e.test/g", Kategorie: "Dienste"},
|
|
{ID: "i", URL: "https://e.test/i", Kategorie: "Apps"},
|
|
{ID: "p", URL: "https://e.test/p", Kategorie: "Dienste"},
|
|
{ID: "l", URL: "https://e.test/l"},
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
will := []string{"l", "a", "i", "g", "p"}
|
|
hat := []string{}
|
|
for _, a := range s.Apps() {
|
|
hat = append(hat, a.ID)
|
|
}
|
|
for i := range will {
|
|
if i >= len(hat) || hat[i] != will[i] {
|
|
t.Fatalf("Reihenfolge %v, erwartet %v — ohne Kategorie zuerst, dann die Gruppen in der Reihenfolge ihres ersten Auftretens", hat, will)
|
|
}
|
|
}
|
|
|
|
// Und nach dem Neuladen dasselbe: Wer honeyos.json von Hand bearbeitet,
|
|
// bekommt seine Kategorien ebenfalls eingesammelt.
|
|
s2, err := Open(s.path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for i, a := range s2.Apps() {
|
|
if a.ID != will[i] {
|
|
t.Fatalf("nach dem Neuladen %q an Stelle %d, erwartet %q", a.ID, i, will[i])
|
|
}
|
|
}
|
|
}
|