diff --git a/src/de/schildbach/pte/BahnProvider.java b/src/de/schildbach/pte/BahnProvider.java
index 0e55db6e..3949b4bc 100644
--- a/src/de/schildbach/pte/BahnProvider.java
+++ b/src/de/schildbach/pte/BahnProvider.java
@@ -446,12 +446,17 @@ public final class BahnProvider implements NetworkProvider
, Pattern.DOTALL);
private static final Pattern P_DEPARTURES_COARSE = Pattern.compile("
\n(.+?)
", Pattern.DOTALL);
static final Pattern P_DEPARTURES_FINE = Pattern.compile(".*?" //
- + "(.*?).*?" // line
- + ">>\n\\s*(.+?)\\s*\n
\n" // destination
+ + "\n" //
+ + "(.*?)\n" // line
+ + "\n" //
+ + ">>\n" //
+ + "\\s*(.+?)\\s*\n" // destination
+ + "
\n" //
+ "(\\d{1,2}:\\d{2})" // time
+ "(?: (?:(pünktl\\.)|ca. \\+(\\d+)))?" // ontime, delay
+ "(?: k\\.A\\.)?" //
+ "(?:, ([^<]*))?" // message
+ + "(?:,
]*>[^<]*)?" // (ersatzzug message)
+ "(?:(?:, )?(?:heute )?(Gl\\. " + ParserUtils.P_PLATFORM + ")(?:\\s*)?)?" // position
, Pattern.DOTALL);
private static final Pattern P_DEPARTURES_URI_STATION_ID = Pattern.compile("input=(\\d+)");
diff --git a/test/de/schildbach/pte/BahnProviderTest.java b/test/de/schildbach/pte/BahnProviderTest.java
index 54081bfa..e024d7bf 100644
--- a/test/de/schildbach/pte/BahnProviderTest.java
+++ b/test/de/schildbach/pte/BahnProviderTest.java
@@ -42,7 +42,7 @@ public class BahnProviderTest
@Test
public void departureWithPlatform()
{
- assertFineDepartures("" //
+ final Matcher m = assertFineDepartures("" //
+ "\n" //
+ "S 1\n" //
+ "\n" //
@@ -50,12 +50,14 @@ public class BahnProviderTest
+ "Gänserndorf\n" //
+ "
\n" //
+ "10:42Gl. 1");
+
+ assertNotNull(m.group(7)); // position
}
@Test
public void departureWithOnTime()
{
- assertFineDepartures("" //
+ final Matcher m = assertFineDepartures("" //
+ "\n" //
+ "RE 38148\n" //
+ "\n" //
@@ -63,12 +65,14 @@ public class BahnProviderTest
+ "Rathenow\n" //
+ "
\n" //
+ "21:58 pünktl., Gl. 13");
+
+ assertNotNull(m.group(7)); // position
}
@Test
public void departureWithMessage()
{
- assertFineDepartures("" //
+ final Matcher m = assertFineDepartures("" //
+ "\n" //
+ "ICE 824\n" //
+ "\n" //
@@ -76,12 +80,15 @@ public class BahnProviderTest
+ "Dortmund Hbf\n" //
+ "
\n" //
+ "07:02 ca. +5, Fährt heute nur bis Düsseldorf Hbf, Gl. 10");
+
+ assertNotNull(m.group(6)); // message
+ assertNotNull(m.group(7)); // position
}
@Test
public void departureUpdatedPosition()
{
- assertFineDepartures("" //
+ final Matcher m = assertFineDepartures("" //
+ "\n" //
+ "RB 30240\n" //
+ "\n" //
@@ -89,12 +96,14 @@ public class BahnProviderTest
+ "Holzkirchen\n" //
+ "
\n" //
+ "17:10 pünktl., heute Gl. 7 ");
+
+ assertNotNull(m.group(7)); // position
}
@Test
public void departureMessageAndUpdatedPosition()
{
- assertFineDepartures("" //
+ final Matcher m = assertFineDepartures("" //
+ "\n" //
+ "CNL 450\n" //
+ "\n" //
@@ -102,12 +111,15 @@ public class BahnProviderTest
+ "Paris Est\n" //
+ "
\n" //
+ "19:57 pünktl., Änderung im Zuglauf!, heute Gl. 7 ");
+
+ assertNotNull(m.group(6)); // message
+ assertNotNull(m.group(7)); // position
}
@Test
public void departureWithWeirdMessage()
{
- assertFineDepartures("" //
+ final Matcher m = assertFineDepartures("" //
+ "\n" //
+ "ICE 609\n" //
+ "\n" //
@@ -115,6 +127,23 @@ public class BahnProviderTest
+ "Basel SBB\n" //
+ "
\n" //
+ "04:52 k.A., Gl. 3");
+
+ assertNotNull(m.group(7)); // position
+ }
+
+ @Test
+ public void departureWithMultipleMessages()
+ {
+ final Matcher m = assertFineDepartures("" //
+ + "\n" //
+ + "S 1\n" //
+ + "\n" //
+ + ">>\n" //
+ + "München Ost\n" //
+ + "
\n" //
+ + "10:27, Zug fällt aus,
Ersatzzug S ");
+
+ assertNotNull(m.group(6)); // message
}
private void assertFineConnectionDetails(String s)
@@ -125,16 +154,17 @@ public class BahnProviderTest
// ParserUtils.printGroups(m);
}
- private void assertFineDepartures(String s)
+ private Matcher assertFineDepartures(String s)
{
Matcher m = BahnProvider.P_DEPARTURES_FINE.matcher(s);
assertTrue(m.matches());
- // ParserUtils.printGroups(m);
+ ParserUtils.printGroups(m);
assertNotNull(m.group(1)); // line
assertNotNull(m.group(2)); // destination
assertNotNull(m.group(3)); // time
- assertNotNull(m.group(7)); // departure
+
+ return m;
}
}