Index: service/datastore/pls_test.go |
diff --git a/service/datastore/pls_test.go b/service/datastore/pls_test.go |
index 92ebffcf0b4521a9b5bc4f3912a24e840aa59157..18cc5dc16e33cec282e460645ca0bbfee7cf45b5 100644 |
--- a/service/datastore/pls_test.go |
+++ b/service/datastore/pls_test.go |
@@ -579,24 +579,24 @@ func (i *IDParser) GetAllMeta() PropertyMap { |
return pm |
} |
-func (i *IDParser) GetMeta(key string) (interface{}, error) { |
+func (i *IDParser) GetMeta(key string) (interface{}, bool) { |
if key == "id" { |
- return i.getFullID(), nil |
+ return i.getFullID(), true |
} |
return GetPLS(i).GetMeta(key) |
} |
-func (i *IDParser) GetMetaDefault(key string, dflt interface{}) interface{} { |
- return GetMetaDefaultImpl(i.GetMeta, key, dflt) |
-} |
- |
-func (i *IDParser) SetMeta(key string, value interface{}) (err error) { |
+func (i *IDParser) SetMeta(key string, value interface{}) bool { |
if key == "id" { |
// let the panics flooowwww |
vS := strings.SplitN(value.(string), "|", 2) |
i.parent = vS[0] |
+ var err error |
i.id, err = strconv.ParseInt(vS[1], 10, 64) |
- return |
+ if err != nil { |
+ panic(err) |
+ } |
+ return true |
} |
return GetPLS(i).SetMeta(key, value) |
} |
@@ -617,18 +617,14 @@ func (i *KindOverride) GetAllMeta() PropertyMap { |
return pm |
} |
-func (i *KindOverride) GetMeta(key string) (interface{}, error) { |
+func (i *KindOverride) GetMeta(key string) (interface{}, bool) { |
if key == "kind" && i.customKind != "" { |
- return i.customKind, nil |
+ return i.customKind, true |
} |
return GetPLS(i).GetMeta(key) |
} |
-func (i *KindOverride) GetMetaDefault(key string, dflt interface{}) interface{} { |
- return GetMetaDefaultImpl(i.GetMeta, key, dflt) |
-} |
- |
-func (i *KindOverride) SetMeta(key string, value interface{}) error { |
+func (i *KindOverride) SetMeta(key string, value interface{}) bool { |
if key == "kind" { |
kind := value.(string) |
if kind != "KindOverride" { |
@@ -636,9 +632,9 @@ func (i *KindOverride) SetMeta(key string, value interface{}) error { |
} else { |
i.customKind = "" |
} |
- return nil |
+ return true |
} |
- return ErrMetaFieldUnset |
+ return GetPLS(i).SetMeta(key, value) |
} |
type EmbeddedID struct { |
@@ -1622,16 +1618,27 @@ func TestRoundTrip(t *testing.T) { |
return expected != "" |
} |
+ getPLSErr := func(obj interface{}) (pls PropertyLoadSaver, err error) { |
+ defer func() { |
+ if v := recover(); v != nil { |
+ err = v.(error) |
+ } |
+ }() |
+ pls = GetPLS(obj) |
+ return |
+ } |
+ |
Convey("Test round-trip", t, func() { |
for _, tc := range testCases { |
tc := tc |
Convey(tc.desc, func() { |
pls, ok := tc.src.(PropertyLoadSaver) |
if !ok { |
- pls = GetPLS(tc.src) |
- } |
- if checkErr(pls.Problem(), tc.plsErr) { |
- return |
+ var err error |
+ pls, err = getPLSErr(tc.src) |
+ if checkErr(err, tc.plsErr) { |
+ return |
+ } |
} |
So(pls, ShouldNotBeNil) |
@@ -1648,13 +1655,14 @@ func TestRoundTrip(t *testing.T) { |
} else { |
got = reflect.New(reflect.TypeOf(tc.want).Elem()).Interface() |
if pls, ok = got.(PropertyLoadSaver); !ok { |
- pls = GetPLS(got) |
+ var err error |
+ pls, err = getPLSErr(got) |
+ if checkErr(err, tc.plsLoadErr) { |
+ return |
+ } |
} |
} |
- if checkErr(pls.Problem(), tc.plsLoadErr) { |
- return |
- } |
So(pls, ShouldNotBeNil) |
err = pls.Load(savedProps) |
@@ -1684,65 +1692,49 @@ func TestMeta(t *testing.T) { |
Convey("Can retrieve from struct", func() { |
o := &N0{ID: 100} |
mgs := getMGS(o) |
- val, err := mgs.GetMeta("id") |
- So(err, ShouldBeNil) |
+ val, ok := mgs.GetMeta("id") |
+ So(ok, ShouldBeTrue) |
So(val, ShouldEqual, 100) |
- val, err = mgs.GetMeta("kind") |
- So(err, ShouldBeNil) |
+ val, ok = mgs.GetMeta("kind") |
+ So(ok, ShouldBeTrue) |
So(val, ShouldEqual, "whatnow") |
- So(mgs.GetMetaDefault("kind", "zappo"), ShouldEqual, "whatnow") |
- So(mgs.GetMetaDefault("id", "stringID"), ShouldEqual, "stringID") |
- So(mgs.GetMetaDefault("id", 6), ShouldEqual, 100) |
+ So(GetMetaDefault(mgs, "kind", "zappo"), ShouldEqual, "whatnow") |
+ So(GetMetaDefault(mgs, "id", "stringID"), ShouldEqual, "stringID") |
+ So(GetMetaDefault(mgs, "id", 6), ShouldEqual, 100) |
}) |
Convey("Getting something not there is an error", func() { |
o := &N0{ID: 100} |
mgs := getMGS(o) |
- _, err := mgs.GetMeta("wat") |
- So(err, ShouldEqual, ErrMetaFieldUnset) |
+ _, ok := mgs.GetMeta("wat") |
+ So(ok, ShouldBeFalse) |
}) |
Convey("Default works for missing fields", func() { |
o := &N0{ID: 100} |
mgs := getMGS(o) |
- So(mgs.GetMetaDefault("whozit", 10), ShouldEqual, 10) |
- }) |
- |
- Convey("getting/setting from a bad struct is an error", func() { |
- o := &Recursive{} |
- mgs := getMGS(o) |
- _, err := mgs.GetMeta("wat") |
- So(err, ShouldNotBeNil) |
- |
- err = mgs.SetMeta("wat", 100) |
- So(err, ShouldNotBeNil) |
+ So(GetMetaDefault(mgs, "whozit", 10), ShouldEqual, 10) |
}) |
- Convey("Default works for bad structs", func() { |
- o := &Recursive{} |
- mgs := getMGS(o) |
- So(mgs.GetMetaDefault("whozit", 10), ShouldEqual, 10) |
+ Convey("getting mgs for bad struct is an error", func() { |
+ So(func() { getMGS(&Recursive{}) }, ShouldPanicLike, |
+ `field "R" is recursively defined`) |
}) |
Convey("can assign values to exported meta fields", func() { |
o := &N0{ID: 100} |
mgs := getMGS(o) |
- err := mgs.SetMeta("id", int64(200)) |
- So(err, ShouldBeNil) |
+ So(mgs.SetMeta("id", int64(200)), ShouldBeTrue) |
So(o.ID, ShouldEqual, 200) |
- |
}) |
- Convey("assigning to unsassiagnable fields is a simple error", func() { |
+ Convey("assigning to unsassiagnable fields returns !ok", func() { |
o := &N0{ID: 100} |
mgs := getMGS(o) |
- err := mgs.SetMeta("kind", "hi") |
- So(err.Error(), ShouldContainSubstring, "unexported field") |
- |
- err = mgs.SetMeta("noob", "hi") |
- So(err, ShouldEqual, ErrMetaFieldUnset) |
+ So(mgs.SetMeta("kind", "hi"), ShouldBeFalse) |
+ So(mgs.SetMeta("noob", "hi"), ShouldBeFalse) |
}) |
}) |
@@ -1755,14 +1747,7 @@ func TestMeta(t *testing.T) { |
Convey("multiple overlapping fields is an error", func() { |
o := &BadMeta{} |
- pls := GetPLS(o) |
- err := pls.Load(nil) |
- So(err, ShouldErrLike, "multiple times") |
- e := pls.Problem() |
- _, err = pls.Save(true) |
- So(err, ShouldEqual, e) |
- err = pls.Load(nil) |
- So(err, ShouldEqual, e) |
+ So(func() { GetPLS(o) }, ShouldPanicLike, "multiple times") |
}) |
Convey("empty property names are invalid", func() { |
@@ -1770,21 +1755,8 @@ func TestMeta(t *testing.T) { |
}) |
Convey("attempting to get a PLS for a non *struct is an error", func() { |
- pls := GetPLS((*[]string)(nil)) |
- So(pls.Problem(), ShouldEqual, ErrInvalidEntityType) |
- |
- Convey("the error PLS can still be used", func() { |
- k, _ := pls.GetMeta("kind") |
- So(k, ShouldBeNil) |
- |
- props := pls.GetAllMeta() |
- So(props, ShouldResemble, PropertyMap{ |
- "$kind": []Property{mpNI("")}, |
- }) |
- |
- _, err := pls.Save(true) |
- So(err, ShouldNotBeNil) |
- }) |
+ So(func() { GetPLS((*[]string)(nil)) }, ShouldPanicLike, |
+ "cannot GetPLS(*[]string): not a pointer-to-struct") |
}) |
Convey("convertible meta default types", func() { |
@@ -1794,34 +1766,30 @@ func TestMeta(t *testing.T) { |
DoIt Toggle `gae:"$doit,on"` |
} |
okd := &OKDefaults{} |
- pls := GetPLS(okd) |
mgs := getMGS(okd) |
- So(pls.Problem(), ShouldBeNil) |
- v, err := mgs.GetMeta("when") |
- So(err, ShouldBeNil) |
+ v, ok := mgs.GetMeta("when") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, "tomorrow") |
- v, err = mgs.GetMeta("amt") |
- So(err, ShouldBeNil) |
+ v, ok = mgs.GetMeta("amt") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, int64(100)) |
So(okd.DoIt, ShouldEqual, Auto) |
- v, err = mgs.GetMeta("doit") |
- So(err, ShouldBeNil) |
+ v, ok = mgs.GetMeta("doit") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldBeTrue) |
- err = mgs.SetMeta("doit", false) |
- So(err, ShouldBeNil) |
- v, err = mgs.GetMeta("doit") |
- So(err, ShouldBeNil) |
+ So(mgs.SetMeta("doit", false), ShouldBeTrue) |
+ v, ok = mgs.GetMeta("doit") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldBeFalse) |
So(okd.DoIt, ShouldEqual, Off) |
- err = mgs.SetMeta("doit", true) |
- So(err, ShouldBeNil) |
- v, err = mgs.GetMeta("doit") |
- So(err, ShouldBeNil) |
+ So(mgs.SetMeta("doit", true), ShouldBeTrue) |
+ v, ok = mgs.GetMeta("doit") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldBeTrue) |
So(okd.DoIt, ShouldEqual, On) |
@@ -1829,8 +1797,7 @@ func TestMeta(t *testing.T) { |
type BadToggle struct { |
Bad Toggle `gae:"$wut"` |
} |
- pls := GetPLS(&BadToggle{}) |
- So(pls.Problem().Error(), ShouldContainSubstring, "bad/missing default") |
+ So(func() { GetPLS(&BadToggle{}) }, ShouldPanicLike, "bad/missing default") |
}) |
}) |
@@ -1848,12 +1815,12 @@ func TestMeta(t *testing.T) { |
"$kind": {mpNI("OKDefaults")}, |
}) |
- v, err := pm.GetMeta("when") |
- So(err, ShouldBeNil) |
+ v, ok := pm.GetMeta("when") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, "tomorrow") |
- v, err = pm.GetMeta("amt") |
- So(err, ShouldBeNil) |
+ v, ok = pm.GetMeta("amt") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, int64(100)) |
}) |
@@ -1864,8 +1831,8 @@ func TestMeta(t *testing.T) { |
o := &OverrideDefault{} |
mgs := getMGS(o) |
- v, err := mgs.GetMeta("val") |
- So(err, ShouldBeNil) |
+ v, ok := mgs.GetMeta("val") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, int64(0)) |
}) |
@@ -1876,13 +1843,13 @@ func TestMeta(t *testing.T) { |
o := &OverrideDefault{} |
mgs := getMGS(o) |
- v, err := mgs.GetMeta("val") |
- So(err, ShouldBeNil) |
+ v, ok := mgs.GetMeta("val") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, int64(100)) |
o.Val = 10 |
- v, err = mgs.GetMeta("val") |
- So(err, ShouldBeNil) |
+ v, ok = mgs.GetMeta("val") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, int64(10)) |
}) |
@@ -1895,16 +1862,16 @@ func TestMeta(t *testing.T) { |
} |
o := &DerivedStruct{"hello", 10} |
mgs := getMGS(o) |
- v, err := mgs.GetMeta("id") |
- So(err, ShouldBeNil) |
+ v, ok := mgs.GetMeta("id") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, "hello") |
- v, err = mgs.GetMeta("foo") |
- So(err, ShouldBeNil) |
+ v, ok = mgs.GetMeta("foo") |
+ So(ok, ShouldBeTrue) |
So(v, ShouldEqual, int64(10)) |
- So(mgs.SetMeta("id", "nerds"), ShouldBeNil) |
- So(mgs.SetMeta("foo", 20), ShouldBeNil) |
+ So(mgs.SetMeta("id", "nerds"), ShouldBeTrue) |
+ So(mgs.SetMeta("foo", 20), ShouldBeTrue) |
So(o.ID, ShouldEqual, DerivedString("nerds")) |
So(o.Foo, ShouldEqual, DerivedInt(20)) |
}) |
@@ -1913,18 +1880,18 @@ func TestMeta(t *testing.T) { |
type BadDefault struct { |
Val time.Time `gae:"$meta,tomorrow"` |
} |
- pls := GetPLS(&BadDefault{}) |
- So(pls.Problem().Error(), ShouldContainSubstring, "bad type") |
+ So(func() { GetPLS(&BadDefault{}) }, ShouldPanicLike, "bad type") |
}) |
Convey("MetaGetterSetter implementation (IDParser)", func() { |
idp := &IDParser{parent: "moo", id: 100} |
mgs := getMGS(idp) |
- So(mgs.GetMetaDefault("id", ""), ShouldEqual, "moo|100") |
- So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "CoolKind") |
+ So(GetMetaDefault(mgs, "id", ""), ShouldEqual, "moo|100") |
- So(mgs.SetMeta("kind", "Something"), ShouldErrLike, "unexported field") |
- So(mgs.SetMeta("id", "happy|27"), ShouldBeNil) |
+ So(GetMetaDefault(mgs, "kind", ""), ShouldEqual, "CoolKind") |
+ |
+ So(mgs.SetMeta("kind", "Something"), ShouldBeFalse) |
+ So(mgs.SetMeta("id", "happy|27"), ShouldBeTrue) |
So(idp.parent, ShouldEqual, "happy") |
So(idp.id, ShouldEqual, 27) |
@@ -1938,15 +1905,15 @@ func TestMeta(t *testing.T) { |
Convey("MetaGetterSetter implementation (KindOverride)", func() { |
ko := &KindOverride{ID: 20} |
mgs := getMGS(ko) |
- So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "KindOverride") |
+ So(GetMetaDefault(mgs, "kind", ""), ShouldEqual, "KindOverride") |
ko.customKind = "something" |
- So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "something") |
+ So(GetMetaDefault(mgs, "kind", ""), ShouldEqual, "something") |
- So(mgs.SetMeta("kind", "Nerp"), ShouldBeNil) |
+ So(mgs.SetMeta("kind", "Nerp"), ShouldBeTrue) |
So(ko.customKind, ShouldEqual, "Nerp") |
- So(mgs.SetMeta("kind", "KindOverride"), ShouldBeNil) |
+ So(mgs.SetMeta("kind", "KindOverride"), ShouldBeTrue) |
So(ko.customKind, ShouldEqual, "") |
So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{ |
@@ -1970,11 +1937,11 @@ func TestMeta(t *testing.T) { |
Convey("Embeddable Metadata structs", func() { |
ide := &IDEmbedder{EmbeddedID{"hello", 10}} |
pls := GetPLS(ide) |
- val, err := pls.GetMeta("id") |
- So(err, ShouldBeNil) |
+ val, ok := pls.GetMeta("id") |
+ So(ok, ShouldBeTrue) |
So(val, ShouldEqual, "hello|10") |
- So(pls.SetMeta("id", "sup|1337"), ShouldBeNil) |
+ So(pls.SetMeta("id", "sup|1337"), ShouldBeTrue) |
So(ide.EmbeddedID, ShouldResemble, EmbeddedID{"sup", 1337}) |
So(pls.GetAllMeta(), ShouldResembleV, PropertyMap{ |