package mdb import ( "reflect" "testing" ) func TestFullBTreeIndex(t *testing.T) { // Test against the email index. run := func(name string, inner func(t *testing.T, db *DB) []*User) { testWithDB(t, name, func(t *testing.T, db *DB) { expected := inner(t, db) if err := db.Users.emailBTree.EqualsList(expected); err != nil { t.Fatal(err) } db.Close() db = OpenDB(db.root, true) if err := db.Users.emailBTree.EqualsList(expected); err != nil { t.Fatal(err) } }) } run("insert", func(t *testing.T, db *DB) (users []*User) { users = append(users, &User{ID: db.Users.c.NextID(), Email: "a@b.com", Name: "aaa"}, &User{ID: db.Users.c.NextID(), Email: "c@d.com", Name: "ccc"}) for _, u := range users { u2, err := db.Users.c.Insert(*u) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(u2, *u) { t.Fatal(u2, *u) } } return users }) // Update run("update", func(t *testing.T, db *DB) (users []*User) { users = append(users, &User{ID: db.Users.c.NextID(), Email: "a@b.com", Name: "aaa"}, &User{ID: db.Users.c.NextID(), Email: "e@f.com", Name: "eee"}, &User{ID: db.Users.c.NextID(), Email: "c@d.com", Name: "ccc"}) for _, u := range users { if _, err := db.Users.c.Insert(*u); err != nil { t.Fatal(err) } } err := db.Users.c.Update(users[2].ID, func(u User) (User, error) { u.Email = "g@h.com" return u, nil }) if err != nil { t.Fatal(err) } users[2].Email = "g@h.com" return users }) run("delete", func(t *testing.T, db *DB) (users []*User) { users = append(users, &User{ID: db.Users.c.NextID(), Email: "a@b.com", Name: "aaa"}, &User{ID: db.Users.c.NextID(), Email: "c@d.com", Name: "ccc"}, &User{ID: db.Users.c.NextID(), Email: "e@f.com", Name: "eee"}) for _, u := range users { if _, err := db.Users.c.Insert(*u); err != nil { t.Fatal(err) } } db.Users.c.Delete(users[0].ID) users = users[1:] return users }) run("get not found", func(t *testing.T, db *DB) (users []*User) { users = append(users, &User{ID: db.Users.c.NextID(), Email: "a@b.com", Name: "aaa"}, &User{ID: db.Users.c.NextID(), Email: "c@d.com", Name: "ccc"}, &User{ID: db.Users.c.NextID(), Email: "e@f.com", Name: "eee"}) for _, u := range users { if _, err := db.Users.c.Insert(*u); err != nil { t.Fatal(err) } } if u, ok := db.Users.emailBTree.Get(User{Email: "g@h.com"}); ok { t.Fatal(u, ok) } return users }) run("min/max empty", func(t *testing.T, db *DB) (users []*User) { if u, ok := db.Users.emailBTree.Min(); ok { t.Fatal(u, ok) } if u, ok := db.Users.emailBTree.Max(); ok { t.Fatal(u, ok) } return users }) } func TestPartialBTreeIndex(t *testing.T) { // empty // insert into // insert outside // upate out to in // update out to out // update in to in // update in to out // delete outside // delete in // load w/duplicate }