MegaBites-AI/Windows-powershell
0372
1# Copyright (c) Microsoft Corporation.2# Licensed under the MIT License.3 4Describe "Get-Date DRT Unit Tests" -Tags "CI" {5 It "Get-Date with all parameters returns proper results" {6 $date = [datetime]::Now + ([timespan]::new(0,0,30))7 $result = Get-Date -Date $date -Year 1973 -Month 2 -Day 22 -Hour 15 -Minute 40 -Second 10 -Millisecond 2008 $result | Should -BeOfType Datetime9 $result.Year | Should -Be 197310 $result.Month | Should -Be 211 $result.Day | Should -Be 2212 $result.Hour | Should -Be 1513 $result.Minute | Should -Be 4014 $result.Second | Should -Be 1015 $result.Millisecond | Should -Be 20016 }17 18 It "using -displayhint produces the correct output" {19 $d = Get-Date -Date:"Jan 1, 2020" -DisplayHint Date | Out-String20 $d.Trim() | Should -Be "Wednesday, January 1, 2020"21 }22 23 It "using -format produces the correct output" {24 Get-Date -Date:"Jan 1, 2020" -Format:"MMM-dd-yy" | Should -Be "Jan-01-20"25 }26 27 It "using -AsUTC produces the correct output" {28 (Get-Date -Date:"2020-01-01T00:00:00").Kind | Should -Be Unspecified29 (Get-Date -Date:"2020-01-01T00:00:00" -AsUTC).Kind | Should -Be Utc30 }31 32 It "using -uformat %s produces the correct output" {33 $seconds = Get-Date -Date:"Jan 1, 2020Z" -UFormat:"%s"34 35 $seconds | Should -Be "1577836800"36 if ($IsLinux) {37 $dateString = "01/01/2020 UTC"38 if ( (Get-PlatformInfo).Platform -eq "alpine" ) {39 $dateString = "2020-01-01"40 }41 $expected = date --date=${dateString} +%s42 $seconds | Should -Be $expected43 }44 }45 46 It "using -uformat 'ymdH' produces the correct output" {47 Get-Date -Date 0030-01-01T00:00:00 -UFormat %y/%m/%d-%H | Should -Be "30/01/01-00"48 }49 50 It "using -uformat 'aAbBcCdDehHIkljmMpr' produces the correct output" {51 Get-Date -Date 1/1/0030 -UFormat "%a%A%b%B%c%C%d%D%e%h%H%I%k%l%j%m%M%p%r" | Should -Be "TueTuesdayJanJanuaryTue 01 Jan 0030 00:00:0000101/01/30 1Jan0012 0120010100AM12:00:00 AM"52 }53 54 It "using -uformat 'sStTuUVwWxXyYZ' produces the correct output" {55 Get-Date -Date 1/1/0030 -UFormat %S%T%u%U%w%W%x%X%y%Y%% | Should -Be "0000:00:00202001/01/3000:00:00300030%"56 }57 58 # The 'week of year' test cases is from https://en.wikipedia.org/wiki/ISO_week_date59 It "using -uformat 'V' produces the correct output (<date>:<week>)" -TestCases @(60 @{date="1998-01-02"; week = "01"},61 @{date="1998-01-03"; week = "01"},62 @{date="2003-01-03"; week = "01"},63 @{date="2004-01-02"; week = "01"},64 @{date="2004-01-03"; week = "01"},65 @{date="2005-01-01"; week = "53"},66 @{date="2005-01-02"; week = "53"},67 @{date="2005-12-31"; week = "52"},68 @{date="2006-01-01"; week = "52"},69 @{date="2006-01-02"; week = "01"},70 @{date="2006-12-31"; week = "52"},71 @{date="2007-01-01"; week = "01"},72 @{date="2007-12-30"; week = "52"},73 @{date="2007-12-31"; week = "01"},74 @{date="2008-01-01"; week = "01"},75 @{date="2008-12-28"; week = "52"},76 @{date="2008-12-29"; week = "01"},77 @{date="2008-12-30"; week = "01"},78 @{date="2008-12-31"; week = "01"},79 @{date="2009-01-01"; week = "01"},80 @{date="2009-01-02"; week = "01"},81 @{date="2009-01-03"; week = "01"},82 @{date="2009-12-31"; week = "53"},83 @{date="2010-01-01"; week = "53"},84 @{date="2010-01-02"; week = "53"},85 @{date="2010-01-03"; week = "53"},86 @{date="2010-01-04"; week = "01"},87 @{date="2014-01-03"; week = "01"},88 @{date="2015-01-02"; week = "01"},89 @{date="2015-01-03"; week = "01"},90 @{date="2020-01-03"; week = "01"},91 @{date="2025-01-03"; week = "01"},92 @{date="2026-01-02"; week = "01"},93 @{date="2026-01-03"; week = "01"},94 @{date="2031-01-03"; week = "01"}95 ) {96 param($date, $week)97 Get-Date -Date $date -UFormat %V | Should -BeExactly $week98 }99 100 # Using the same test cases as V for ISO week date component parity, plus some more esoteric ones101 It "using -uformat 'G' produces the correct output (<date>:<year>)" -TestCases @(102 @{date="0055-12-31"; year = "0055"},103 @{date="0325-01-01"; year = "0325"},104 @{date="0777-01-01"; year = "0776"},105 @{date="1998-01-02"; year = "1998"},106 @{date="1998-01-03"; year = "1998"},107 @{date="2003-01-03"; year = "2003"},108 @{date="2004-01-02"; year = "2004"},109 @{date="2004-01-03"; year = "2004"},110 @{date="2005-01-01"; year = "2004"},111 @{date="2005-01-02"; year = "2004"},112 @{date="2005-12-31"; year = "2005"},113 @{date="2006-01-01"; year = "2005"},114 @{date="2006-01-02"; year = "2006"},115 @{date="2006-12-31"; year = "2006"},116 @{date="2007-01-01"; year = "2007"},117 @{date="2007-12-30"; year = "2007"},118 @{date="2007-12-31"; year = "2008"},119 @{date="2008-01-01"; year = "2008"},120 @{date="2008-12-28"; year = "2008"},121 @{date="2008-12-29"; year = "2009"},122 @{date="2008-12-30"; year = "2009"},123 @{date="2008-12-31"; year = "2009"},124 @{date="2009-01-01"; year = "2009"},125 @{date="2009-01-02"; year = "2009"},126 @{date="2009-01-03"; year = "2009"},127 @{date="2009-12-31"; year = "2009"},128 @{date="2010-01-01"; year = "2009"},129 @{date="2010-01-02"; year = "2009"},130 @{date="2010-01-03"; year = "2009"},131 @{date="2010-01-04"; year = "2010"},132 @{date="2014-01-03"; year = "2014"},133 @{date="2015-01-02"; year = "2015"},134 @{date="2015-01-03"; year = "2015"},135 @{date="2020-01-03"; year = "2020"},136 @{date="2025-01-03"; year = "2025"},137 @{date="2026-01-02"; year = "2026"},138 @{date="2026-01-03"; year = "2026"},139 @{date="2031-01-03"; year = "2031"}140 ) {141 param($date, $year)142 Get-Date -Date $date -UFormat %G | Should -BeExactly $year143 }144 145 # Using the same test cases as V for ISO week date component parity, plus some more esoteric ones146 It "using -uformat 'g' produces the correct output (<date>:<yy>" -TestCases @(147 @{date="0055-12-31"; yy = "55"},148 @{date="0325-01-01"; yy = "25"},149 @{date="0777-01-01"; yy = "76"},150 @{date="1998-01-02"; yy = "98"},151 @{date="1998-01-03"; yy = "98"},152 @{date="2003-01-03"; yy = "03"},153 @{date="2004-01-02"; yy = "04"},154 @{date="2004-01-03"; yy = "04"},155 @{date="2005-01-01"; yy = "04"},156 @{date="2005-01-02"; yy = "04"},157 @{date="2005-12-31"; yy = "05"},158 @{date="2006-01-01"; yy = "05"},159 @{date="2006-01-02"; yy = "06"},160 @{date="2006-12-31"; yy = "06"},161 @{date="2007-01-01"; yy = "07"},162 @{date="2007-12-30"; yy = "07"},163 @{date="2007-12-31"; yy = "08"},164 @{date="2008-01-01"; yy = "08"},165 @{date="2008-12-28"; yy = "08"},166 @{date="2008-12-29"; yy = "09"},167 @{date="2008-12-30"; yy = "09"},168 @{date="2008-12-31"; yy = "09"},169 @{date="2009-01-01"; yy = "09"},170 @{date="2009-01-02"; yy = "09"},171 @{date="2009-01-03"; yy = "09"},172 @{date="2009-12-31"; yy = "09"},173 @{date="2010-01-01"; yy = "09"},174 @{date="2010-01-02"; yy = "09"},175 @{date="2010-01-03"; yy = "09"},176 @{date="2010-01-04"; yy = "10"},177 @{date="2014-01-03"; yy = "14"},178 @{date="2015-01-02"; yy = "15"},179 @{date="2015-01-03"; yy = "15"},180 @{date="2020-01-03"; yy = "20"},181 @{date="2025-01-03"; yy = "25"},182 @{date="2026-01-02"; yy = "26"},183 @{date="2026-01-03"; yy = "26"},184 @{date="2031-01-03"; yy = "31"}185 ) {186 param($date, $yy)187 Get-Date -Date $date -UFormat %g | Should -BeExactly $yy188 }189 190 # Using the same test cases as V for ISO week date component parity191 It "using -uformat 'u' produces the correct output (<date>:<dayOfWeek>)" -TestCases @(192 @{date="1998-01-02"; dayOfWeek = "5"},193 @{date="1998-01-03"; dayOfWeek = "6"},194 @{date="2003-01-03"; dayOfWeek = "5"},195 @{date="2004-01-02"; dayOfWeek = "5"},196 @{date="2004-01-03"; dayOfWeek = "6"},197 @{date="2005-01-01"; dayOfWeek = "6"},198 @{date="2005-01-02"; dayOfWeek = "7"},199 @{date="2005-12-31"; dayOfWeek = "6"},200 @{date="2006-01-01"; dayOfWeek = "7"},201 @{date="2006-01-02"; dayOfWeek = "1"},202 @{date="2006-12-31"; dayOfWeek = "7"},203 @{date="2007-01-01"; dayOfWeek = "1"},204 @{date="2007-12-30"; dayOfWeek = "7"},205 @{date="2007-12-31"; dayOfWeek = "1"},206 @{date="2008-01-01"; dayOfWeek = "2"},207 @{date="2008-12-28"; dayOfWeek = "7"},208 @{date="2008-12-29"; dayOfWeek = "1"},209 @{date="2008-12-30"; dayOfWeek = "2"},210 @{date="2008-12-31"; dayOfWeek = "3"},211 @{date="2009-01-01"; dayOfWeek = "4"},212 @{date="2009-01-02"; dayOfWeek = "5"},213 @{date="2009-01-03"; dayOfWeek = "6"},214 @{date="2009-12-31"; dayOfWeek = "4"},215 @{date="2010-01-01"; dayOfWeek = "5"},216 @{date="2010-01-02"; dayOfWeek = "6"},217 @{date="2010-01-03"; dayOfWeek = "7"},218 @{date="2010-01-04"; dayOfWeek = "1"},219 @{date="2014-01-03"; dayOfWeek = "5"},220 @{date="2015-01-02"; dayOfWeek = "5"},221 @{date="2015-01-03"; dayOfWeek = "6"},222 @{date="2020-01-03"; dayOfWeek = "5"},223 @{date="2025-01-03"; dayOfWeek = "5"},224 @{date="2026-01-02"; dayOfWeek = "5"},225 @{date="2026-01-03"; dayOfWeek = "6"},226 @{date="2031-01-03"; dayOfWeek = "5"}227 ) {228 param($date, $dayOfWeek)229 Get-Date -Date $date -UFormat %u | Should -BeExactly $dayOfWeek230 }231 It "Passing '<name>' to -uformat produces a descriptive error (<errorId>)" -TestCases @(232 @{ name = "`$null" ; value = $null; errorId = "ParameterArgumentValidationErrorNullNotAllowed" }233 @{ name = "empty string"; value = ""; errorId = "ParameterArgumentValidationErrorEmptyStringNotAllowed" }234 ) {235 param($value, $errorId)236 { Get-Date -Date 1/1/1970 -UFormat $value -ErrorAction Stop } | Should -Throw -ErrorId "${errorId},Microsoft.PowerShell.Commands.GetDateCommand"237 }238 239 It "Get-date works with pipeline input" {240 $x = New-Object System.Management.Automation.PSObject241 $x | Add-Member NoteProperty Date ([DateTime]::Now)242 $y = @($x,$x)243 ($y | Get-Date).Length | Should -Be 2244 }245 246 It "the LastWriteTime alias works with pipeline input" {247 $folder = "GetDateTest"248 $pathString = Join-Path -Path $TestDrive -ChildPath $folder249 New-Item -Path $TestDrive -Name $folder -ItemType directory -Force250 for($i = 0; $i -lt 10; $i++)251 {252 $temp = [guid]::NewGuid()253 $pathString2 = Join-Path -Path $pathString -ChildPath $temp254 New-Item -Path $pathString -Name $temp -ItemType file -Force255 256 for($j = 0; $j -lt 100; $j++)257 {258 Add-Content -Path $pathString2 -Value $j259 }260 261 }262 263 $result1 = Get-ChildItem -Path $pathString | Get-Date264 $result2 = Get-ChildItem -Path $pathString | Get-Date265 266 $result1.Length | Should -Be 10267 $result1.Length -eq $result2.Length | Should -BeTrue268 269 for($i = 0; $i -lt $result1.Length; $i++)270 {271 $result1[$i] -eq $result2[$i] | Should -BeTrue272 }273 274 Get-ChildItem -Path $pathString | Remove-Item275 Remove-Item -Path $pathString -Force -Recurse276 }277 278}279 280Describe "Get-Date" -Tags "CI" {281 It "-Format FileDate works" {282 Get-Date -Date 0030-01-01T01:02:03.0004 -Format FileDate | Should -Be "00300101"283 }284 285 It "-Format FileDateTime works" {286 Get-Date -Date 0030-01-01T01:02:03.0004 -Format FileDateTime | Should -Be "00300101T0102030004"287 }288 289 It "-Format FileDateTimeUniversal works (1)" {290 Get-Date -Date 0030-01-01T01:02:03.0004z -Format FileDateTimeUniversal | Should -Be "00300101T0102030004Z"291 }292 293 It "-Format FileDateTimeUniversal works (2)" {294 Get-Date -Date 0030-01-01T01:02:03.0004z -Format FileDateUniversal | Should -Be "00300101Z"295 }296 297 It "Should have colons when ToString method is used" {298 (Get-Date).ToString().Contains(":") | Should -BeTrue299 (Get-Date -DisplayHint Time).ToString().Contains(":") | Should -BeTrue300 (Get-Date -DisplayHint Date).ToString().Contains(":") | Should -BeTrue301 }302 303 It "Should be able to use the format flag" {304 # You would think that one could use simple loops here, but apparently powershell in Windows returns different values in loops305 306 (Get-Date -Format d).Contains("/") | Should -BeTrue307 (Get-Date -Format D).Contains(",") | Should -BeTrue308 (Get-Date -Format f).Contains(",") -and (Get-Date -Format f).Contains(":") | Should -BeTrue309 (Get-Date -Format F).Contains(",") -and (Get-Date -Format F).Contains(":") | Should -BeTrue310 (Get-Date -Format g).Contains("/") -and (Get-Date -Format g).Contains(":") | Should -BeTrue311 (Get-Date -Format G).Contains("/") -and (Get-Date -Format G).Contains(":") | Should -BeTrue312 (Get-Date -Format m).Contains(",") -or `313 (Get-Date -Format m).Contains(":") -or `314 (Get-Date -Format m).Contains("/") | Should -BeFalse315 }316 317 It "Should check that Get-Date can return the correct datetime from the system time" {318 $timeDifference = $(Get-Date).Subtract([System.DateTime]::Now)319 320 $timeDifference.Days | Should -Be 0321 $timeDifference.Hours | Should -Be 0322 $timeDifference.Minutes | Should -Be 0323 $timeDifference.Milliseconds | Should -BeLessThan 1324 $timeDifference.Ticks | Should -BeLessThan 10000325 }326 327 It "-UnixTimeSeconds works (<Expected>)" -TestCases @(328 @{ UnixTimeSeconds = 1577836800; Expected = [System.DateTimeOffset]::FromUnixTimeSeconds(1577836800).LocalDateTime },329 @{ UnixTimeSeconds = 0; Expected = [System.DateTimeOffset]::UnixEpoch.LocalDateTime },330 @{ UnixTimeSeconds = -1; Expected = [System.DateTimeOffset]::FromUnixTimeSeconds(-1).LocalDateTime }331 ) {332 param(333 [long] $UnixTimeSeconds,334 [DateTime] $Expected335 )336 337 Get-Date -UnixTimeSeconds $UnixTimeSeconds | Should -Be $Expected338 }339}340 341Describe "Get-Date -UFormat tests" -Tags "CI" {342 BeforeAll {343 $date1 = Get-Date -Date "2030-4-5 1:2:3.09"344 $date2 = Get-Date -Date "2030-4-15 13:2:3"345 $date3 = Get-Date -Date "2030-4-15 21:2:3"346 347 # 5 come from $date1 - 2030-4-5 is Friday - 5th day (the enum starts with 0 - Sunday)348 $shortDay1 = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.AbbreviatedDayNames[5]349 $fullDay1 = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.DayNames[5]350 351 # 3 come from $date1 - 2030-4-5 is April - 4th month (the enum starts with 0)352 $shortMonth1 = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.AbbreviatedMonthNames[3]353 $fullMonth1 = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.MonthNames[3]354 355 $fullDate1 = $date1.ToString("$([System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.ShortDatePattern)")356 $fullTime1 = $date1.ToString("$([System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.LongTimePattern)")357 358 $amUpper1 = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.AMDesignator359 $amLower1 = [System.Globalization.CultureInfo]::CurrentCulture.DateTimeFormat.AMDesignator.ToLower()360 $timeZone1 = [String]::Format("{0:+00;-00}", [Timezone]::CurrentTimeZone.GetUtcOffset( $date1 ).Hours)361 }362 363 It "Get-Date -UFormat <format> (<result>)" -TestCases @(364 # Some format specifiers is locale sensetive:365 # - and tests work on EN-US only366 # - and can not be full compatible with Unix 'date' utility.367 # Commented tests mean not implemented or broken format specifiers.368 @{ date = $date1; format = "%a"; result = $shortDay1 } # locale's abbreviated weekday name369 @{ date = $date1; format = "%A"; result = $fullDay1 } # locale's full weekday name370 @{ date = $date1; format = "%b"; result = $shortMonth1 }# locale's abbreviated month name371 @{ date = $date1; format = "%B"; result = $fullMonth1 } # locale's full month name372 @{ date = $date1; format = "%c"; result = "$shortDay1 05 $shortMonth1 2030 01:02:03" } # locale's date and time (e.g., Thu 03 Mar 2005 23:05:25)373 # We can not get compatibility with Unix374 #375 @{ date = $date1; format = "%C"; result = "20" } # century; like %Y, except omit last two digits (e.g., 20)376 @{ date = $date1; format = "%d"; result = "05" } # day of month (e.g., 01)377 @{ date = $date1; format = "%D"; result = "04/05/30" } # date; same as %m/%d/%y378 @{ date = $date1; format = "%e"; result = " 5" } # day of month, space padded; same as %_d379 @{ date = $date2; format = "%e"; result = "15" }380 @{ date = $date1; format = "%F"; result = "2030-04-05" }# Equivalent to %Y-%m-%d (the ISO 8601 date format).381 #@{ date = $date1; format = "%g"; result = "" } # last two digits of year of ISO week number (see %G)382 # TODO: need review. Broken C# implementation.383 #384 #@{ date = $date1; format = "%G"; result = "" } # year of ISO week number (see %V); normally useful only with %V385 # TODO: need review. Broken C# implementation.386 #387 @{ date = $date1; format = "%h"; result = $shortMonth1 }# same as %b388 @{ date = $date1; format = "%H"; result = "01" } # hour (00..23)389 @{ date = $date2; format = "%H"; result = "13" }390 @{ date = $date1; format = "%I"; result = "01" } # hour (01..12)391 @{ date = $date2; format = "%I"; result = "01" }392 @{ date = $date1; format = "%j"; result = "095" } # day of year (001..366)393 @{ date = $date1; format = "%k"; result = " 1" } # hour, space padded ( 0..23); same as %_H394 @{ date = $date2; format = "%k"; result = "13" }395 @{ date = $date1; format = "%l"; result = " 1" } # hour, space padded ( 1..12); same as %_I396 @{ date = $date2; format = "%l"; result = " 1" }397 @{ date = $date1; format = "%m"; result = "04" } # month (01..12)398 @{ date = $date1; format = "%M"; result = "02" } # minute (00..59)399 #@{ date = $date1; format = "%n"; result = "`n" } # a newline400 #@{ date = $date1; format = "%N"; result = "090000000" }# nanoseconds (000000000..999999999)401 @{ date = $date1; format = "%p"; result = $amUpper1 } # locale's equivalent of either AM or PM; blank if not known402 #@{ date = $date1; format = "%P"; result = $amLower1 } # like %p, but lower case403 #@{ date = $date1; format = "%q"; result = "" } # quarter of year (1..4) - not implemented on Ununtu 17.10404 @{ date = $date1; format = "%r"; result = "01:02:03 AM" }# locale's 12-hour clock time (e.g., 11:11:04 PM)405 @{ date = $date3; format = "%r"; result = "09:02:03 PM" }406 @{ date = $date1; format = "%R"; result = "01:02" } # 24-hour hour and minute; same as %H:%M407 @{ date = $date3; format = "%R"; result = "21:02" }408 #@{ date = $date1; format = "%s"; result = "1901563323" }# Separate tests is in the file. Seconds since 1970-01-01 00:00:00 UTC409 # TODO: need review410 #411 @{ date = $date1; format = "%S"; result = "03" } # second (00..60)412 #@{ date = $date1; format = "%t"; result = "`t" } # a tab413 @{ date = $date1; format = "%T"; result = "01:02:03" } # time; same as %H:%M:%S414 @{ date = $date1; format = "%u"; result = "5" } # day of week (1..7); 1 is Monday415 @{ date = $date1; format = "%U"; result = "13" } # week number of year, with Sunday as first day of week (00..53)416 # TODO: need review.417 #418 #@{ date = $date1; format = "%V"; result = "" } # Separate tests is in the file. ISO week number, with Monday as first day of week (01..53)419 #@{ date = $date1; format = "%w"; result = "" } # day of week (0..6); 0 is Sunday420 @{ date = $date1; format = "%W"; result = "13" } # week number of year, with Monday as first day of week (00..53)421 # TODO: need review compatibility with Unix422 #423 @{ date = $date1; format = "%x"; result = "04/05/30" } # locale's date representation (e.g., 12/31/99)424 # TODO: need review compatibility with Unix425 #426 #@{ date = $date1; format = "%X"; result = $fullTime1 } # locale's time representation (e.g., 23:13:48)427 # TODO: need review compatibility with Unix. Broken C# implementation.428 #429 @{ date = $date1; format = "%y"; result = "30" } # last two digits of year (00..99)430 @{ date = $date1; format = "%Y"; result = "2030" } # year431 #@{ date = $date1; format = "%z"; result = "" } # +hhmm numeric time zone (e.g., -0400)432 #@{ date = $date1; format = "%:z"; result = "" } # +hh:mm numeric time zone (e.g., -04:00)433 #@{ date = $date1; format = "%::z"; result = "" } # +hh:mm:ss numeric time zone (e.g., -04:00:00)434 #@{ date = $date1; format = "%:::z"; result = "" } # numeric time zone with : to necessary precision (e.g., -04, +05:30)435 @{ date = $date1; format = "%Z"; result = $timeZone1 } # alphabetic time zone abbreviation (e.g., EDT)436 # We can only check a time zone format from .Net437 # and can not check compatibility with Unix438 ) {439 param($date, $format, $result)440 441 Get-Date -Date $date -UFormat $format | Should -BeExactly $result442 }443}444 