Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // adapted from github.com/golang/appengine/datastore | 5 // adapted from github.com/golang/appengine/datastore |
| 6 | 6 |
| 7 package datastore | 7 package datastore |
| 8 | 8 |
| 9 import ( | 9 import ( |
| 10 "bytes" | 10 "bytes" |
| (...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 579 return pm | 579 return pm |
| 580 } | 580 } |
| 581 | 581 |
| 582 func (i *IDParser) GetMeta(key string) (interface{}, error) { | 582 func (i *IDParser) GetMeta(key string) (interface{}, error) { |
| 583 if key == "id" { | 583 if key == "id" { |
| 584 return i.getFullID(), nil | 584 return i.getFullID(), nil |
| 585 } | 585 } |
| 586 return GetPLS(i).GetMeta(key) | 586 return GetPLS(i).GetMeta(key) |
| 587 } | 587 } |
| 588 | 588 |
| 589 func (i *IDParser) GetMetaDefault(key string, dflt interface{}) interface{} { | |
| 590 return GetMetaDefaultImpl(i.GetMeta, key, dflt) | |
| 591 } | |
| 592 | |
| 593 func (i *IDParser) SetMeta(key string, value interface{}) (err error) { | 589 func (i *IDParser) SetMeta(key string, value interface{}) (err error) { |
| 594 if key == "id" { | 590 if key == "id" { |
| 595 // let the panics flooowwww | 591 // let the panics flooowwww |
| 596 vS := strings.SplitN(value.(string), "|", 2) | 592 vS := strings.SplitN(value.(string), "|", 2) |
| 597 i.parent = vS[0] | 593 i.parent = vS[0] |
| 598 i.id, err = strconv.ParseInt(vS[1], 10, 64) | 594 i.id, err = strconv.ParseInt(vS[1], 10, 64) |
| 599 return | 595 return |
| 600 } | 596 } |
| 601 return GetPLS(i).SetMeta(key, value) | 597 return GetPLS(i).SetMeta(key, value) |
| 602 } | 598 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 617 return pm | 613 return pm |
| 618 } | 614 } |
| 619 | 615 |
| 620 func (i *KindOverride) GetMeta(key string) (interface{}, error) { | 616 func (i *KindOverride) GetMeta(key string) (interface{}, error) { |
| 621 if key == "kind" && i.customKind != "" { | 617 if key == "kind" && i.customKind != "" { |
| 622 return i.customKind, nil | 618 return i.customKind, nil |
| 623 } | 619 } |
| 624 return GetPLS(i).GetMeta(key) | 620 return GetPLS(i).GetMeta(key) |
| 625 } | 621 } |
| 626 | 622 |
| 627 func (i *KindOverride) GetMetaDefault(key string, dflt interface{}) interface{} { | |
| 628 return GetMetaDefaultImpl(i.GetMeta, key, dflt) | |
| 629 } | |
| 630 | |
| 631 func (i *KindOverride) SetMeta(key string, value interface{}) error { | 623 func (i *KindOverride) SetMeta(key string, value interface{}) error { |
| 632 if key == "kind" { | 624 if key == "kind" { |
| 633 kind := value.(string) | 625 kind := value.(string) |
| 634 if kind != "KindOverride" { | 626 if kind != "KindOverride" { |
| 635 i.customKind = kind | 627 i.customKind = kind |
| 636 } else { | 628 } else { |
| 637 i.customKind = "" | 629 i.customKind = "" |
| 638 } | 630 } |
| 639 return nil | 631 return nil |
| 640 } | 632 } |
| (...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1619 } else { | 1611 } else { |
| 1620 So(actual, ShouldErrLike, expected) | 1612 So(actual, ShouldErrLike, expected) |
| 1621 } | 1613 } |
| 1622 return expected != "" | 1614 return expected != "" |
| 1623 } | 1615 } |
| 1624 | 1616 |
| 1625 Convey("Test round-trip", t, func() { | 1617 Convey("Test round-trip", t, func() { |
| 1626 for _, tc := range testCases { | 1618 for _, tc := range testCases { |
| 1627 tc := tc | 1619 tc := tc |
| 1628 Convey(tc.desc, func() { | 1620 Convey(tc.desc, func() { |
| 1629 » » » » pls, ok := tc.src.(PropertyLoadSaver) | 1621 » » » » pls, ok := tc.src.(interface { |
| 1622 » » » » » PropertyLoadSaver | |
| 1623 » » » » » Problem() error | |
| 1624 » » » » }) | |
|
iannucci
2015/12/12 03:52:22
This silliness is because of the way the tests are
| |
| 1630 if !ok { | 1625 if !ok { |
| 1631 pls = GetPLS(tc.src) | 1626 pls = GetPLS(tc.src) |
| 1632 } | 1627 } |
| 1633 if checkErr(pls.Problem(), tc.plsErr) { | 1628 if checkErr(pls.Problem(), tc.plsErr) { |
| 1634 return | 1629 return |
| 1635 } | 1630 } |
| 1636 So(pls, ShouldNotBeNil) | 1631 So(pls, ShouldNotBeNil) |
| 1637 | 1632 |
| 1638 savedProps, err := pls.Save(false) | 1633 savedProps, err := pls.Save(false) |
| 1639 if checkErr(err, tc.saveErr) { | 1634 if checkErr(err, tc.saveErr) { |
| 1640 return | 1635 return |
| 1641 } | 1636 } |
| 1642 So(savedProps, ShouldNotBeNil) | 1637 So(savedProps, ShouldNotBeNil) |
| 1643 | 1638 |
| 1644 var got interface{} | 1639 var got interface{} |
| 1645 if _, ok := tc.want.(PropertyMap); ok { | 1640 if _, ok := tc.want.(PropertyMap); ok { |
| 1646 pls = PropertyMap{} | 1641 pls = PropertyMap{} |
| 1647 got = pls | 1642 got = pls |
| 1648 } else { | 1643 } else { |
| 1649 got = reflect.New(reflect.TypeOf(tc.want ).Elem()).Interface() | 1644 got = reflect.New(reflect.TypeOf(tc.want ).Elem()).Interface() |
| 1650 » » » » » if pls, ok = got.(PropertyLoadSaver); !o k { | 1645 » » » » » if pls, ok = got.(interface { |
| 1646 » » » » » » PropertyLoadSaver | |
| 1647 » » » » » » Problem() error | |
| 1648 » » » » » }); !ok { | |
| 1651 pls = GetPLS(got) | 1649 pls = GetPLS(got) |
| 1652 } | 1650 } |
| 1653 } | 1651 } |
| 1654 | 1652 |
| 1655 if checkErr(pls.Problem(), tc.plsLoadErr) { | 1653 if checkErr(pls.Problem(), tc.plsLoadErr) { |
| 1656 return | 1654 return |
| 1657 } | 1655 } |
| 1658 So(pls, ShouldNotBeNil) | 1656 So(pls, ShouldNotBeNil) |
| 1659 | 1657 |
| 1660 err = pls.Load(savedProps) | 1658 err = pls.Load(savedProps) |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1685 o := &N0{ID: 100} | 1683 o := &N0{ID: 100} |
| 1686 mgs := getMGS(o) | 1684 mgs := getMGS(o) |
| 1687 val, err := mgs.GetMeta("id") | 1685 val, err := mgs.GetMeta("id") |
| 1688 So(err, ShouldBeNil) | 1686 So(err, ShouldBeNil) |
| 1689 So(val, ShouldEqual, 100) | 1687 So(val, ShouldEqual, 100) |
| 1690 | 1688 |
| 1691 val, err = mgs.GetMeta("kind") | 1689 val, err = mgs.GetMeta("kind") |
| 1692 So(err, ShouldBeNil) | 1690 So(err, ShouldBeNil) |
| 1693 So(val, ShouldEqual, "whatnow") | 1691 So(val, ShouldEqual, "whatnow") |
| 1694 | 1692 |
| 1695 » » » So(mgs.GetMetaDefault("kind", "zappo"), ShouldEqual, "wh atnow") | 1693 » » » v, err := GetMetaDefault(mgs, "kind", "zappo") |
| 1696 » » » So(mgs.GetMetaDefault("id", "stringID"), ShouldEqual, "s tringID") | 1694 » » » So(err, ShouldBeNil) |
| 1697 » » » So(mgs.GetMetaDefault("id", 6), ShouldEqual, 100) | 1695 » » » So(v, ShouldEqual, "whatnow") |
| 1696 | |
| 1697 » » » v, err = GetMetaDefault(mgs, "id", "stringID") | |
| 1698 » » » So(err, ShouldBeNil) | |
| 1699 » » » So(v, ShouldEqual, "stringID") | |
| 1700 | |
| 1701 » » » v, err = GetMetaDefault(mgs, "id", 6) | |
| 1702 » » » So(err, ShouldBeNil) | |
| 1703 » » » So(v, ShouldEqual, 100) | |
| 1698 }) | 1704 }) |
| 1699 | 1705 |
| 1700 Convey("Getting something not there is an error", func() { | 1706 Convey("Getting something not there is an error", func() { |
| 1701 o := &N0{ID: 100} | 1707 o := &N0{ID: 100} |
| 1702 mgs := getMGS(o) | 1708 mgs := getMGS(o) |
| 1703 _, err := mgs.GetMeta("wat") | 1709 _, err := mgs.GetMeta("wat") |
| 1704 So(err, ShouldEqual, ErrMetaFieldUnset) | 1710 So(err, ShouldEqual, ErrMetaFieldUnset) |
| 1705 }) | 1711 }) |
| 1706 | 1712 |
| 1707 Convey("Default works for missing fields", func() { | 1713 Convey("Default works for missing fields", func() { |
| 1708 o := &N0{ID: 100} | 1714 o := &N0{ID: 100} |
| 1709 mgs := getMGS(o) | 1715 mgs := getMGS(o) |
| 1710 » » » So(mgs.GetMetaDefault("whozit", 10), ShouldEqual, 10) | 1716 » » » v, err := GetMetaDefault(mgs, "whozit", 10) |
| 1717 » » » So(err, ShouldBeNil) | |
| 1718 » » » So(v, ShouldEqual, 10) | |
| 1711 }) | 1719 }) |
| 1712 | 1720 |
| 1713 Convey("getting/setting from a bad struct is an error", func() { | 1721 Convey("getting/setting from a bad struct is an error", func() { |
| 1714 o := &Recursive{} | 1722 o := &Recursive{} |
| 1715 mgs := getMGS(o) | 1723 mgs := getMGS(o) |
| 1716 _, err := mgs.GetMeta("wat") | 1724 _, err := mgs.GetMeta("wat") |
| 1717 So(err, ShouldNotBeNil) | 1725 So(err, ShouldNotBeNil) |
| 1718 | 1726 |
| 1719 err = mgs.SetMeta("wat", 100) | 1727 err = mgs.SetMeta("wat", 100) |
| 1720 So(err, ShouldNotBeNil) | 1728 So(err, ShouldNotBeNil) |
| 1721 }) | 1729 }) |
| 1722 | 1730 |
| 1723 » » Convey("Default works for bad structs", func() { | 1731 » » Convey("Default fails for bad structs", func() { |
| 1724 o := &Recursive{} | 1732 o := &Recursive{} |
| 1725 mgs := getMGS(o) | 1733 mgs := getMGS(o) |
| 1726 » » » So(mgs.GetMetaDefault("whozit", 10), ShouldEqual, 10) | 1734 » » » _, err := GetMetaDefault(mgs, "whozit", 10) |
| 1735 » » » So(err, ShouldErrLike, `field "R" is recursively defined `) | |
| 1727 }) | 1736 }) |
| 1728 | 1737 |
| 1729 Convey("can assign values to exported meta fields", func() { | 1738 Convey("can assign values to exported meta fields", func() { |
| 1730 o := &N0{ID: 100} | 1739 o := &N0{ID: 100} |
| 1731 mgs := getMGS(o) | 1740 mgs := getMGS(o) |
| 1732 err := mgs.SetMeta("id", int64(200)) | 1741 err := mgs.SetMeta("id", int64(200)) |
| 1733 So(err, ShouldBeNil) | 1742 So(err, ShouldBeNil) |
| 1734 So(o.ID, ShouldEqual, 200) | 1743 So(o.ID, ShouldEqual, 200) |
| 1735 | 1744 |
| 1736 }) | 1745 }) |
| 1737 | 1746 |
| 1738 Convey("assigning to unsassiagnable fields is a simple error", f unc() { | 1747 Convey("assigning to unsassiagnable fields is a simple error", f unc() { |
| 1739 o := &N0{ID: 100} | 1748 o := &N0{ID: 100} |
| 1740 mgs := getMGS(o) | 1749 mgs := getMGS(o) |
| 1741 err := mgs.SetMeta("kind", "hi") | 1750 err := mgs.SetMeta("kind", "hi") |
| 1742 » » » So(err.Error(), ShouldContainSubstring, "unexported fiel d") | 1751 » » » So(err, ShouldErrLike, "unexported field") |
| 1743 | 1752 |
| 1744 err = mgs.SetMeta("noob", "hi") | 1753 err = mgs.SetMeta("noob", "hi") |
| 1745 So(err, ShouldEqual, ErrMetaFieldUnset) | 1754 So(err, ShouldEqual, ErrMetaFieldUnset) |
| 1746 }) | 1755 }) |
| 1747 }) | 1756 }) |
| 1748 | 1757 |
| 1749 Convey("StructPLS Miscellaneous", t, func() { | 1758 Convey("StructPLS Miscellaneous", t, func() { |
| 1750 Convey("a simple struct has a default $kind", func() { | 1759 Convey("a simple struct has a default $kind", func() { |
| 1751 So(GetPLS(&Simple{}).GetAllMeta(), ShouldResemble, Prope rtyMap{ | 1760 So(GetPLS(&Simple{}).GetAllMeta(), ShouldResemble, Prope rtyMap{ |
| 1752 "$kind": []Property{mpNI("Simple")}, | 1761 "$kind": []Property{mpNI("Simple")}, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1823 v, err = mgs.GetMeta("doit") | 1832 v, err = mgs.GetMeta("doit") |
| 1824 So(err, ShouldBeNil) | 1833 So(err, ShouldBeNil) |
| 1825 So(v, ShouldBeTrue) | 1834 So(v, ShouldBeTrue) |
| 1826 So(okd.DoIt, ShouldEqual, On) | 1835 So(okd.DoIt, ShouldEqual, On) |
| 1827 | 1836 |
| 1828 Convey("Toggle fields REQUIRE a default", func() { | 1837 Convey("Toggle fields REQUIRE a default", func() { |
| 1829 type BadToggle struct { | 1838 type BadToggle struct { |
| 1830 Bad Toggle `gae:"$wut"` | 1839 Bad Toggle `gae:"$wut"` |
| 1831 } | 1840 } |
| 1832 pls := GetPLS(&BadToggle{}) | 1841 pls := GetPLS(&BadToggle{}) |
| 1833 » » » » So(pls.Problem().Error(), ShouldContainSubstring , "bad/missing default") | 1842 » » » » So(pls.Problem(), ShouldErrLike, "bad/missing de fault") |
| 1834 }) | 1843 }) |
| 1835 }) | 1844 }) |
| 1836 | 1845 |
| 1837 Convey("meta fields can be saved", func() { | 1846 Convey("meta fields can be saved", func() { |
| 1838 type OKDefaults struct { | 1847 type OKDefaults struct { |
| 1839 When string `gae:"$when,tomorrow"` | 1848 When string `gae:"$when,tomorrow"` |
| 1840 Amount int64 `gae:"$amt,100"` | 1849 Amount int64 `gae:"$amt,100"` |
| 1841 } | 1850 } |
| 1842 pls := GetPLS(&OKDefaults{}) | 1851 pls := GetPLS(&OKDefaults{}) |
| 1843 pm, err := pls.Save(true) | 1852 pm, err := pls.Save(true) |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1907 So(mgs.SetMeta("foo", 20), ShouldBeNil) | 1916 So(mgs.SetMeta("foo", 20), ShouldBeNil) |
| 1908 So(o.ID, ShouldEqual, DerivedString("nerds")) | 1917 So(o.ID, ShouldEqual, DerivedString("nerds")) |
| 1909 So(o.Foo, ShouldEqual, DerivedInt(20)) | 1918 So(o.Foo, ShouldEqual, DerivedInt(20)) |
| 1910 }) | 1919 }) |
| 1911 | 1920 |
| 1912 Convey("Bad default meta type", func() { | 1921 Convey("Bad default meta type", func() { |
| 1913 type BadDefault struct { | 1922 type BadDefault struct { |
| 1914 Val time.Time `gae:"$meta,tomorrow"` | 1923 Val time.Time `gae:"$meta,tomorrow"` |
| 1915 } | 1924 } |
| 1916 pls := GetPLS(&BadDefault{}) | 1925 pls := GetPLS(&BadDefault{}) |
| 1917 » » » So(pls.Problem().Error(), ShouldContainSubstring, "bad t ype") | 1926 » » » So(pls.Problem(), ShouldErrLike, "bad type") |
| 1918 }) | 1927 }) |
| 1919 | 1928 |
| 1920 Convey("MetaGetterSetter implementation (IDParser)", func() { | 1929 Convey("MetaGetterSetter implementation (IDParser)", func() { |
| 1921 idp := &IDParser{parent: "moo", id: 100} | 1930 idp := &IDParser{parent: "moo", id: 100} |
| 1922 mgs := getMGS(idp) | 1931 mgs := getMGS(idp) |
| 1923 » » » So(mgs.GetMetaDefault("id", ""), ShouldEqual, "moo|100") | 1932 » » » v, err := GetMetaDefault(mgs, "id", "") |
| 1924 » » » So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "CoolKin d") | 1933 » » » So(err, ShouldBeNil) |
| 1934 » » » So(v, ShouldEqual, "moo|100") | |
| 1935 | |
| 1936 » » » v, err = GetMetaDefault(mgs, "kind", "") | |
| 1937 » » » So(err, ShouldBeNil) | |
| 1938 » » » So(v, ShouldEqual, "CoolKind") | |
| 1925 | 1939 |
| 1926 So(mgs.SetMeta("kind", "Something"), ShouldErrLike, "une xported field") | 1940 So(mgs.SetMeta("kind", "Something"), ShouldErrLike, "une xported field") |
| 1927 So(mgs.SetMeta("id", "happy|27"), ShouldBeNil) | 1941 So(mgs.SetMeta("id", "happy|27"), ShouldBeNil) |
| 1928 | 1942 |
| 1929 So(idp.parent, ShouldEqual, "happy") | 1943 So(idp.parent, ShouldEqual, "happy") |
| 1930 So(idp.id, ShouldEqual, 27) | 1944 So(idp.id, ShouldEqual, 27) |
| 1931 | 1945 |
| 1932 So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{ | 1946 So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{ |
| 1933 "$id": {mpNI("happy|27")}, | 1947 "$id": {mpNI("happy|27")}, |
| 1934 "$kind": {mpNI("CoolKind")}, | 1948 "$kind": {mpNI("CoolKind")}, |
| 1935 }) | 1949 }) |
| 1936 }) | 1950 }) |
| 1937 | 1951 |
| 1938 Convey("MetaGetterSetter implementation (KindOverride)", func() { | 1952 Convey("MetaGetterSetter implementation (KindOverride)", func() { |
| 1939 ko := &KindOverride{ID: 20} | 1953 ko := &KindOverride{ID: 20} |
| 1940 mgs := getMGS(ko) | 1954 mgs := getMGS(ko) |
| 1941 » » » So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "KindOve rride") | 1955 » » » v, err := GetMetaDefault(mgs, "kind", "") |
| 1956 » » » So(err, ShouldBeNil) | |
| 1957 » » » So(v, ShouldEqual, "KindOverride") | |
| 1942 | 1958 |
| 1943 ko.customKind = "something" | 1959 ko.customKind = "something" |
| 1944 » » » So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "somethi ng") | 1960 » » » v, err = GetMetaDefault(mgs, "kind", "") |
| 1961 » » » So(err, ShouldBeNil) | |
| 1962 » » » So(v, ShouldEqual, "something") | |
| 1945 | 1963 |
| 1946 So(mgs.SetMeta("kind", "Nerp"), ShouldBeNil) | 1964 So(mgs.SetMeta("kind", "Nerp"), ShouldBeNil) |
| 1947 So(ko.customKind, ShouldEqual, "Nerp") | 1965 So(ko.customKind, ShouldEqual, "Nerp") |
| 1948 | 1966 |
| 1949 So(mgs.SetMeta("kind", "KindOverride"), ShouldBeNil) | 1967 So(mgs.SetMeta("kind", "KindOverride"), ShouldBeNil) |
| 1950 So(ko.customKind, ShouldEqual, "") | 1968 So(ko.customKind, ShouldEqual, "") |
| 1951 | 1969 |
| 1952 So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{ | 1970 So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{ |
| 1953 "$id": {mpNI(20)}, | 1971 "$id": {mpNI(20)}, |
| 1954 "$kind": {mpNI("KindOverride")}, | 1972 "$kind": {mpNI("KindOverride")}, |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1977 So(pls.SetMeta("id", "sup|1337"), ShouldBeNil) | 1995 So(pls.SetMeta("id", "sup|1337"), ShouldBeNil) |
| 1978 So(ide.EmbeddedID, ShouldResemble, EmbeddedID{"sup", 133 7}) | 1996 So(ide.EmbeddedID, ShouldResemble, EmbeddedID{"sup", 133 7}) |
| 1979 | 1997 |
| 1980 So(pls.GetAllMeta(), ShouldResembleV, PropertyMap{ | 1998 So(pls.GetAllMeta(), ShouldResembleV, PropertyMap{ |
| 1981 "$id": {mpNI("sup|1337")}, | 1999 "$id": {mpNI("sup|1337")}, |
| 1982 "$kind": {mpNI("IDEmbedder")}, | 2000 "$kind": {mpNI("IDEmbedder")}, |
| 1983 }) | 2001 }) |
| 1984 }) | 2002 }) |
| 1985 }) | 2003 }) |
| 1986 } | 2004 } |
| OLD | NEW |