search: fix bug stopping facets working in structs

This was working in the legacy "appengine/search" package, but not in
this version. Added a test to verify the conversion works as
expected.

Change-Id: Icee85b9743277945ede53f186114ed7dee33eaea
diff --git a/search/search.go b/search/search.go
index cbba874..477c38c 100644
--- a/search/search.go
+++ b/search/search.go
@@ -840,7 +840,7 @@
 	case FieldLoadSaver:
 		fields, meta, err = x.Save()
 	default:
-		fields, err = SaveStruct(src)
+		fields, meta, err = saveStructWithMeta(src)
 	}
 	if err != nil {
 		return nil, err
diff --git a/search/search_test.go b/search/search_test.go
index fd00654..75bac4b 100644
--- a/search/search_test.go
+++ b/search/search_test.go
@@ -115,6 +115,16 @@
 	}
 }
 
+func newFacet(name, value string, valueType pb.FacetValue_ContentType) *pb.Facet {
+	return &pb.Facet{
+		Name: proto.String(name),
+		Value: &pb.FacetValue{
+			StringValue: proto.String(value),
+			Type:        valueType.Enum(),
+		},
+	}
+}
+
 func TestValidIndexNameOrDocID(t *testing.T) {
 	testCases := []struct {
 		s    string
@@ -249,6 +259,44 @@
 	}
 }
 
+func TestLoadSaveWithStruct(t *testing.T) {
+	type gopher struct {
+		Name string
+		Info string  `search:"about"`
+		Legs float64 `search:",facet"`
+		Fuzz Atom    `search:"Fur,facet"`
+	}
+
+	doc := gopher{"Gopher", "Likes slide rules.", 4, Atom("furry")}
+	pb := &pb.Document{
+		Field: []*pb.Field{
+			newStringValueField("Name", "Gopher", pb.FieldValue_TEXT),
+			newStringValueField("about", "Likes slide rules.", pb.FieldValue_TEXT),
+		},
+		Facet: []*pb.Facet{
+			newFacet("Legs", "4e+00", pb.FacetValue_NUMBER),
+			newFacet("Fur", "furry", pb.FacetValue_ATOM),
+		},
+	}
+
+	var gotDoc gopher
+	if err := loadDoc(&gotDoc, pb, nil); err != nil {
+		t.Fatalf("loadDoc: %v", err)
+	}
+	if !reflect.DeepEqual(gotDoc, doc) {
+		t.Errorf("loading doc\ngot  %v\nwant %v", gotDoc, doc)
+	}
+
+	gotPB, err := saveDoc(&doc)
+	if err != nil {
+		t.Fatalf("saveDoc: %v", err)
+	}
+	gotPB.OrderId = nil // Don't test: it's time dependent.
+	if !proto.Equal(gotPB, pb) {
+		t.Errorf("saving doc\ngot  %v\nwant %v", gotPB, pb)
+	}
+}
+
 func TestValidFieldNames(t *testing.T) {
 	testCases := []struct {
 		name  string