Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.

Commit e55de0a

Browse files
committed
Tighten regex further
1 parent 32faf27 commit e55de0a

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

lib/src/main/kotlin/at/bitfire/ical4android/validation/FixInvalidDayOffsetPreprocessor.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ object FixInvalidDayOffsetPreprocessor : StreamPreprocessor() {
1515
// TRIGGER:-P2DT
1616
// TRIGGER:-PT2D
1717
// REFRESH-INTERVAL;VALUE=DURATION:PT1D
18-
"(?:^|(DURATION|REFRESH-INTERVAL|RELATED-TO|TRIGGER);VALUE=)" +
19-
"(DURATION|TRIGGER):-?P((T-?\\d+D)|(-?\\d+DT))$",
18+
"(?:^|(^(DURATION|REFRESH-INTERVAL|RELATED-TO|TRIGGER));VALUE=)(DURATION|TRIGGER):-?P((T-?\\d+D)|(-?\\d+DT))\$",
2019
setOf(RegexOption.MULTILINE, RegexOption.IGNORE_CASE)
2120
)
2221

lib/src/test/kotlin/at/bitfire/ical4android/validation/FixInvalidDayOffsetPreprocessorTest.kt

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ package at.bitfire.ical4android.validation
66

77
import org.junit.Assert.assertEquals
88
import org.junit.Assert.assertFalse
9+
import org.junit.Assert.assertNotEquals
910
import org.junit.Assert.assertTrue
1011
import org.junit.Test
1112
import java.time.Duration
12-
import java.time.format.DateTimeParseException
1313

