package git import ( "os" "testing" ) func TestObjectPoymorphism(t *testing.T) { repo := createTestRepo(t) defer os.RemoveAll(repo.Workdir()) commitId, treeId := seedTestRepo(t, repo) var obj Object commit, err := repo.LookupCommit(commitId) checkFatal(t, err) obj = commit if obj.Type() != OBJ_COMMIT { t.Fatalf("Wrong object type, expected commit, have %v", obj.Type()) } tree, err := repo.LookupTree(treeId) checkFatal(t, err) obj = tree if obj.Type() != OBJ_TREE { t.Fatalf("Wrong object type, expected tree, have %v", obj.Type()) } tree2, ok := obj.(*Tree) if !ok { t.Fatalf("Converting back to *Tree is not ok") } entry := tree2.EntryByName("README") if entry == nil { t.Fatalf("Tree did not have expected \"README\" entry") } if entry.Filemode != FilemodeBlob { t.Fatal("Wrong filemode for \"README\"") } _, ok = obj.(*Commit) if ok { t.Fatalf("*Tree is somehow the same as *Commit") } obj, err = repo.Lookup(tree.Id()) checkFatal(t, err) _, ok = obj.(*Tree) if !ok { t.Fatalf("Lookup creates the wrong type") } if obj.Type() != OBJ_TREE { t.Fatalf("Type() doesn't agree with dynamic type") } obj, err = repo.RevparseSingle("HEAD") checkFatal(t, err) if obj.Type() != OBJ_COMMIT || obj.Id().String() != commit.Id().String() { t.Fatalf("Failed to parse the right revision") } obj, err = repo.RevparseSingle("HEAD^{tree}") checkFatal(t, err) if obj.Type() != OBJ_TREE || obj.Id().String() != tree.Id().String() { t.Fatalf("Failed to parse the right revision") } }