From 28dd9895830794863f3be2fa81933e5db61c6896 Mon Sep 17 00:00:00 2001 From: confusedalex Date: Fri, 30 May 2025 23:27:42 +0200 Subject: [PATCH 1/4] test(timestamp): add test for parsing genericTimestamp correctly --- test/org/model/timestamp_test.dart | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/org/model/timestamp_test.dart b/test/org/model/timestamp_test.dart index d4e664d..2296cf7 100644 --- a/test/org/model/timestamp_test.dart +++ b/test/org/model/timestamp_test.dart @@ -108,5 +108,31 @@ void main() { expect(result.contains('あ'), isFalse); expect(result.toMarkup(), markup); }); + group("generic timestamp tests", () { + test('OrgSimeTimestamp parse', () { + final markup = '<2025-05-30>'; + final result = parser.parse(markup).value as OrgGenericTimestamp; + + expect(result is OrgSimpleTimestamp, isTrue); + expect(result is OrgDateRangeTimestamp, isFalse); + expect(result is OrgTimeRangeTimestamp, isFalse); + }); + test('OrgSimeTimestamp parse', () { + final markup = '<2025-05-30 15:00-16:00>'; + final result = parser.parse(markup).value as OrgGenericTimestamp; + + expect(result is OrgTimeRangeTimestamp, isTrue); + expect(result is OrgSimpleTimestamp, isFalse); + expect(result is OrgDateRangeTimestamp, isFalse); + }); + test('OrgSimeTimestamp parse', () { + final markup = '<2025-05-30>--<2025-06-30>'; + final result = parser.parse(markup).value as OrgGenericTimestamp; + + expect(result is OrgDateRangeTimestamp, isTrue); + expect(result is OrgSimpleTimestamp, isFalse); + expect(result is OrgTimeRangeTimestamp, isFalse); + }); + }); }); } From e6ca015b8f297c633039db9482b6866a8fe44749 Mon Sep 17 00:00:00 2001 From: confusedalex Date: Fri, 30 May 2025 23:30:31 +0200 Subject: [PATCH 2/4] feat: implement generic timestamp --- lib/src/org/model/org_timestamp.dart | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/src/org/model/org_timestamp.dart b/lib/src/org/model/org_timestamp.dart index 6ae77cf..93ca683 100644 --- a/lib/src/org/model/org_timestamp.dart +++ b/lib/src/org/model/org_timestamp.dart @@ -14,8 +14,12 @@ class OrgDiaryTimestamp extends OrgLeafNode with SingleContentElement { typedef OrgDate = ({String year, String month, String day, String? dayName}); typedef OrgTime = ({String hour, String minute}); +sealed class OrgGenericTimestamp extends OrgNode { + bool get isActive; +} + /// A timestamp, like `[2020-05-05 Tue]` -class OrgSimpleTimestamp extends OrgLeafNode { +class OrgSimpleTimestamp extends OrgLeafNode implements OrgGenericTimestamp { OrgSimpleTimestamp( this.prefix, this.date, @@ -30,6 +34,7 @@ class OrgSimpleTimestamp extends OrgLeafNode { final List repeaterOrDelay; final String suffix; + @override bool get isActive => prefix == '<' && suffix == '>'; @override @@ -99,13 +104,15 @@ class OrgSimpleTimestamp extends OrgLeafNode { ); } -class OrgDateRangeTimestamp extends OrgParentNode { +class OrgDateRangeTimestamp extends OrgParentNode + implements OrgGenericTimestamp { OrgDateRangeTimestamp(this.start, this.delimiter, this.end); final OrgSimpleTimestamp start; final String delimiter; final OrgSimpleTimestamp end; + @override bool get isActive => start.isActive && end.isActive; @override @@ -146,7 +153,7 @@ class OrgDateRangeTimestamp extends OrgParentNode { ); } -class OrgTimeRangeTimestamp extends OrgLeafNode { +class OrgTimeRangeTimestamp extends OrgLeafNode implements OrgGenericTimestamp { OrgTimeRangeTimestamp( this.prefix, this.date, @@ -163,6 +170,7 @@ class OrgTimeRangeTimestamp extends OrgLeafNode { final List repeaterOrDelay; final String suffix; + @override bool get isActive => prefix == '<' && suffix == '>'; DateTime get startDateTime => DateTime( From 59e6ac2fc160084ae515cfc25467c92b36425a1e Mon Sep 17 00:00:00 2001 From: Aaron Madlon-Kay Date: Sat, 31 May 2025 08:25:53 +0900 Subject: [PATCH 3/4] Rename to most generic name --- lib/src/org/model/org_timestamp.dart | 9 ++++----- test/org/model/timestamp_test.dart | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lib/src/org/model/org_timestamp.dart b/lib/src/org/model/org_timestamp.dart index 93ca683..d35ed2e 100644 --- a/lib/src/org/model/org_timestamp.dart +++ b/lib/src/org/model/org_timestamp.dart @@ -14,12 +14,12 @@ class OrgDiaryTimestamp extends OrgLeafNode with SingleContentElement { typedef OrgDate = ({String year, String month, String day, String? dayName}); typedef OrgTime = ({String hour, String minute}); -sealed class OrgGenericTimestamp extends OrgNode { +sealed class OrgTimestamp extends OrgNode { bool get isActive; } /// A timestamp, like `[2020-05-05 Tue]` -class OrgSimpleTimestamp extends OrgLeafNode implements OrgGenericTimestamp { +class OrgSimpleTimestamp extends OrgLeafNode implements OrgTimestamp { OrgSimpleTimestamp( this.prefix, this.date, @@ -104,8 +104,7 @@ class OrgSimpleTimestamp extends OrgLeafNode implements OrgGenericTimestamp { ); } -class OrgDateRangeTimestamp extends OrgParentNode - implements OrgGenericTimestamp { +class OrgDateRangeTimestamp extends OrgParentNode implements OrgTimestamp { OrgDateRangeTimestamp(this.start, this.delimiter, this.end); final OrgSimpleTimestamp start; @@ -153,7 +152,7 @@ class OrgDateRangeTimestamp extends OrgParentNode ); } -class OrgTimeRangeTimestamp extends OrgLeafNode implements OrgGenericTimestamp { +class OrgTimeRangeTimestamp extends OrgLeafNode implements OrgTimestamp { OrgTimeRangeTimestamp( this.prefix, this.date, diff --git a/test/org/model/timestamp_test.dart b/test/org/model/timestamp_test.dart index 2296cf7..7480c90 100644 --- a/test/org/model/timestamp_test.dart +++ b/test/org/model/timestamp_test.dart @@ -111,7 +111,7 @@ void main() { group("generic timestamp tests", () { test('OrgSimeTimestamp parse', () { final markup = '<2025-05-30>'; - final result = parser.parse(markup).value as OrgGenericTimestamp; + final result = parser.parse(markup).value as OrgTimestamp; expect(result is OrgSimpleTimestamp, isTrue); expect(result is OrgDateRangeTimestamp, isFalse); @@ -119,7 +119,7 @@ void main() { }); test('OrgSimeTimestamp parse', () { final markup = '<2025-05-30 15:00-16:00>'; - final result = parser.parse(markup).value as OrgGenericTimestamp; + final result = parser.parse(markup).value as OrgTimestamp; expect(result is OrgTimeRangeTimestamp, isTrue); expect(result is OrgSimpleTimestamp, isFalse); @@ -127,7 +127,7 @@ void main() { }); test('OrgSimeTimestamp parse', () { final markup = '<2025-05-30>--<2025-06-30>'; - final result = parser.parse(markup).value as OrgGenericTimestamp; + final result = parser.parse(markup).value as OrgTimestamp; expect(result is OrgDateRangeTimestamp, isTrue); expect(result is OrgSimpleTimestamp, isFalse); From c9aed3933883d35e77dd705fb009b825ff585dfc Mon Sep 17 00:00:00 2001 From: Aaron Madlon-Kay Date: Sat, 31 May 2025 08:28:02 +0900 Subject: [PATCH 4/4] Adjust tests --- test/org/model/timestamp_test.dart | 46 +++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/test/org/model/timestamp_test.dart b/test/org/model/timestamp_test.dart index 7480c90..4c28bfe 100644 --- a/test/org/model/timestamp_test.dart +++ b/test/org/model/timestamp_test.dart @@ -109,29 +109,49 @@ void main() { expect(result.toMarkup(), markup); }); group("generic timestamp tests", () { - test('OrgSimeTimestamp parse', () { + test('OrgSimpleTimestamp', () { final markup = '<2025-05-30>'; final result = parser.parse(markup).value as OrgTimestamp; - expect(result is OrgSimpleTimestamp, isTrue); - expect(result is OrgDateRangeTimestamp, isFalse); - expect(result is OrgTimeRangeTimestamp, isFalse); + expect(result.isActive, isTrue); + expect(result, isA()); + expect(result, isA()); + expect(result, isNot(isA())); + expect(result, isNot(isA())); + expect(result.toMarkup(), markup); }); - test('OrgSimeTimestamp parse', () { + test('OrgTimeRangeTimestamp', () { final markup = '<2025-05-30 15:00-16:00>'; final result = parser.parse(markup).value as OrgTimestamp; - expect(result is OrgTimeRangeTimestamp, isTrue); - expect(result is OrgSimpleTimestamp, isFalse); - expect(result is OrgDateRangeTimestamp, isFalse); + expect(result.isActive, isTrue); + expect(result, isA()); + expect(result, isA()); + expect(result, isNot(isA())); + expect(result, isNot(isA())); + expect(result.toMarkup(), markup); }); - test('OrgSimeTimestamp parse', () { - final markup = '<2025-05-30>--<2025-06-30>'; + test('OrgDateRangeTimestamp', () { + final markup = '[2025-05-30]--[2025-06-30]'; final result = parser.parse(markup).value as OrgTimestamp; - expect(result is OrgDateRangeTimestamp, isTrue); - expect(result is OrgSimpleTimestamp, isFalse); - expect(result is OrgTimeRangeTimestamp, isFalse); + expect(result.isActive, isFalse); + expect(result, isA()); + expect(result, isA()); + expect(result, isNot(isA())); + expect(result, isNot(isA())); + expect(result.toMarkup(), markup); + }); + test('Exhaustivity', () { + final markup = '[2025-05-30]--[2025-06-30]'; + final result = parser.parse(markup).value as OrgTimestamp; + + final type = switch (result) { + OrgTimeRangeTimestamp() => result.toString(), + OrgDateRangeTimestamp() => result.toString(), + OrgSimpleTimestamp() => result.toString(), + }; + expect(type, isNotEmpty); }); }); });