--- /dev/null
+package json
+
+import (
+ "encoding/json"
+ "strconv"
+ "testing"
+ "time"
+)
+
+func TestUnmarshalDuration(t *testing.T) {
+ successCases := []string{
+ `1000`, // this is an "integer"
+ `"1000ms"`,
+ `"1000000000ns"`,
+ `"1s"`,
+ }
+
+ for _, c := range successCases {
+ var dur Duration
+ err := json.Unmarshal([]byte(c), &dur)
+ if err != nil {
+ t.Errorf("unexpected error %v", err)
+ }
+
+ var want float64 = 1 // all of our inputs equal 1 second
+ if got := dur.Seconds(); got != want {
+ t.Errorf("Duration.UnmarshalJSON(%q) = %f want %f", c, got, want)
+ }
+ }
+
+ negativeCases := []string{
+ `-1000`,
+ `"-1000ms"`,
+ }
+
+ for _, c := range negativeCases {
+ var dur Duration
+ wantErr := "invalid json.Duration: Duration cannot be less than 0"
+ err := json.Unmarshal([]byte(c), &dur)
+ if err.Error() != wantErr {
+ t.Errorf("wanted error %s, got %s", wantErr, err)
+ }
+ }
+
+ // Null case
+ var dur Duration
+ err := json.Unmarshal([]byte("null"), &dur)
+ if err != nil {
+ t.Errorf("unexpected error %v", err)
+ }
+
+ if dur.Duration != 0 {
+ t.Errorf(`Duration.UnmarshalJSON("null") = %v want 0`, dur.Duration)
+ }
+}
+
+func TestMarshalDuration(t *testing.T) {
+ dur := Duration{
+ Duration: time.Second,
+ }
+ b, err := json.Marshal(dur)
+ if err != nil {
+ t.Errorf("unexpected error %v", err)
+ }
+
+ got, err := strconv.Atoi(string(b))
+ if err != nil {
+ t.Fatal(err)
+ }
+ want := 1000
+ if got != want {
+ t.Errorf("wanted %d, got %d", want, got)
+ }
+}