pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/timeutil/timeutil_test.go (about)

     1  package timeutil
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                         Copyright (c) 2022 ESSENTIAL KAOS                          //
     6  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  import (
    11  	"bytes"
    12  	"testing"
    13  	"time"
    14  
    15  	. "pkg.re/essentialkaos/check.v1"
    16  )
    17  
    18  // ////////////////////////////////////////////////////////////////////////////////// //
    19  
    20  func Test(t *testing.T) { TestingT(t) }
    21  
    22  type TimeUtilSuite struct{}
    23  
    24  // ////////////////////////////////////////////////////////////////////////////////// //
    25  
    26  var _ = Suite(&TimeUtilSuite{})
    27  
    28  func (s *TimeUtilSuite) TestPretyDuration(c *C) {
    29  	c.Assert(PrettyDuration(time.Duration(59000000000)), Equals, "59 seconds")
    30  	c.Assert(PrettyDuration(120), Equals, "2 minutes")
    31  	c.Assert(PrettyDuration(int16(120)), Equals, "2 minutes")
    32  	c.Assert(PrettyDuration(int32(120)), Equals, "2 minutes")
    33  	c.Assert(PrettyDuration(int64(120)), Equals, "2 minutes")
    34  	c.Assert(PrettyDuration(uint16(120)), Equals, "2 minutes")
    35  	c.Assert(PrettyDuration(uint32(120)), Equals, "2 minutes")
    36  	c.Assert(PrettyDuration(uint64(120)), Equals, "2 minutes")
    37  	c.Assert(PrettyDuration(uint(120)), Equals, "2 minutes")
    38  	c.Assert(PrettyDuration(float32(120)), Equals, "2 minutes")
    39  	c.Assert(PrettyDuration(float64(120)), Equals, "2 minutes")
    40  	c.Assert(PrettyDuration(3720), Equals, "1 hour and 2 minutes")
    41  	c.Assert(PrettyDuration(3720), Equals, "1 hour and 2 minutes")
    42  	c.Assert(PrettyDuration(3720), Equals, "1 hour and 2 minutes")
    43  	c.Assert(PrettyDuration(3720), Equals, "1 hour and 2 minutes")
    44  	c.Assert(PrettyDuration(60), Equals, "1 minute")
    45  	c.Assert(PrettyDuration(1370137), Equals, "2 weeks 1 day 20 hours 35 minutes and 37 seconds")
    46  	c.Assert(PrettyDuration(0), Equals, "< 1 second")
    47  	c.Assert(PrettyDuration("string"), Equals, "")
    48  	c.Assert(PrettyDuration(time.Second/3), Equals, "333.3 ms")
    49  	c.Assert(PrettyDuration(time.Second/3669), Equals, "272.6 μs")
    50  	c.Assert(PrettyDuration(time.Second/366995), Equals, "2.72 μs")
    51  	c.Assert(PrettyDuration(time.Second/36698888), Equals, "27 ns")
    52  }
    53  
    54  func (s *TimeUtilSuite) TestPretyDurationInDays(c *C) {
    55  	c.Assert(PrettyDurationInDays("ABC"), Equals, "")
    56  	c.Assert(PrettyDurationInDays(120), Equals, "just now")
    57  	c.Assert(PrettyDurationInDays(7200), Equals, "today")
    58  	c.Assert(PrettyDurationInDays(90000), Equals, "1 day")
    59  	c.Assert(PrettyDurationInDays(1296000), Equals, "15 days")
    60  }
    61  
    62  func (s *TimeUtilSuite) TestShortDuration(c *C) {
    63  	c.Assert(ShortDuration(time.Duration(0)), Equals, "0:00")
    64  	c.Assert(ShortDuration(time.Duration(3546*time.Millisecond), false), Equals, "0:03")
    65  	c.Assert(ShortDuration(time.Duration(3546*time.Millisecond), true), Equals, "0:03.546")
    66  	c.Assert(ShortDuration(time.Duration(59000000000)), Equals, "0:59")
    67  	c.Assert(ShortDuration(60), Equals, "1:00")
    68  	c.Assert(ShortDuration(120), Equals, "2:00")
    69  	c.Assert(ShortDuration(2235), Equals, "37:15")
    70  	c.Assert(ShortDuration(1234567), Equals, "342:56:07")
    71  	c.Assert(ShortDuration(int16(1234)), Equals, "20:34")
    72  	c.Assert(ShortDuration(int32(1234)), Equals, "20:34")
    73  	c.Assert(ShortDuration(int64(1234)), Equals, "20:34")
    74  	c.Assert(ShortDuration(uint16(1234)), Equals, "20:34")
    75  	c.Assert(ShortDuration(uint32(1234)), Equals, "20:34")
    76  	c.Assert(ShortDuration(uint64(1234)), Equals, "20:34")
    77  	c.Assert(ShortDuration(uint(1234)), Equals, "20:34")
    78  	c.Assert(ShortDuration(float32(1234)), Equals, "20:34")
    79  	c.Assert(ShortDuration(float64(1234)), Equals, "20:34")
    80  	c.Assert(ShortDuration("ABCD"), Equals, "")
    81  }
    82  
    83  func (s *TimeUtilSuite) TestDurationToSeconds(c *C) {
    84  	c.Assert(SecondsToDuration(1), Equals, time.Second)
    85  	c.Assert(SecondsToDuration(1.5), Equals, 1500*time.Millisecond)
    86  	c.Assert(SecondsToDuration(3600), Equals, time.Hour)
    87  }
    88  
    89  func (s *TimeUtilSuite) TestSecondsToDuration(c *C) {
    90  	c.Assert(DurationToSeconds(time.Second/4), Equals, 0.25)
    91  }
    92  
    93  func (s *TimeUtilSuite) TestFormat(c *C) {
    94  	d := time.Unix(1388535309, 123456789).UTC()
    95  	d1 := time.Unix(1389744909, 123456789).UTC()
    96  
    97  	c.Assert(Format(d, "%%"), Equals, "%")
    98  	c.Assert(Format(d, "%a"), Equals, "Wed")
    99  	c.Assert(Format(d, "%A"), Equals, "Wednesday")
   100  	c.Assert(Format(d, "%b"), Equals, "Jan")
   101  	c.Assert(Format(d, "%B"), Equals, "January")
   102  	c.Assert(Format(d, "%c"), Equals, "Wed 01 Jan 2014 12:15:09 AM UTC")
   103  	c.Assert(Format(d, "%C"), Equals, "20")
   104  	c.Assert(Format(d, "%d"), Equals, "01")
   105  	c.Assert(Format(d, "%D"), Equals, "01/01/14")
   106  	c.Assert(Format(d, "%e"), Equals, " 1")
   107  	c.Assert(Format(d, "%F"), Equals, "2014-01-01")
   108  	c.Assert(Format(d, "%G"), Equals, "2014")
   109  	c.Assert(Format(d, "%H"), Equals, "00")
   110  	c.Assert(Format(d, "%I"), Equals, "12")
   111  	c.Assert(Format(d, "%j"), Equals, "001")
   112  	c.Assert(Format(d, "%k"), Equals, " 0")
   113  	c.Assert(Format(d, "%K"), Equals, "123")
   114  	c.Assert(Format(d, "%l"), Equals, "12")
   115  	c.Assert(Format(d, "%m"), Equals, "01")
   116  	c.Assert(Format(d, "%M"), Equals, "15")
   117  	c.Assert(Format(d, "%N"), Equals, "123456789")
   118  	c.Assert(Format(d, "%n"), Equals, "\n")
   119  	c.Assert(Format(d, "%p"), Equals, "am")
   120  	c.Assert(Format(d, "%P"), Equals, "AM")
   121  	c.Assert(Format(d, "%r"), Equals, "12:15:09 AM")
   122  	c.Assert(Format(d, "%R"), Equals, "00:15")
   123  	c.Assert(Format(d, "%s"), Equals, "1388535309")
   124  	c.Assert(Format(d, "%S"), Equals, "09")
   125  	c.Assert(Format(d, "%T"), Equals, "00:15:09")
   126  	c.Assert(Format(d, "%u"), Equals, "3")
   127  	c.Assert(Format(d, "%V"), Equals, "01")
   128  	c.Assert(Format(d, "%w"), Equals, "3")
   129  	c.Assert(Format(d, "%y"), Equals, "14")
   130  	c.Assert(Format(d, "%Y"), Equals, "2014")
   131  	c.Assert(Format(d, "%z"), Equals, "+0000")
   132  	c.Assert(Format(d, "%Z"), Equals, "UTC")
   133  	c.Assert(Format(d, "%:"), Equals, "+00:00")
   134  	c.Assert(Format(d, "%Q"), Equals, "%Q")
   135  	c.Assert(Format(d, "%1234"), Equals, "%1234")
   136  	c.Assert(Format(d, "%SSec"), Equals, "09Sec")
   137  	c.Assert(Format(d1, "%e"), Equals, "15")
   138  
   139  	replaceDateTag(time.Now(), bytes.NewBufferString(""), bytes.NewBufferString(""))
   140  }
   141  
   142  func (s *TimeUtilSuite) TestTinyDate(c *C) {
   143  	dt := time.Date(2015, 1, 1, 0, 0, 0, 0, time.Local)
   144  	td := TinyDate(dt.Unix())
   145  
   146  	c.Assert(td.Unix(), Equals, dt.Unix())
   147  	c.Assert(td.Time().Unix(), Equals, dt.Unix())
   148  }
   149  
   150  func (s *TimeUtilSuite) TestDateNames(c *C) {
   151  	c.Assert(getShortWeekday(time.Sunday), Equals, "Sun")
   152  	c.Assert(getShortWeekday(time.Monday), Equals, "Mon")
   153  	c.Assert(getShortWeekday(time.Tuesday), Equals, "Tue")
   154  	c.Assert(getShortWeekday(time.Wednesday), Equals, "Wed")
   155  	c.Assert(getShortWeekday(time.Thursday), Equals, "Thu")
   156  	c.Assert(getShortWeekday(time.Friday), Equals, "Fri")
   157  	c.Assert(getShortWeekday(time.Saturday), Equals, "Sat")
   158  	c.Assert(getShortWeekday(time.Weekday(7)), Equals, "")
   159  
   160  	c.Assert(getLongWeekday(time.Sunday), Equals, "Sunday")
   161  	c.Assert(getLongWeekday(time.Monday), Equals, "Monday")
   162  	c.Assert(getLongWeekday(time.Tuesday), Equals, "Tuesday")
   163  	c.Assert(getLongWeekday(time.Wednesday), Equals, "Wednesday")
   164  	c.Assert(getLongWeekday(time.Thursday), Equals, "Thursday")
   165  	c.Assert(getLongWeekday(time.Friday), Equals, "Friday")
   166  	c.Assert(getLongWeekday(time.Saturday), Equals, "Saturday")
   167  	c.Assert(getLongWeekday(time.Weekday(7)), Equals, "")
   168  
   169  	c.Assert(getShortMonth(time.Month(0)), Equals, "")
   170  	c.Assert(getShortMonth(time.January), Equals, "Jan")
   171  	c.Assert(getShortMonth(time.February), Equals, "Feb")
   172  	c.Assert(getShortMonth(time.March), Equals, "Mar")
   173  	c.Assert(getShortMonth(time.April), Equals, "Apr")
   174  	c.Assert(getShortMonth(time.May), Equals, "May")
   175  	c.Assert(getShortMonth(time.June), Equals, "Jun")
   176  	c.Assert(getShortMonth(time.July), Equals, "Jul")
   177  	c.Assert(getShortMonth(time.August), Equals, "Aug")
   178  	c.Assert(getShortMonth(time.September), Equals, "Sep")
   179  	c.Assert(getShortMonth(time.October), Equals, "Oct")
   180  	c.Assert(getShortMonth(time.November), Equals, "Nov")
   181  	c.Assert(getShortMonth(time.December), Equals, "Dec")
   182  
   183  	c.Assert(getLongMonth(time.Month(0)), Equals, "")
   184  	c.Assert(getLongMonth(time.January), Equals, "January")
   185  	c.Assert(getLongMonth(time.February), Equals, "February")
   186  	c.Assert(getLongMonth(time.March), Equals, "March")
   187  	c.Assert(getLongMonth(time.April), Equals, "April")
   188  	c.Assert(getLongMonth(time.May), Equals, "May")
   189  	c.Assert(getLongMonth(time.June), Equals, "June")
   190  	c.Assert(getLongMonth(time.July), Equals, "July")
   191  	c.Assert(getLongMonth(time.August), Equals, "August")
   192  	c.Assert(getLongMonth(time.September), Equals, "September")
   193  	c.Assert(getLongMonth(time.October), Equals, "October")
   194  	c.Assert(getLongMonth(time.November), Equals, "November")
   195  	c.Assert(getLongMonth(time.December), Equals, "December")
   196  
   197  	c.Assert(getWeekdayNum(time.Unix(1448193600, 0)), Equals, 7)
   198  }
   199  
   200  func (s *TimeUtilSuite) TestAMPM(c *C) {
   201  	c.Assert(getAMPMHour(time.Unix(1447838100, 0).UTC()), Equals, 9)
   202  	c.Assert(getAMPM(time.Unix(1447838100, 0).UTC(), true), Equals, "AM")
   203  	c.Assert(getAMPM(time.Unix(1447838100, 0).UTC(), false), Equals, "am")
   204  	c.Assert(getAMPMHour(time.Unix(1447881300, 0).UTC()), Equals, 9)
   205  	c.Assert(getAMPM(time.Unix(1447881300, 0).UTC(), true), Equals, "PM")
   206  	c.Assert(getAMPM(time.Unix(1447881300, 0).UTC(), false), Equals, "pm")
   207  }
   208  
   209  func (s *TimeUtilSuite) TestTimezone(c *C) {
   210  	ny, _ := time.LoadLocation("America/New_York")
   211  	msk, _ := time.LoadLocation("Europe/Moscow")
   212  
   213  	t := time.Unix(1447848900, 0)
   214  
   215  	c.Assert(getTimezone(t.UTC().In(ny), false), Equals, "-0500")
   216  	c.Assert(getTimezone(t.UTC().In(ny), true), Equals, "-05:00")
   217  	c.Assert(getTimezone(t.UTC().In(msk), false), Equals, "+0300")
   218  	c.Assert(getTimezone(t.UTC().In(msk), true), Equals, "+03:00")
   219  }
   220  
   221  func (s *TimeUtilSuite) TestDurationParsing(c *C) {
   222  	d, _ := ParseDuration("")
   223  	c.Assert(d, Equals, int64(0))
   224  
   225  	d, _ = ParseDuration("25s")
   226  	c.Assert(d, Equals, int64(25))
   227  
   228  	d, _ = ParseDuration("1m30s")
   229  	c.Assert(d, Equals, int64(90))
   230  
   231  	d, _ = ParseDuration("1h30m30s")
   232  	c.Assert(d, Equals, int64(5430))
   233  
   234  	d, _ = ParseDuration("1d3h30m30s")
   235  	c.Assert(d, Equals, int64(99030))
   236  
   237  	d, _ = ParseDuration("1w3d12h30m30s")
   238  	c.Assert(d, Equals, int64(909030))
   239  
   240  	d, _ = ParseDuration("10w")
   241  	c.Assert(d, Equals, int64(6048000))
   242  
   243  	d, _ = ParseDuration("180")
   244  	c.Assert(d, Equals, int64(180))
   245  
   246  	_, err := ParseDuration("180k")
   247  	c.Assert(err, NotNil)
   248  
   249  	_, err = ParseDuration("wm")
   250  	c.Assert(err, NotNil)
   251  
   252  	_, err = ParseDuration("9999999999999999999999999999999999999s")
   253  	c.Assert(err, NotNil)
   254  
   255  	_, err = ParseDuration("1h35m56")
   256  	c.Assert(err, NotNil)
   257  
   258  	d, _ = ParseDuration("30", 's')
   259  	c.Assert(d, Equals, int64(30))
   260  
   261  	d, _ = ParseDuration("25", 'm')
   262  	c.Assert(d, Equals, int64(1500))
   263  
   264  	d, _ = ParseDuration("14", 'h')
   265  	c.Assert(d, Equals, int64(50400))
   266  
   267  	d, _ = ParseDuration("5", 'd')
   268  	c.Assert(d, Equals, int64(432000))
   269  
   270  	d, _ = ParseDuration("2", 'w')
   271  	c.Assert(d, Equals, int64(1209600))
   272  
   273  	_, err = ParseDuration("9999999999999999999999999999999999999", 's')
   274  	c.Assert(err, NotNil)
   275  }
   276  
   277  func (s *TimeUtilSuite) TestHelpers(c *C) {
   278  	d := time.Date(2021, 1, 1, 12, 30, 15, 0, time.Local)
   279  
   280  	c.Assert(PrevDay(d), DeepEquals, time.Date(2020, 12, 31, 12, 30, 15, 0, time.Local))
   281  	c.Assert(PrevMonth(d), DeepEquals, time.Date(2020, 12, 1, 12, 30, 15, 0, time.Local))
   282  	c.Assert(PrevYear(d), DeepEquals, time.Date(2020, 1, 1, 12, 30, 15, 0, time.Local))
   283  	c.Assert(NextDay(d), DeepEquals, time.Date(2021, 1, 2, 12, 30, 15, 0, time.Local))
   284  	c.Assert(NextMonth(d), DeepEquals, time.Date(2021, 2, 1, 12, 30, 15, 0, time.Local))
   285  	c.Assert(NextYear(d), DeepEquals, time.Date(2022, 1, 1, 12, 30, 15, 0, time.Local))
   286  
   287  	d = time.Date(2021, 8, 1, 12, 30, 15, 0, time.Local)
   288  	c.Assert(PrevWorkday(d), DeepEquals, time.Date(2021, 7, 30, 12, 30, 15, 0, time.Local))
   289  	c.Assert(PrevWeekend(d), DeepEquals, time.Date(2021, 7, 31, 12, 30, 15, 0, time.Local))
   290  	c.Assert(NextWorkday(d), DeepEquals, time.Date(2021, 8, 2, 12, 30, 15, 0, time.Local))
   291  	c.Assert(NextWeekend(d), DeepEquals, time.Date(2021, 8, 7, 12, 30, 15, 0, time.Local))
   292  }
   293  
   294  // ////////////////////////////////////////////////////////////////////////////////// //
   295  
   296  func (s *TimeUtilSuite) BenchmarkParseDuration(c *C) {
   297  	for i := 0; i < c.N; i++ {
   298  		ParseDuration("1w2d3h10m12s")
   299  	}
   300  }
   301  
   302  func (s *TimeUtilSuite) BenchmarkFormat(c *C) {
   303  	ts := time.Now()
   304  
   305  	for i := 0; i < c.N; i++ {
   306  		Format(ts, "%Y/%m/%d %H:%M:%S")
   307  	}
   308  }