same bug as #377, one level up: StartOfMinute/EndOfMinute rebuilt the time with time.Date, so in a repeated hour new york 01:34:49 EST got a minute ending before it. they now copy the instance and subtract the local seconds, keeping the instant, location and offset (not Truncate(time.Minute), which breaks lmt offsets with seconds).
765 lines
21 KiB
Go
765 lines
21 KiB
Go
package carbon
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
type BoundarySuite struct {
|
|
suite.Suite
|
|
}
|
|
|
|
func TestBoundarySuite(t *testing.T) {
|
|
suite.Run(t, new(BoundarySuite))
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_SecondBoundariesAtOffsetTransitions() {
|
|
for _, test := range []struct {
|
|
name string
|
|
zone string
|
|
inputUTC time.Time
|
|
}{
|
|
{"New York first occurrence", "America/New_York", time.Date(2026, 11, 1, 5, 34, 49, 123456789, time.UTC)},
|
|
{"New York second occurrence", "America/New_York", time.Date(2026, 11, 1, 6, 34, 49, 123456789, time.UTC)},
|
|
{"Lord Howe first occurrence", "Australia/Lord_Howe", time.Date(2026, 4, 4, 14, 45, 49, 123456789, time.UTC)},
|
|
{"Lord Howe second occurrence", "Australia/Lord_Howe", time.Date(2026, 4, 4, 15, 15, 49, 123456789, time.UTC)},
|
|
{"Algiers second-offset transition", "Africa/Algiers", time.Date(1891, 3, 15, 23, 48, 22, 123456789, time.UTC)},
|
|
{"Monrovia forward transition", "Africa/Monrovia", time.Date(1972, 1, 7, 0, 44, 30, 123456789, time.UTC)},
|
|
{"UTC control", "UTC", time.Date(2026, 1, 2, 12, 34, 49, 123456789, time.UTC)},
|
|
} {
|
|
s.Run(test.name, func() {
|
|
loc, err := time.LoadLocation(test.zone)
|
|
s.Require().NoError(err)
|
|
input := test.inputUTC.In(loc)
|
|
c := NewCarbon(input).SetWeekStartsAt(Sunday)
|
|
start, end := c.StartOfSecond(), c.EndOfSecond()
|
|
s.Equal(input.Unix(), start.StdTime().Unix())
|
|
s.Equal(input.Unix(), end.StdTime().Unix())
|
|
s.Equal(0, start.Nanosecond())
|
|
s.Equal(MaxNanosecond, end.Nanosecond())
|
|
s.Same(loc, start.StdTime().Location())
|
|
s.Same(loc, end.StdTime().Location())
|
|
s.Equal(Sunday, start.WeekStartsAt())
|
|
s.Equal(Sunday, end.WeekStartsAt())
|
|
s.Equal(input, c.StdTime())
|
|
})
|
|
}
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_MinuteBoundariesAtOffsetTransitions() {
|
|
for _, test := range []struct {
|
|
name string
|
|
zone string
|
|
inputUTC time.Time
|
|
}{
|
|
{"New York first occurrence", "America/New_York", time.Date(2026, 11, 1, 5, 34, 49, 123456789, time.UTC)},
|
|
{"New York second occurrence", "America/New_York", time.Date(2026, 11, 1, 6, 34, 49, 123456789, time.UTC)},
|
|
{"Lord Howe first occurrence", "Australia/Lord_Howe", time.Date(2026, 4, 4, 14, 45, 49, 123456789, time.UTC)},
|
|
{"Lord Howe second occurrence", "Australia/Lord_Howe", time.Date(2026, 4, 4, 15, 15, 49, 123456789, time.UTC)},
|
|
{"Monrovia second-based offset", "Africa/Monrovia", time.Date(1960, 6, 15, 12, 34, 49, 123456789, time.UTC)},
|
|
{"UTC control", "UTC", time.Date(2026, 1, 2, 12, 34, 49, 123456789, time.UTC)},
|
|
} {
|
|
s.Run(test.name, func() {
|
|
loc, err := time.LoadLocation(test.zone)
|
|
s.Require().NoError(err)
|
|
input := test.inputUTC.In(loc)
|
|
startUnix := input.Unix() - int64(input.Second())
|
|
c := NewCarbon(input).SetWeekStartsAt(Sunday)
|
|
start, end := c.StartOfMinute(), c.EndOfMinute()
|
|
s.Equal(startUnix, start.StdTime().Unix())
|
|
s.Equal(startUnix+MaxSecond, end.StdTime().Unix())
|
|
s.Equal(0, start.Nanosecond())
|
|
s.Equal(MaxNanosecond, end.Nanosecond())
|
|
s.Same(loc, start.StdTime().Location())
|
|
s.Same(loc, end.StdTime().Location())
|
|
s.Equal(Sunday, start.WeekStartsAt())
|
|
s.Equal(Sunday, end.WeekStartsAt())
|
|
s.Equal(input, c.StdTime())
|
|
})
|
|
}
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfCentury() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfCentury()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfCentury()
|
|
s.False(c.HasError())
|
|
s.Equal("0000-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfCentury()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfCentury()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2000-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfCentury().ToString())
|
|
s.Equal("2000-01-01 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfCentury().ToString())
|
|
s.Equal("2000-01-01 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfCentury().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfCentury() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfCentury()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfCentury()
|
|
s.False(c.HasError())
|
|
s.Equal("0099-12-31 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfCentury()
|
|
s.False(c.HasError())
|
|
s.Empty(c.String())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfCentury()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2099-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfCentury().ToString())
|
|
s.Equal("2099-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfCentury().ToString())
|
|
s.Equal("2099-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfCentury().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfDecade() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfDecade()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfDecade()
|
|
s.False(c.HasError())
|
|
s.Equal("0000-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfDecade()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfDecade()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfDecade().ToString())
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfDecade().ToString())
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfDecade().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfDecade() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfDecade()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfDecade()
|
|
s.False(c.HasError())
|
|
s.Equal("0009-12-31 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfDecade()
|
|
s.False(c.HasError())
|
|
s.Empty(c.String())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfDecade()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2029-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfDecade().ToString())
|
|
s.Equal("2029-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfDecade().ToString())
|
|
s.Equal("2029-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfDecade().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfYear() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfYear()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfYear()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfYear()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfYear()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfYear().ToString())
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfYear().ToString())
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfYear().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfYear() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfYear()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfYear()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-12-31 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfYear()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfYear()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfYear().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfYear().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfYear().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfQuarter() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfQuarter()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfQuarter()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfQuarter()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfQuarter()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfQuarter().ToString())
|
|
s.Equal("2020-07-01 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfQuarter().ToString())
|
|
s.Equal("2020-10-01 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfQuarter().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfQuarter() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfQuarter()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfQuarter()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-03-31 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfQuarter()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfQuarter()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-03-31 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfQuarter().ToString())
|
|
s.Equal("2020-09-30 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfQuarter().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfQuarter().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfMonth() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfMonth()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfMonth()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfMonth()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfMonth()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfMonth().ToString())
|
|
s.Equal("2020-08-01 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfMonth().ToString())
|
|
s.Equal("2020-12-01 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfMonth().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfMonth() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfMonth()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfMonth()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-31 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfMonth()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfMonth()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-31 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfMonth().ToString())
|
|
s.Equal("2020-08-31 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfMonth().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfMonth().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfWeek() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfWeek()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfWeek()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfWeek()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfWeek()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2019-12-30 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfWeek().ToString())
|
|
s.Equal("2020-08-10 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfWeek().ToString())
|
|
s.Equal("2020-12-28 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfWeek().ToString())
|
|
s.Equal("2025-04-07 00:00:00 +0000 UTC", Parse("2025-04-07 00:00:00").StartOfWeek().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfWeek() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfWeek()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfWeek()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-07 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfWeek()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfWeek()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-05 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfWeek().ToString())
|
|
s.Equal("2020-08-16 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfWeek().ToString())
|
|
s.Equal("2021-01-03 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfWeek().ToString())
|
|
s.Equal("2025-04-13 23:59:59.999999999 +0000 UTC", Parse("2025-04-13 00:00:00").EndOfWeek().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfDay() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfDay()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfDay()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfDay()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfDay()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfDay().ToString())
|
|
s.Equal("2020-08-15 00:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfDay().ToString())
|
|
s.Equal("2020-12-31 00:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfDay().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfDay() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfDay()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfDay()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 23:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfDay()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfDay()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 23:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfDay().ToString())
|
|
s.Equal("2020-08-15 23:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfDay().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfDay().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfHour() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfHour()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfHour()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfHour()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfHour()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfHour().ToString())
|
|
s.Equal("2020-08-15 12:00:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfHour().ToString())
|
|
s.Equal("2020-12-31 23:00:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfHour().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfHour() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfHour()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfHour()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:59:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfHour()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfHour()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:59:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfHour().ToString())
|
|
s.Equal("2020-08-15 12:59:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfHour().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfHour().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfMinute() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfMinute()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfMinute()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfMinute()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfMinute()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfMinute().ToString())
|
|
s.Equal("2020-08-15 12:30:00 +0000 UTC", Parse("2020-08-15 12:30:30").StartOfMinute().ToString())
|
|
s.Equal("2020-12-31 23:59:00 +0000 UTC", Parse("2020-12-31 23:59:59").StartOfMinute().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfMinute() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfMinute()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfMinute()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:59.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfMinute()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfMinute()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:59.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfMinute().ToString())
|
|
s.Equal("2020-08-15 12:30:59.999999999 +0000 UTC", Parse("2020-08-15 12:30:30").EndOfMinute().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59").EndOfMinute().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_StartOfSecond() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.StartOfSecond()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().StartOfSecond()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").StartOfSecond()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").StartOfSecond()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00 +0000 UTC", Parse("2020-01-01 00:00:00").StartOfSecond().ToString())
|
|
s.Equal("2020-08-15 12:30:30 +0000 UTC", Parse("2020-08-15 12:30:30.66666").StartOfSecond().ToString())
|
|
s.Equal("2020-12-31 23:59:59 +0000 UTC", Parse("2020-12-31 23:59:59.999999999").StartOfSecond().ToString())
|
|
})
|
|
}
|
|
|
|
func (s *BoundarySuite) TestCarbon_EndOfSecond() {
|
|
s.Run("nil carbon", func() {
|
|
var c *Carbon
|
|
c = nil
|
|
c = c.EndOfSecond()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("zero carbon", func() {
|
|
c := NewCarbon().EndOfSecond()
|
|
s.False(c.HasError())
|
|
s.Equal("0001-01-01 00:00:00.999999999 +0000 UTC", c.ToString())
|
|
})
|
|
|
|
s.Run("empty carbon", func() {
|
|
c := Parse("").EndOfSecond()
|
|
s.False(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("error carbon", func() {
|
|
c := Parse("xxx").EndOfSecond()
|
|
s.True(c.HasError())
|
|
s.Empty(c.ToString())
|
|
})
|
|
|
|
s.Run("valid carbon", func() {
|
|
s.Equal("2020-01-01 00:00:00.999999999 +0000 UTC", Parse("2020-01-01 00:00:00").EndOfSecond().ToString())
|
|
s.Equal("2020-08-15 12:30:30.999999999 +0000 UTC", Parse("2020-08-15 12:30:30.66666").EndOfSecond().ToString())
|
|
s.Equal("2020-12-31 23:59:59.999999999 +0000 UTC", Parse("2020-12-31 23:59:59.999999999").EndOfSecond().ToString())
|
|
})
|
|
}
|