diff --git a/.travis.yml b/.travis.yml index 406a8ee..dee03b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,5 +7,14 @@ install: script: - dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencover tests/moment.net.Tests.csproj after_success: + - REPO_COMMIT_AUTHOR=$(git show -s --pretty=format:"%cn") + - REPO_COMMIT_AUTHOR_EMAIL=$(git show -s --pretty=format:"%ce") + - REPO_COMMIT_MESSAGE=$(git show -s --pretty=format:"%s") + - echo $TRAVIS_COMMIT + - echo $TRAVIS_BRANCH + - echo $REPO_COMMIT_AUTHOR + - echo $REPO_COMMIT_AUTHOR_EMAIL + - echo $REPO_COMMIT_MESSAGE + - echo $TRAVIS_JOB_ID - dotnet tool install coveralls.net --version 1.0.0 --tool-path tools - - ./tools/csmacnz.Coveralls --opencover -i ./tests/coverage.opencover.xml --useRelativePaths \ No newline at end of file + - ./tools/csmacnz.Coveralls --opencover -i ./tests/coverage.opencover.xml --repoToken $COVERALLS_REPO_TOKEN --commitId $TRAVIS_COMMIT --commitBranch $TRAVIS_BRANCH --commitAuthor "$REPO_COMMIT_AUTHOR" --commitEmail "$REPO_COMMIT_AUTHOR_EMAIL" --commitMessage "$REPO_COMMIT_MESSAGE" --jobId $TRAVIS_JOB_ID --serviceName "travis-ci" --useRelativePaths \ No newline at end of file diff --git a/src/Enums/RelativityDirection.cs b/src/Enums/RelativityDirection.cs deleted file mode 100644 index fac877c..0000000 --- a/src/Enums/RelativityDirection.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace moment.net.Enums -{ - internal enum RelativityDirection - { - From, - To - } -} \ No newline at end of file diff --git a/src/RelativeTime.cs b/src/RelativeTime.cs index 3e731a0..556b49a 100644 --- a/src/RelativeTime.cs +++ b/src/RelativeTime.cs @@ -1,5 +1,4 @@ using System; -using moment.net.Enums; namespace moment.net { @@ -15,6 +14,13 @@ public static string FromNow(this DateTime This) : ParseFromPastTimeSpan(DateTime.Now - This); } + public static string From(this DateTime This, DateTime dateTime) + { + var startDate = This.Kind == DateTimeKind.Utc ? This : This.ToUniversalTime(); + var endDate = dateTime.Kind == DateTimeKind.Utc ? dateTime : dateTime.ToUniversalTime(); + return ParseFromPastTimeSpan(endDate - startDate); + } + public static string ToNow(this DateTime This) { return This.Kind == DateTimeKind.Utc @@ -22,138 +28,86 @@ public static string ToNow(this DateTime This) : ParseFromFutureTimeSpan(This - DateTime.Now); } - private static string ParseFromPastTimeSpan(TimeSpan timeSpan) + public static string To(this DateTime This, DateTime dateTime) { - var totalTimeInSeconds = timeSpan.TotalSeconds; - - if (totalTimeInSeconds <= 44.0) - { - return "a few seconds ago"; - } - - if (totalTimeInSeconds > 44.0 && totalTimeInSeconds <= 89.0) - { - return "a minute ago"; - } - - var totalTimeInMinutes = timeSpan.TotalMinutes; - - if (totalTimeInSeconds > 89 && totalTimeInMinutes <= 44) - { - return $"{Math.Floor(totalTimeInMinutes)} minutes ago"; - } - - if (totalTimeInMinutes > 44 && totalTimeInMinutes <= 89) - { - return "an hour ago"; - } - - var totalTimeInHours = timeSpan.TotalHours; - - if (totalTimeInMinutes > 89 && totalTimeInHours <= 21) - { - return $"{Math.Floor(totalTimeInHours)} hours ago"; - } - - if (totalTimeInHours > 21 && totalTimeInHours <= 35) - { - return "a day ago"; - } - - var totalTimeInDays = timeSpan.TotalDays; - - if (totalTimeInHours > 35 && totalTimeInDays <= 25) - { - return $"{Math.Floor(totalTimeInDays)} days ago"; - } - - if (totalTimeInDays > 25 && totalTimeInDays <= 45) - { - return "a month ago"; - } - - if (totalTimeInDays > 45 && totalTimeInDays <= 319) - { - return $"{Math.Ceiling(totalTimeInDays / DaysInAMonth)} months ago"; - } - - if (totalTimeInDays > 319 && totalTimeInDays <= 547) - { - return "a year ago"; - } - - if (totalTimeInDays > 547) - { - return $"{Math.Ceiling(totalTimeInDays / DaysInAYear)} years ago"; - } + var startDate = This.Kind == DateTimeKind.Utc ? This : This.ToUniversalTime(); + var endDate = dateTime.Kind == DateTimeKind.Utc ? dateTime : dateTime.ToUniversalTime(); + return ParseFromFutureTimeSpan(endDate - startDate); + } - throw new ArgumentOutOfRangeException(nameof(timeSpan), timeSpan, - "The time span sent could not be parsed."); + private static string ParseFromPastTimeSpan(TimeSpan timeSpan) + { + return $"{ParseTimeDifference(timeSpan)} ago"; } private static string ParseFromFutureTimeSpan(TimeSpan timeSpan) + { + return $"in {ParseTimeDifference(timeSpan)}"; + } + + private static string ParseTimeDifference(TimeSpan timeSpan) { var totalTimeInSeconds = timeSpan.TotalSeconds; if (totalTimeInSeconds <= 44.0) { - return "in a few seconds"; + return "few seconds"; } if (totalTimeInSeconds > 44.0 && totalTimeInSeconds <= 89.0) { - return "in a minute"; + return "one minute"; } var totalTimeInMinutes = timeSpan.TotalMinutes; if (totalTimeInSeconds > 89 && totalTimeInMinutes <= 44) { - return $"in {Math.Ceiling(totalTimeInMinutes)} minutes"; + return $"{Math.Round(totalTimeInMinutes)} minutes"; } if (totalTimeInMinutes > 44 && totalTimeInMinutes <= 89) { - return "in an hour"; + return "one hour"; } var totalTimeInHours = timeSpan.TotalHours; if (totalTimeInMinutes > 89 && totalTimeInHours <= 21) { - return $"in {Math.Ceiling(totalTimeInHours)} hours"; + return $"{Math.Round(totalTimeInHours)} hours"; } if (totalTimeInHours > 21 && totalTimeInHours <= 35) { - return "in a day"; + return "one day"; } var totalTimeInDays = timeSpan.TotalDays; if (totalTimeInHours > 35 && totalTimeInDays <= 25) { - return $"in {Math.Ceiling(totalTimeInDays)} days"; + return $"{Math.Round(totalTimeInDays)} days"; } if (totalTimeInDays > 25 && totalTimeInDays <= 45) { - return "in a month"; + return "one month"; } if (totalTimeInDays > 45 && totalTimeInDays <= 319) { - return $"in {Math.Ceiling(totalTimeInDays / DaysInAMonth)} months"; + return $"{Math.Round(totalTimeInDays / DaysInAMonth)} months"; } if (totalTimeInDays > 319 && totalTimeInDays <= 547) { - return "in a year"; + return "one year"; } if (totalTimeInDays > 547) { - return $"in {Math.Ceiling(totalTimeInDays / DaysInAYear)} years"; + return $"{Math.Round(totalTimeInDays / DaysInAYear)} years"; } throw new ArgumentOutOfRangeException(nameof(timeSpan), timeSpan, diff --git a/tests/RelativeTime.Tests.cs b/tests/RelativeTime.Tests.cs index d365cec..2a7aa72 100644 --- a/tests/RelativeTime.Tests.cs +++ b/tests/RelativeTime.Tests.cs @@ -1,193 +1,209 @@ using System; -using System.Diagnostics.CodeAnalysis; using NUnit.Framework; using Shouldly; namespace moment.net.Tests { - [ExcludeFromCodeCoverage] public class RelativeTimeTests { [Test] public void SmallSecondsTest() { var aFewSecondsAgo = DateTime.UtcNow.AddSeconds(-20); - aFewSecondsAgo.FromNow().ShouldBe("a few seconds ago"); + aFewSecondsAgo.FromNow().ShouldBe("few seconds ago"); } - + [Test] public void LargeSecondsTest() { var largeSecondsAgo = DateTime.UtcNow.AddSeconds(-50); - largeSecondsAgo.FromNow().ShouldBe("a minute ago"); + largeSecondsAgo.FromNow().ShouldBe("one minute ago"); } - + [Test] public void SmallMinutesTest() { var afewMinutesAgo = DateTime.Now.AddMinutes(-1); - afewMinutesAgo.FromNow().ShouldBe("a minute ago"); + afewMinutesAgo.FromNow().ShouldBe("one minute ago"); } - + [Test] public void LargeMinutesTest() { var minutesAgo = DateTime.Now.AddMinutes(-15); minutesAgo.FromNow().ShouldBe("15 minutes ago"); } - + [Test] public void HourTest() { var dateTime = DateTime.UtcNow.AddMinutes(-65); - dateTime.FromNow().ShouldBe("an hour ago"); + dateTime.FromNow().ShouldBe("one hour ago"); } - + [Test] public void MultipleHoursTest() { var dateTime = DateTime.UtcNow.AddHours(-20); dateTime.FromNow().ShouldBe("20 hours ago"); } - + [Test] public void DayTest() { var dateTime = DateTime.UtcNow.AddHours(-25); - dateTime.FromNow().ShouldBe("a day ago"); + dateTime.FromNow().ShouldBe("one day ago"); } - + [Test] public void MultipleDaysTest() { var dateTime = DateTime.UtcNow.AddDays(-4); dateTime.FromNow().ShouldBe("4 days ago"); } - + [Test] public void MonthTest() { var dateTime = DateTime.UtcNow.AddDays(-27); - dateTime.FromNow().ShouldBe("a month ago"); + dateTime.FromNow().ShouldBe("one month ago"); } - + [Test] public void MultipleMonthsTest() { var dateTime = DateTime.UtcNow.AddDays(-60); dateTime.FromNow().ShouldBe("2 months ago"); } - + [Test] public void YearTest() { var dateTime = DateTime.UtcNow.AddDays(-360); - dateTime.FromNow().ShouldBe("a year ago"); + dateTime.FromNow().ShouldBe("one year ago"); } - + [Test] public void TwoYearsTest() { var dateTime = DateTime.UtcNow.AddDays(-570); dateTime.FromNow().ShouldBe("2 years ago"); } - + [Test] public void MultipleYearsTest() { var dateTime = DateTime.UtcNow.AddDays(-3650); dateTime.FromNow().ShouldBe("10 years ago"); } - + [Test] public void AFewSecondsInTheFutureTest() { var aFewSecondsAgo = DateTime.UtcNow.AddSeconds(20); - aFewSecondsAgo.ToNow().ShouldBe("in a few seconds"); + aFewSecondsAgo.ToNow().ShouldBe("in few seconds"); } - + [Test] public void MoreSecondsInTheFutureTest() { var largeSecondsAgo = DateTime.UtcNow.AddSeconds(50); - largeSecondsAgo.ToNow().ShouldBe("in a minute"); + largeSecondsAgo.ToNow().ShouldBe("in one minute"); } - + [Test] public void AFewMinutesInTheFutureTest() { var afewMinutesAgo = DateTime.Now.AddMinutes(1); - afewMinutesAgo.ToNow().ShouldBe("in a minute"); + afewMinutesAgo.ToNow().ShouldBe("in one minute"); } - + [Test] public void MoreMinutesInTheFutureTest() { var minutesAgo = DateTime.Now.AddMinutes(15); minutesAgo.ToNow().ShouldBe("in 15 minutes"); } - + [Test] public void ToHourTest() { var dateTime = DateTime.UtcNow.AddMinutes(65); - dateTime.ToNow().ShouldBe("in an hour"); + dateTime.ToNow().ShouldBe("in one hour"); } - + [Test] public void ToMultipleHoursTest() { var dateTime = DateTime.UtcNow.AddHours(20); dateTime.ToNow().ShouldBe("in 20 hours"); } - + [Test] public void ToDayTest() { var dateTime = DateTime.UtcNow.AddHours(25); - dateTime.ToNow().ShouldBe("in a day"); + dateTime.ToNow().ShouldBe("in one day"); } - + [Test] public void ToMultipleDaysTest() { var dateTime = DateTime.UtcNow.AddDays(4); dateTime.ToNow().ShouldBe("in 4 days"); } - + [Test] public void ToMonthTest() { var dateTime = DateTime.UtcNow.AddDays(27); - dateTime.ToNow().ShouldBe("in a month"); + dateTime.ToNow().ShouldBe("in one month"); } - + [Test] public void ToMultipleMonthsTest() { var dateTime = DateTime.UtcNow.AddDays(60); dateTime.ToNow().ShouldBe("in 2 months"); } - + [Test] public void ToYearTest() { var dateTime = DateTime.UtcNow.AddDays(360); - dateTime.ToNow().ShouldBe("in a year"); + dateTime.ToNow().ShouldBe("in one year"); } - + [Test] public void ToTwoYearsTest() { var dateTime = DateTime.UtcNow.AddDays(570); dateTime.ToNow().ShouldBe("in 2 years"); } - + [Test] public void ToMultipleYearsTest() { var dateTime = DateTime.UtcNow.AddDays(3650); dateTime.ToNow().ShouldBe("in 10 years"); } + + [Test] + public void FromSpecifiedDateTest() + { + var twoThousandAndTwelve = new DateTime(2012, 1, 1, 0, 0, 0, DateTimeKind.Utc); + var twoThousandAndEighteen = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + twoThousandAndTwelve.From(twoThousandAndEighteen).ShouldBe("6 years ago"); + } + + [Test] + public void ToSpecifiedDateTest() + { + var twoThousandAndTwelve = new DateTime(2012, 1, 1, 0, 0, 0, DateTimeKind.Utc); + var twoThousandAndEighteen = new DateTime(2018, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + twoThousandAndTwelve.To(twoThousandAndEighteen).ShouldBe("in 6 years"); + } } } \ No newline at end of file