Skip to content

Commit 7be14ea

Browse files
confusedalexamake
andauthored
Add generic timestamp class (#23)
* test(timestamp): add test for parsing genericTimestamp correctly * feat: implement generic timestamp * Rename to most generic name * Adjust tests --------- Co-authored-by: Aaron Madlon-Kay <aaron@madlon-kay.com>
1 parent db75445 commit 7be14ea

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

lib/src/org/model/org_timestamp.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@ class OrgDiaryTimestamp extends OrgLeafNode with SingleContentElement {
1414
typedef OrgDate = ({String year, String month, String day, String? dayName});
1515
typedef OrgTime = ({String hour, String minute});
1616

17+
sealed class OrgTimestamp extends OrgNode {
18+
bool get isActive;
19+
}
20+
1721
/// A timestamp, like `[2020-05-05 Tue]`
18-
class OrgSimpleTimestamp extends OrgLeafNode {
22+
class OrgSimpleTimestamp extends OrgLeafNode implements OrgTimestamp {
1923
OrgSimpleTimestamp(
2024
this.prefix,
2125
this.date,
@@ -30,6 +34,7 @@ class OrgSimpleTimestamp extends OrgLeafNode {
3034
final List<String> repeaterOrDelay;
3135
final String suffix;
3236

37+
@override
3338
bool get isActive => prefix == '<' && suffix == '>';
3439

3540
@override
@@ -99,13 +104,14 @@ class OrgSimpleTimestamp extends OrgLeafNode {
99104
);
100105
}
101106

102-
class OrgDateRangeTimestamp extends OrgParentNode {
107+
class OrgDateRangeTimestamp extends OrgParentNode implements OrgTimestamp {
103108
OrgDateRangeTimestamp(this.start, this.delimiter, this.end);
104109

105110
final OrgSimpleTimestamp start;
106111
final String delimiter;
107112
final OrgSimpleTimestamp end;
108113

114+
@override
109115
bool get isActive => start.isActive && end.isActive;
110116

111117
@override
@@ -146,7 +152,7 @@ class OrgDateRangeTimestamp extends OrgParentNode {
146152
);
147153
}
148154

149-
class OrgTimeRangeTimestamp extends OrgLeafNode {
155+
class OrgTimeRangeTimestamp extends OrgLeafNode implements OrgTimestamp {
150156
OrgTimeRangeTimestamp(
151157
this.prefix,
152158
this.date,
@@ -163,6 +169,7 @@ class OrgTimeRangeTimestamp extends OrgLeafNode {
163169
final List<String> repeaterOrDelay;
164170
final String suffix;
165171

172+
@override
166173
bool get isActive => prefix == '<' && suffix == '>';
167174

168175
DateTime get startDateTime => DateTime(

test/org/model/timestamp_test.dart

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,51 @@ void main() {
108108
expect(result.contains('あ'), isFalse);
109109
expect(result.toMarkup(), markup);
110110
});
111+
group("generic timestamp tests", () {
112+
test('OrgSimpleTimestamp', () {
113+
final markup = '<2025-05-30>';
114+
final result = parser.parse(markup).value as OrgTimestamp;
115+
116+
expect(result.isActive, isTrue);
117+
expect(result, isA<OrgTimestamp>());
118+
expect(result, isA<OrgSimpleTimestamp>());
119+
expect(result, isNot(isA<OrgDateRangeTimestamp>()));
120+
expect(result, isNot(isA<OrgTimeRangeTimestamp>()));
121+
expect(result.toMarkup(), markup);
122+
});
123+
test('OrgTimeRangeTimestamp', () {
124+
final markup = '<2025-05-30 15:00-16:00>';
125+
final result = parser.parse(markup).value as OrgTimestamp;
126+
127+
expect(result.isActive, isTrue);
128+
expect(result, isA<OrgTimestamp>());
129+
expect(result, isA<OrgTimeRangeTimestamp>());
130+
expect(result, isNot(isA<OrgSimpleTimestamp>()));
131+
expect(result, isNot(isA<OrgDateRangeTimestamp>()));
132+
expect(result.toMarkup(), markup);
133+
});
134+
test('OrgDateRangeTimestamp', () {
135+
final markup = '[2025-05-30]--[2025-06-30]';
136+
final result = parser.parse(markup).value as OrgTimestamp;
137+
138+
expect(result.isActive, isFalse);
139+
expect(result, isA<OrgTimestamp>());
140+
expect(result, isA<OrgDateRangeTimestamp>());
141+
expect(result, isNot(isA<OrgSimpleTimestamp>()));
142+
expect(result, isNot(isA<OrgTimeRangeTimestamp>()));
143+
expect(result.toMarkup(), markup);
144+
});
145+
test('Exhaustivity', () {
146+
final markup = '[2025-05-30]--[2025-06-30]';
147+
final result = parser.parse(markup).value as OrgTimestamp;
148+
149+
final type = switch (result) {
150+
OrgTimeRangeTimestamp() => result.toString(),
151+
OrgDateRangeTimestamp() => result.toString(),
152+
OrgSimpleTimestamp() => result.toString(),
153+
};
154+
expect(type, isNotEmpty);
155+
});
156+
});
111157
});
112158
}

0 commit comments

Comments
 (0)