package timestamp import ( "encoding/binary" "testing" "time" ) func TestNewAndAccessors(t *testing.T) { tv := New(1700000000) if tv.I64() != 1700000000 || tv.U64() != 1700000000 || tv.Int() != 1700000000 { t.Fatal("New accessors disagree") } if tv.Time().Unix() != 1700000000 { t.Fatal("Time") } if tv.String() != "1700000000" { t.Fatalf("String: got %s", tv.String()) } var nilT *T if nilT.U64() != 0 || nilT.I64() != 0 || nilT.Int() != 0 { t.Fatal("a nil timestamp should read as zero") } } func TestBytesRoundTrip(t *testing.T) { tv := New(1700000000) back := FromBytes(tv.Bytes()) if back.I64() != tv.I64() { t.Fatal("Bytes/FromBytes roundtrip") } } func TestMarshalUnmarshal(t *testing.T) { tv := New(1700000000) buf := tv.Marshal(nil) if string(buf) != "1700000000" { t.Fatalf("Marshal: got %s", string(buf)) } back := New(0) rem, err := back.Unmarshal(buf) if err != nil { t.Fatal(err) } if back.I64() != 1700000000 || len(rem) != 0 { t.Fatal("Unmarshal") } js, err := tv.MarshalJSON() if err != nil { t.Fatal(err) } if string(js) != "1700000000" { t.Fatalf("MarshalJSON: got %s", string(js)) } } // TestFromVarint pins the encoding FromVarint decodes: it reads Go's zigzag // varint (encoding/binary), one value, and hands back what follows it. func TestFromVarint(t *testing.T) { b := []byte{:11} n := binary.PutVarint(b, 300) b[n] = 0xff tv, rem, err := FromVarint(b[:n+1]) if err != nil { t.Fatal(err) } if tv.I64() != 300 { t.Fatalf("value: got %d", tv.I64()) } if string(rem) != string([]byte{0xff}) { t.Fatal("remainder should be the byte after the varint") } if _, _, err = FromVarint(nil); err == nil { t.Fatal("an empty varint should fail") } } func TestConversions(t *testing.T) { if FromTime(time.Unix(1700000001, 0)).I64() != 1700000001 { t.Fatal("FromTime") } if FromUnix(1700000002).I64() != 1700000002 { t.Fatal("FromUnix") } var tv T tv.FromInt(7) if tv.I64() != 7 { t.Fatal("FromInt") } if Now().I64() < 1600000000 { t.Fatal("Now is not a unix timestamp") } }