Skip to content

Commit e113271

Browse files
committed
Parse more DVS3 messages
1 parent 4cca93d commit e113271

File tree

5 files changed

+96
-4
lines changed

5 files changed

+96
-4
lines changed

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ require (
1616
github.com/rs/zerolog v1.34.0
1717
github.com/spf13/cobra v1.9.1
1818
github.com/spf13/viper v1.20.1
19+
github.com/stretchr/testify v1.10.0
1920
)
2021

2122
require (
2223
github.com/beorn7/perks v1.0.1 // indirect
2324
github.com/buger/jsonparser v1.1.1 // indirect
2425
github.com/cespare/xxhash/v2 v2.3.0 // indirect
26+
github.com/davecgh/go-spew v1.1.1 // indirect
2527
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
2628
github.com/fsnotify/fsnotify v1.9.0 // indirect
2729
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
@@ -30,6 +32,7 @@ require (
3032
github.com/mattn/go-isatty v0.0.20 // indirect
3133
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
3234
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
35+
github.com/pmezard/go-difflib v1.0.0 // indirect
3336
github.com/prometheus/client_model v0.6.2 // indirect
3437
github.com/prometheus/common v0.63.0 // indirect
3538
github.com/prometheus/procfs v0.16.1 // indirect

models/departure.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ func (departure Departure) RealDepartureTime() time.Time {
115115

116116
// PlatformChanged returns true when the platform has been changed
117117
func (departure Departure) PlatformChanged() bool {
118+
if departure.PlatformActual != "" && departure.PlatformPlanned == "" {
119+
return false
120+
}
121+
118122
return departure.PlatformActual != departure.PlatformPlanned
119123
}
120124

models/departure_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestDeparturePlatformChanged(t *testing.T) {
4949
{"", "", false},
5050
{"4", "4", false},
5151
{"4", "5", true},
52-
{"", "4", true},
52+
{"", "4", false},
5353
{"4", "", true},
5454
}
5555

@@ -60,11 +60,11 @@ func TestDeparturePlatformChanged(t *testing.T) {
6060

6161
if table.changed {
6262
if !departure.PlatformChanged() {
63-
t.Errorf("Planned platform %s is different from actual platform %s, but not changed", departure.PlatformPlanned, departure.PlatformActual)
63+
t.Errorf("Planned platform \"%s\" is different from actual platform \"%s\", but not changed", departure.PlatformPlanned, departure.PlatformActual)
6464
}
6565
} else {
6666
if departure.PlatformChanged() {
67-
t.Errorf("Planned platform %s is equal to actual platform %s, but is marked as changed", departure.PlatformPlanned, departure.PlatformActual)
67+
t.Errorf("Planned platform \"%s\" is equal to actual platform \"%s\", but is marked as changed", departure.PlatformPlanned, departure.PlatformActual)
6868
}
6969
}
7070
}

parsers/dvs3_parser.go

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"fmt"
66
"io"
7+
"strings"
78

89
"github.com/beevik/etree"
910
"github.com/rijdendetreinen/gotrain/models"
@@ -85,7 +86,7 @@ func parseDvs3Product(product *etree.Element) (departure models.Departure, err e
8586
departure.ServiceName = nameNode.Text()
8687
}
8788

88-
// Departure time:
89+
// Departure time and delay
8990
departureTimes := trainProduct.SelectElements("vertrekTijd")
9091

9192
for _, departureTime := range departureTimes {
@@ -98,5 +99,59 @@ func parseDvs3Product(product *etree.Element) (departure models.Departure, err e
9899
if delayNode != nil {
99100
departure.Delay = ParseInfoPlusDuration(delayNode.SelectElement("exact"))
100101
}
102+
103+
// Departure platform
104+
departurePlatformNode := trainProduct.SelectElement("vertrekSpoor")
105+
if departurePlatformNode != nil {
106+
departurePlatformTrackNode := departurePlatformNode.SelectElement("spoor")
107+
108+
trackNumberNode := departurePlatformTrackNode.SelectElement("nummer")
109+
trackPhaseNode := departurePlatformTrackNode.SelectElement("fase")
110+
111+
if trackNumberNode == nil || trackPhaseNode == nil {
112+
departure.PlatformActual = ""
113+
} else if trackPhaseNode == nil {
114+
departure.PlatformActual = trackNumberNode.Text()
115+
} else {
116+
departure.PlatformActual = trackNumberNode.Text() + strings.ToLower(trackPhaseNode.Text())
117+
}
118+
}
119+
120+
// Parse modifications
121+
// modifications := trainProduct.SelectElements("wijziging")
122+
// for _, modification := range modifications {
123+
// modificationType, _ := strconv.Atoi(modification.SelectElement("code").Text())
124+
125+
// departure.Modifications = append(departure.Modifications, models.Modification{
126+
// ModificationType: modificationType,
127+
// })
128+
// }
129+
130+
// Parse wings
131+
wings := trainProduct.SelectElements("vleugel")
132+
133+
for _, wing := range wings {
134+
wing := parseDvs3TrainWing(wing, &departure)
135+
136+
departure.TrainWings = append(departure.TrainWings, wing)
137+
138+
departure.DestinationActual = append(departure.DestinationActual, wing.DestinationActual...)
139+
departure.DestinationPlanned = append(departure.DestinationPlanned, wing.DestinationPlanned...)
140+
}
141+
101142
return
102143
}
144+
145+
// parseDvs3TrainWing parses a DVS3 train wing element and returns a TrainWing object.
146+
func parseDvs3TrainWing(wing *etree.Element, departure *models.Departure) models.TrainWing {
147+
wingDeparture := models.TrainWing{}
148+
149+
// Destinations:
150+
destinations := wing.SelectElements("bestemming")
151+
for _, destination := range destinations {
152+
destinationStation := ParseInfoPlusStation2024(destination)
153+
wingDeparture.DestinationActual = append(wingDeparture.DestinationActual, destinationStation)
154+
}
155+
156+
return wingDeparture
157+
}

parsers/dvs3_parser_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"time"
66

77
"github.com/rijdendetreinen/gotrain/models"
8+
"github.com/stretchr/testify/assert"
89
)
910

1011
// testParseDeparture_Dvs3 is a helper function to parse a DVS3 message and check for errors
@@ -84,9 +85,38 @@ func TestParseNormalDeparture_Dvs3(t *testing.T) {
8485
t.Errorf("Expected departure time %v does not match %v", expectedDepartureTime, departure.DepartureTime)
8586
}
8687

88+
assert.Equal(t, 189, departure.Delay, "Wrong Delay: expected %d, but got %d", 189, departure.Delay)
89+
8790
if departure.Delay != 189 {
8891
t.Errorf("Wrong Delay: expected %d, but got %d", 189, departure.Delay)
8992
}
93+
94+
// Verify that the destination is parsed correctly
95+
assert.Len(t, departure.DestinationActual, 1, "Wrong number of actual destinations")
96+
// assert.Len(t, departure.DestinationPlanned, 1, "Wrong number of planned destinations")
97+
98+
if len(departure.DestinationActual) > 0 {
99+
// Verify that the destination station is parsed correctly
100+
assert.Equal(t, "MTR", departure.DestinationActual[0].Code, "Wrong DestinationActual Code")
101+
assert.Equal(t, "Randwyck", departure.DestinationActual[0].NameShort, "Wrong DestinationActual NameShort")
102+
assert.Equal(t, "Randwyck", departure.DestinationActual[0].NameMedium, "Wrong DestinationActual NameMedium")
103+
assert.Equal(t, "Maastricht Randwyck", departure.DestinationActual[0].NameLong, "Wrong DestinationActual NameLong")
104+
}
105+
106+
// if len(departure.DestinationPlanned) > 0 {
107+
// // Verify that the destination station is parsed correctly
108+
// assert.Equal(t, "MTR", departure.DestinationPlanned[0].Code, "Wrong DestinationPlanned Code")
109+
// assert.Equal(t, "Randwyck", departure.DestinationPlanned[0].NameShort, "Wrong DestinationPlanned NameShort")
110+
// assert.Equal(t, "Randwyck", departure.DestinationPlanned[0].NameMedium, "Wrong DestinationPlanned NameMedium")
111+
// assert.Equal(t, "Maastricht Randwyck", departure.DestinationPlanned[0].NameLong, "Wrong DestinationPlanned NameLong")
112+
// }
113+
114+
// Verify departure platform
115+
assert.Equal(t, "4b", departure.PlatformActual, "Wrong actual departure platform")
116+
assert.False(t, departure.PlatformChanged(), "Platform should not be changed")
117+
118+
// Verify number of wings (1)
119+
assert.Len(t, departure.TrainWings, 1, "Wrong number of wings")
90120
}
91121

92122
func TestHandleWrongNamespace_Dvs3(t *testing.T) {

0 commit comments

Comments
 (0)