Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions lib/src/org/model/org_timestamp.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 OrgTimestamp extends OrgNode {
bool get isActive;
}

/// A timestamp, like `[2020-05-05 Tue]`
class OrgSimpleTimestamp extends OrgLeafNode {
class OrgSimpleTimestamp extends OrgLeafNode implements OrgTimestamp {
OrgSimpleTimestamp(
this.prefix,
this.date,
Expand All @@ -30,6 +34,7 @@ class OrgSimpleTimestamp extends OrgLeafNode {
final List<String> repeaterOrDelay;
final String suffix;

@override
bool get isActive => prefix == '<' && suffix == '>';

@override
Expand Down Expand Up @@ -99,13 +104,14 @@ class OrgSimpleTimestamp extends OrgLeafNode {
);
}

class OrgDateRangeTimestamp extends OrgParentNode {
class OrgDateRangeTimestamp extends OrgParentNode implements OrgTimestamp {
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
Expand Down Expand Up @@ -146,7 +152,7 @@ class OrgDateRangeTimestamp extends OrgParentNode {
);
}

class OrgTimeRangeTimestamp extends OrgLeafNode {
class OrgTimeRangeTimestamp extends OrgLeafNode implements OrgTimestamp {
OrgTimeRangeTimestamp(
this.prefix,
this.date,
Expand All @@ -163,6 +169,7 @@ class OrgTimeRangeTimestamp extends OrgLeafNode {
final List<String> repeaterOrDelay;
final String suffix;

@override
bool get isActive => prefix == '<' && suffix == '>';

DateTime get startDateTime => DateTime(
Expand Down
46 changes: 46 additions & 0 deletions test/org/model/timestamp_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,51 @@ void main() {
expect(result.contains('あ'), isFalse);
expect(result.toMarkup(), markup);
});
group("generic timestamp tests", () {
test('OrgSimpleTimestamp', () {
final markup = '<2025-05-30>';
final result = parser.parse(markup).value as OrgTimestamp;

expect(result.isActive, isTrue);
expect(result, isA<OrgTimestamp>());
expect(result, isA<OrgSimpleTimestamp>());
expect(result, isNot(isA<OrgDateRangeTimestamp>()));
expect(result, isNot(isA<OrgTimeRangeTimestamp>()));
expect(result.toMarkup(), markup);
});
test('OrgTimeRangeTimestamp', () {
final markup = '<2025-05-30 15:00-16:00>';
final result = parser.parse(markup).value as OrgTimestamp;

expect(result.isActive, isTrue);
expect(result, isA<OrgTimestamp>());
expect(result, isA<OrgTimeRangeTimestamp>());
expect(result, isNot(isA<OrgSimpleTimestamp>()));
expect(result, isNot(isA<OrgDateRangeTimestamp>()));
expect(result.toMarkup(), markup);
});
test('OrgDateRangeTimestamp', () {
final markup = '[2025-05-30]--[2025-06-30]';
final result = parser.parse(markup).value as OrgTimestamp;

expect(result.isActive, isFalse);
expect(result, isA<OrgTimestamp>());
expect(result, isA<OrgDateRangeTimestamp>());
expect(result, isNot(isA<OrgSimpleTimestamp>()));
expect(result, isNot(isA<OrgTimeRangeTimestamp>()));
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);
});
});
});
}