OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package gae |
| 6 |
| 7 import ( |
| 8 "math" |
| 9 "testing" |
| 10 "time" |
| 11 |
| 12 . "github.com/smartystreets/goconvey/convey" |
| 13 ) |
| 14 |
| 15 type myint int |
| 16 type mybool bool |
| 17 type mystring string |
| 18 type myfloat float32 |
| 19 |
| 20 func TestProperties(t *testing.T) { |
| 21 t.Parallel() |
| 22 |
| 23 Convey("Test DSProperty", t, func() { |
| 24 Convey("Construction", func() { |
| 25 Convey("empty", func() { |
| 26 pv := DSProperty{} |
| 27 So(pv.Value(), ShouldBeNil) |
| 28 So(pv.NoIndex(), ShouldBeFalse) |
| 29 So(pv.Type().String(), ShouldEqual, "DSPTNull") |
| 30 }) |
| 31 Convey("set", func() { |
| 32 pv := DSProperty{} |
| 33 pv.SetValue(100, true) |
| 34 So(pv.Value(), ShouldHaveSameTypeAs, int64(100)) |
| 35 So(pv.Value(), ShouldEqual, 100) |
| 36 So(pv.NoIndex(), ShouldBeTrue) |
| 37 So(pv.Type().String(), ShouldEqual, "DSPTInt") |
| 38 |
| 39 pv.SetValue(nil, false) |
| 40 So(pv.Value(), ShouldBeNil) |
| 41 So(pv.NoIndex(), ShouldBeFalse) |
| 42 So(pv.Type().String(), ShouldEqual, "DSPTNull") |
| 43 }) |
| 44 Convey("derived types", func() { |
| 45 Convey("int", func() { |
| 46 pv := DSProperty{} |
| 47 pv.SetValue(myint(19), false) |
| 48 So(pv.Value(), ShouldHaveSameTypeAs, int
64(19)) |
| 49 So(pv.Value(), ShouldEqual, 19) |
| 50 So(pv.NoIndex(), ShouldBeFalse) |
| 51 So(pv.Type().String(), ShouldEqual, "DSP
TInt") |
| 52 }) |
| 53 Convey("bool (true)", func() { |
| 54 pv := DSProperty{} |
| 55 pv.SetValue(mybool(true), false) |
| 56 So(pv.Value(), ShouldBeTrue) |
| 57 So(pv.NoIndex(), ShouldBeFalse) |
| 58 So(pv.Type().String(), ShouldEqual, "DSP
TBoolTrue") |
| 59 }) |
| 60 Convey("string", func() { |
| 61 pv := DSProperty{} |
| 62 pv.SetValue(mystring("sup"), false) |
| 63 So(pv.Value(), ShouldEqual, "sup") |
| 64 So(pv.NoIndex(), ShouldBeFalse) |
| 65 So(pv.Type().String(), ShouldEqual, "DSP
TString") |
| 66 }) |
| 67 Convey("BSKey is distinquished", func() { |
| 68 pv := DSProperty{} |
| 69 pv.SetValue(BSKey("sup"), false) |
| 70 So(pv.Value(), ShouldEqual, BSKey("sup")
) |
| 71 So(pv.NoIndex(), ShouldBeFalse) |
| 72 So(pv.Type().String(), ShouldEqual, "DSP
TBlobKey") |
| 73 }) |
| 74 Convey("float", func() { |
| 75 pv := DSProperty{} |
| 76 pv.SetValue(myfloat(19.7), false) |
| 77 So(pv.Value(), ShouldHaveSameTypeAs, flo
at64(19.7)) |
| 78 So(pv.Value(), ShouldEqual, float32(19.7
)) |
| 79 So(pv.NoIndex(), ShouldBeFalse) |
| 80 So(pv.Type().String(), ShouldEqual, "DSP
TFloat") |
| 81 }) |
| 82 }) |
| 83 Convey("bad type", func() { |
| 84 pv := DSProperty{} |
| 85 err := pv.SetValue(complex(100, 29), false) |
| 86 So(err.Error(), ShouldContainSubstring, "has bad
type complex") |
| 87 So(pv.Value(), ShouldBeNil) |
| 88 So(pv.NoIndex(), ShouldBeFalse) |
| 89 So(pv.Type().String(), ShouldEqual, "DSPTNull") |
| 90 }) |
| 91 Convey("invalid GeoPoint", func() { |
| 92 pv := DSProperty{} |
| 93 err := pv.SetValue(DSGeoPoint{-1000, 0}, false) |
| 94 So(err.Error(), ShouldContainSubstring, "invalid
GeoPoint value") |
| 95 So(pv.Value(), ShouldBeNil) |
| 96 So(pv.NoIndex(), ShouldBeFalse) |
| 97 So(pv.Type().String(), ShouldEqual, "DSPTNull") |
| 98 }) |
| 99 Convey("invalid time", func() { |
| 100 pv := DSProperty{} |
| 101 err := pv.SetValue(time.Now(), false) |
| 102 So(err.Error(), ShouldContainSubstring, "time va
lue has wrong Location") |
| 103 |
| 104 err = pv.SetValue(time.Unix(math.MaxInt64, 0).UT
C(), false) |
| 105 So(err.Error(), ShouldContainSubstring, "time va
lue out of range") |
| 106 So(pv.Value(), ShouldBeNil) |
| 107 So(pv.NoIndex(), ShouldBeFalse) |
| 108 So(pv.Type().String(), ShouldEqual, "DSPTNull") |
| 109 }) |
| 110 Convey("time gets rounded", func() { |
| 111 pv := DSProperty{} |
| 112 now := time.Now().In(time.UTC) |
| 113 now = now.Round(time.Microsecond).Add(time.Nanos
econd * 313) |
| 114 pv.SetValue(now, false) |
| 115 So(pv.Value(), ShouldHappenBefore, now) |
| 116 So(pv.NoIndex(), ShouldBeFalse) |
| 117 So(pv.Type().String(), ShouldEqual, "DSPTTime") |
| 118 }) |
| 119 Convey("[]byte coerces NoIndex", func() { |
| 120 pv := DSProperty{} |
| 121 pv.SetValue([]byte("hello"), false) |
| 122 So(pv.Value(), ShouldResemble, []byte("hello")) |
| 123 So(pv.NoIndex(), ShouldBeTrue) |
| 124 So(pv.Type().String(), ShouldEqual, "DSPTBytes") |
| 125 }) |
| 126 Convey("ByteString allows !NoIndex", func() { |
| 127 pv := DSProperty{} |
| 128 pv.SetValue(DSByteString("hello"), false) |
| 129 So(pv.Value(), ShouldResemble, DSByteString("hel
lo")) |
| 130 So(pv.NoIndex(), ShouldBeFalse) |
| 131 So(pv.Type().String(), ShouldEqual, "DSPTBytes") |
| 132 }) |
| 133 }) |
| 134 }) |
| 135 } |
| 136 |
| 137 func TestDSPropertyMapImpl(t *testing.T) { |
| 138 t.Parallel() |
| 139 |
| 140 Convey("DSPropertyMap load/save err conditions", t, func() { |
| 141 Convey("nil", func() { |
| 142 pm := (*DSPropertyMap)(nil) |
| 143 _, err := pm.Load(nil) |
| 144 So(err.Error(), ShouldContainSubstring, "nil DSPropertyM
ap") |
| 145 |
| 146 _, err = pm.Save() |
| 147 So(err.Error(), ShouldContainSubstring, "nil DSPropertyM
ap") |
| 148 }) |
| 149 Convey("empty", func() { |
| 150 pm := DSPropertyMap{} |
| 151 _, err := pm.Load(DSPropertyMap{"hello": {DSProperty{}}}
) |
| 152 So(err, ShouldBeNil) |
| 153 So(pm, ShouldResemble, DSPropertyMap{"hello": {DSPropert
y{}}}) |
| 154 |
| 155 // it can also self-initialize |
| 156 pm = DSPropertyMap(nil) |
| 157 _, err = pm.Load(DSPropertyMap{"hello": {DSProperty{}}}) |
| 158 So(err, ShouldBeNil) |
| 159 So(pm, ShouldResemble, DSPropertyMap{"hello": {DSPropert
y{}}}) |
| 160 |
| 161 npm, _ := pm.Save() |
| 162 So(npm, ShouldResemble, pm) |
| 163 }) |
| 164 }) |
| 165 } |
OLD | NEW |