diff --git a/lib/model/date_format.dart b/lib/model/date_format.dart index 53ee480..427d208 100644 --- a/lib/model/date_format.dart +++ b/lib/model/date_format.dart @@ -1,25 +1,28 @@ +/// Compares dates relative to each other. Times are ignored. String dateRelativeToNow(DateTime date) { DateTime dateOnly = DateTime.utc(date.year, date.month, date.day); DateTime now = DateTime.now().toUtc(); DateTime today = DateTime.utc(now.year, now.month, now.day); Duration diff = dateOnly.difference(today); - return _durationToRelativeTimeString(diff); + return _durationToRelativeDateString(diff); } -String _durationToRelativeTimeString(Duration duration) { +String _durationToRelativeDateString(Duration duration) { + if (duration == const Duration(days: 1)) { + return "Tomorrow"; + } else if (duration == const Duration(days: -1)) { + return "Yesterday"; + } if (duration.isNegative) { return "${_durationApproximatedInWords(-duration)} ago"; } else if (duration == Duration.zero) { - return "now"; + return "Today"; } else { - return "in ${_durationApproximatedInWords(duration)}"; + return "In ${_durationApproximatedInWords(duration)}"; } } String _durationApproximatedInWords(Duration duration) { - int seconds = duration.inSeconds; - int minutes = duration.inMinutes; - int hours = duration.inHours; int days = duration.inDays; int weeks = (days / 7).floor(); int months = (days / 30).floor(); @@ -28,18 +31,6 @@ String _durationApproximatedInWords(Duration duration) { if (duration == Duration.zero) { return "now"; } - if (seconds == 0) { - return "now"; - } - if (seconds < 60) { - return seconds > 1 ? "$seconds seconds" : "a second"; - } - if (minutes < 60) { - return minutes > 1 ? "$minutes minutes" : "a minute"; - } - if (hours < 24) { - return hours > 1 ? "$hours hours" : "an hour"; - } if (days < 7) { return days > 1 ? "$days days" : "a day"; } diff --git a/pubspec.lock b/pubspec.lock index b475779..3b6f4b0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,30 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - _fe_analyzer_shared: - dependency: transitive - description: - name: _fe_analyzer_shared - sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a - url: "https://pub.dev" - source: hosted - version: "61.0.0" - analyzer: - dependency: transitive - description: - name: analyzer - sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 - url: "https://pub.dev" - source: hosted - version: "5.13.0" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" async: dependency: transitive description: @@ -65,30 +41,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.2" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" - coverage: - dependency: transitive - description: - name: coverage - sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" - url: "https://pub.dev" - source: hosted - version: "1.6.4" - crypto: - dependency: transitive - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.dev" - source: hosted - version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -113,14 +65,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.dev" - source: hosted - version: "7.0.0" flutter: dependency: "direct main" description: flutter @@ -139,14 +83,6 @@ packages: description: flutter source: sdk version: "0.0.0" - frontend_server_client: - dependency: transitive - description: - name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" - source: hosted - version: "3.2.0" get: dependency: transitive description: @@ -163,14 +99,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" - glob: - dependency: transitive - description: - name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" - source: hosted - version: "2.1.2" http: dependency: "direct main" description: @@ -179,14 +107,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" - http_multi_server: - dependency: transitive - description: - name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" - source: hosted - version: "3.2.1" http_parser: dependency: transitive description: @@ -203,22 +123,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.18.1" - io: - dependency: transitive - description: - name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" - source: hosted - version: "1.0.4" - js: - dependency: transitive - description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" - source: hosted - version: "0.6.7" lints: dependency: transitive description: @@ -227,14 +131,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.dev" - source: hosted - version: "1.2.0" matcher: dependency: transitive description: @@ -259,30 +155,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" - mime: - dependency: transitive - description: - name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" - source: hosted - version: "1.0.4" - node_preamble: - dependency: transitive - description: - name: node_preamble - sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" - url: "https://pub.dev" - source: hosted - version: "2.0.2" - package_config: - dependency: transitive - description: - name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" - source: hosted - version: "2.1.0" path: dependency: transitive description: @@ -355,75 +227,11 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.6" - pool: - dependency: transitive - description: - name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" - source: hosted - version: "1.5.1" - pub_semver: - dependency: transitive - description: - name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" - url: "https://pub.dev" - source: hosted - version: "2.1.4" - shelf: - dependency: transitive - description: - name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 - url: "https://pub.dev" - source: hosted - version: "1.4.1" - shelf_packages_handler: - dependency: transitive - description: - name: shelf_packages_handler - sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" - url: "https://pub.dev" - source: hosted - version: "3.0.2" - shelf_static: - dependency: transitive - description: - name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e - url: "https://pub.dev" - source: hosted - version: "1.1.2" - shelf_web_socket: - dependency: transitive - description: - name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" - url: "https://pub.dev" - source: hosted - version: "1.0.4" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" - source_map_stack_trace: - dependency: transitive - description: - name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" - url: "https://pub.dev" - source: hosted - version: "2.1.1" - source_maps: - dependency: transitive - description: - name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" - url: "https://pub.dev" - source: hosted - version: "0.10.12" source_span: dependency: transitive description: @@ -464,14 +272,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" - test: - dependency: "direct dev" - description: - name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" - url: "https://pub.dev" - source: hosted - version: "1.24.3" test_api: dependency: transitive description: @@ -480,14 +280,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.0" - test_core: - dependency: transitive - description: - name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" - url: "https://pub.dev" - source: hosted - version: "0.5.3" typed_data: dependency: transitive description: @@ -504,22 +296,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 - url: "https://pub.dev" - source: hosted - version: "11.10.0" - watcher: - dependency: transitive - description: - name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" - url: "https://pub.dev" - source: hosted - version: "1.1.0" web: dependency: transitive description: @@ -528,22 +304,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.4-beta" - web_socket_channel: - dependency: transitive - description: - name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b - url: "https://pub.dev" - source: hosted - version: "2.4.0" - webkit_inspection_protocol: - dependency: transitive - description: - name: webkit_inspection_protocol - sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" - url: "https://pub.dev" - source: hosted - version: "1.2.1" win32: dependency: transitive description: @@ -560,14 +320,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.3" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" sdks: dart: ">=3.1.3 <4.0.0" flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9500c7a..ae43aa3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -40,7 +40,6 @@ dependencies: get_storage: ^2.1.1 dev_dependencies: - test: flutter_test: sdk: flutter diff --git a/test/model/date_format_test.dart b/test/model/date_format_test.dart new file mode 100644 index 0000000..25e2aa1 --- /dev/null +++ b/test/model/date_format_test.dart @@ -0,0 +1,36 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:release_schedule/model/date_format.dart'; + +void main() { + group('dateRelativeToNow', () { + test('returns "Today" for today\'s date', () { + final today = DateTime.now(); + final result = dateRelativeToNow(today); + expect(result, 'Today'); + }); + + test('returns "Tomorrow" for tomorrow\'s date', () { + final tomorrow = DateTime.now().add(const Duration(days: 1)); + final result = dateRelativeToNow(tomorrow); + expect(result, 'Tomorrow'); + }); + + test('returns "Yesterday" for yesterday\'s date', () { + final yesterday = DateTime.now().subtract(const Duration(days: 1)); + final result = dateRelativeToNow(yesterday); + expect(result, 'Yesterday'); + }); + + test('returns "in X days" for future dates', () { + final futureDate = DateTime.now().add(const Duration(days: 5)); + final result = dateRelativeToNow(futureDate); + expect(result, 'In 5 days'); + }); + + test('returns "X days ago" for past dates', () { + final pastDate = DateTime.now().subtract(const Duration(days: 5)); + final result = dateRelativeToNow(pastDate); + expect(result, '5 days ago'); + }); + }); +}