1414
class FixInvalidDayOffsetPreprocessorTest {
1515

16-
private fun fixAndAssert(expected: String, testValue: String) {
17-
16+
private fun fixParseAssertEqual(expected: String, testValue: String) {
1817
// Fix the duration string
1918
val fixed = FixInvalidDayOffsetPreprocessor.fixString(testValue)
2019

@@ -28,6 +27,14 @@ class FixInvalidDayOffsetPreprocessorTest {
2827
assertEquals(expected, fixed)
2928
}
3029

30+
private fun fixAssertNotEqual(expected: String, testValue: String) {
31+
// Fix the duration string
32+
val fixed = FixInvalidDayOffsetPreprocessor.fixString(testValue)
33+
34+
// Assert not equal
35+
assertNotEquals(expected, fixed)
36+
}
37+
3138
@Test
3239
fun test_FixString_NoOccurrence() {
3340
assertEquals(
@@ -40,48 +47,53 @@ class FixInvalidDayOffsetPreprocessorTest {
4047
fun test_FixString_SucceedsAsValueOnCorrectProperties() {
4148
// By RFC 5545 the only properties allowed to hold DURATION as a VALUE are:
4249
// DURATION, REFRESH, RELATED, TRIGGER
43-
fixAndAssert("DURATION;VALUE=DURATION:P1D", "DURATION;VALUE=DURATION:PT1D")
44-
fixAndAssert("REFRESH-INTERVAL;VALUE=DURATION:P1D", "REFRESH-INTERVAL;VALUE=DURATION:PT1D")
45-
fixAndAssert("RELATED-TO;VALUE=DURATION:P1D", "RELATED-TO;VALUE=DURATION:PT1D")
46-
fixAndAssert("TRIGGER;VALUE=DURATION:P1D", "TRIGGER;VALUE=DURATION:PT1D")
50+
fixParseAssertEqual("DURATION;VALUE=DURATION:P1D", "DURATION;VALUE=DURATION:PT1D")
51+
fixParseAssertEqual("REFRESH-INTERVAL;VALUE=DURATION:P1D", "REFRESH-INTERVAL;VALUE=DURATION:PT1D")
52+
fixParseAssertEqual("RELATED-TO;VALUE=DURATION:P1D", "RELATED-TO;VALUE=DURATION:PT1D")
53+
fixParseAssertEqual("TRIGGER;VALUE=DURATION:P1D", "TRIGGER;VALUE=DURATION:PT1D")
4754
}
4855

49-
@Test(expected = DateTimeParseException::class)
56+
@Test
5057
fun test_FixString_FailsAsValueOnWrongProperty() {
5158
// The update from RFC 2445 to RFC 5545 disallows using DURATION as a VALUE in FREEBUSY
52-
fixAndAssert("FREEBUSY;VALUE=DURATION:P1D", "FREEBUSY;VALUE=DURATION:PT1D")
59+
fixAssertNotEqual("FREEBUSY;VALUE=DURATION:P1D", "FREEBUSY;VALUE=DURATION:PT1D")
60+
}
61+
62+
@Test
63+
fun test_FixString_FailsIfNotAtStartOfLine() {
64+
fixAssertNotEqual("xxDURATION;VALUE=DURATION:P1D", "xxDURATION;VALUE=DURATION:PT1D")
5365
}
5466

5567
@Test
5668
fun test_FixString_DayOffsetFrom_Invalid() {
57-
fixAndAssert("DURATION:-P1D", "DURATION:-PT1D")
58-
fixAndAssert("TRIGGER:-P2D", "TRIGGER:-PT2D")
69+
fixParseAssertEqual("DURATION:-P1D", "DURATION:-PT1D")
70+
fixParseAssertEqual("TRIGGER:-P2D", "TRIGGER:-PT2D")
5971

60-
fixAndAssert("DURATION:-P1D", "DURATION:-P1DT")
61-
fixAndAssert("TRIGGER:-P2D", "TRIGGER:-P2DT")
72+
fixParseAssertEqual("DURATION:-P1D", "DURATION:-P1DT")
73+
fixParseAssertEqual("TRIGGER:-P2D", "TRIGGER:-P2DT")
6274
}
6375

6476
@Test
6577
fun test_FixString_DayOffsetFrom_Valid() {
66-
fixAndAssert("DURATION:-PT12H", "DURATION:-PT12H")
67-
fixAndAssert("TRIGGER:-PT12H", "TRIGGER:-PT12H")
78+
fixParseAssertEqual("DURATION:-PT12H", "DURATION:-PT12H")
79+
fixParseAssertEqual("TRIGGER:-PT12H", "TRIGGER:-PT12H")
6880
}
6981

7082
@Test
7183
fun test_FixString_DayOffsetFromMultiple_Invalid() {
72-
fixAndAssert("DURATION:-P1D\nTRIGGER:-P2D", "DURATION:-PT1D\nTRIGGER:-PT2D")
73-
fixAndAssert("DURATION:-P1D\nTRIGGER:-P2D", "DURATION:-P1DT\nTRIGGER:-P2DT")
84+
fixParseAssertEqual("DURATION:-P1D\nTRIGGER:-P2D", "DURATION:-PT1D\nTRIGGER:-PT2D")
85+
fixParseAssertEqual("DURATION:-P1D\nTRIGGER:-P2D", "DURATION:-P1DT\nTRIGGER:-P2DT")
7486
}
7587

7688
@Test
7789
fun test_FixString_DayOffsetFromMultiple_Valid() {
78-
fixAndAssert("DURATION:-PT12H\nTRIGGER:-PT12H", "DURATION:-PT12H\nTRIGGER:-PT12H")
90+
fixParseAssertEqual("DURATION:-PT12H\nTRIGGER:-PT12H", "DURATION:-PT12H\nTRIGGER:-PT12H")
7991
}
8092

8193
@Test
8294
fun test_FixString_DayOffsetFromMultiple_Mixed() {
83-
fixAndAssert("DURATION:-P1D\nDURATION:-PT12H\nTRIGGER:-P2D", "DURATION:-PT1D\nDURATION:-PT12H\nTRIGGER:-PT2D")
84-
fixAndAssert("DURATION:-P1D\nDURATION:-PT12H\nTRIGGER:-P2D", "DURATION:-P1DT\nDURATION:-PT12H\nTRIGGER:-P2DT")
95+
fixParseAssertEqual("DURATION:-P1D\nDURATION:-PT12H\nTRIGGER:-P2D", "DURATION:-PT1D\nDURATION:-PT12H\nTRIGGER:-PT2D")
96+
fixParseAssertEqual("DURATION:-P1D\nDURATION:-PT12H\nTRIGGER:-P2D", "DURATION:-P1DT\nDURATION:-PT12H\nTRIGGER:-P2DT")
8597
}
8698

8799
@Test

0 commit comments

Comments
 (0)