2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.vdr.internal;
15 import static org.junit.jupiter.api.Assertions.assertEquals;
16 import static org.junit.jupiter.api.Assertions.assertThrows;
18 import java.text.ParseException;
19 import java.time.ZonedDateTime;
20 import java.time.format.DateTimeFormatter;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.junit.jupiter.api.Test;
24 import org.openhab.binding.vdr.internal.svdrp.SVDRPEpgEvent;
25 import org.openhab.binding.vdr.internal.svdrp.SVDRPException;
26 import org.openhab.binding.vdr.internal.svdrp.SVDRPParseResponseException;
29 * Specific unit tests to check if {@link SVDRPEpgEvent} parses SVDRP responses correctly
31 * @author Matthias Klocke - Initial contribution
35 public class SVDRPEpgEventTest {
36 private final String epgResponseComplete = """
37 C S19.2E-1-1201-28326 WDR HD Bielefeld
38 E 9886 1610391600 900 4E F
40 S Aktuelle Nachrichten aus der Welt
41 D Themen u.a.:|* Corona-Pandemie in Deutschland: Verschärfter Lockdown bundesweit in Kraft|* Entmachtung des US-Präsidenten: Demokraten planen Schritte gegen Trump|* Wintereinbruch in Bosnien-Herzegowina: Dramatische Lage der Flüchtlinge an der Grenze zu Kroatien
44 X 2 03 deu ohne Audiodeskription
45 X 3 01 deu Teletext-Untertitel
46 X 3 20 deu mit DVB-Untertitel
53 private final String epgMissingSubtitle = """
54 C S19.2E-1-1201-28326 WDR HD Bielefeld
55 E 9886 1610391600 900 4E F
57 D Themen u.a.:|* Corona-Pandemie in Deutschland: Verschärfter Lockdown bundesweit in Kraft|* Entmachtung des US-Präsidenten: Demokraten planen Schritte gegen Trump|* Wintereinbruch in Bosnien-Herzegowina: Dramatische Lage der Flüchtlinge an der Grenze zu Kroatien
60 X 2 03 deu ohne Audiodeskription
61 X 3 01 deu Teletext-Untertitel
62 X 3 20 deu mit DVB-Untertitel
69 private final String epgParseError = "E 9999999999999999999999999";
70 private final String epgCorruptDate = """
71 C S19.2E-1-1201-28326 WDR HD Bielefeld
72 E 9886 2a10391600 900 4E F
74 D Themen u.a.:|* Corona-Pandemie in Deutschland: Verschärfter Lockdown bundesweit in Kraft|* Entmachtung des US-Präsidenten: Demokraten planen Schritte gegen Trump|* Wintereinbruch in Bosnien-Herzegowina: Dramatische Lage der Flüchtlinge an der Grenze zu Kroatien
77 X 2 03 deu ohne Audiodeskription
78 X 3 01 deu Teletext-Untertitel
79 X 3 20 deu mit DVB-Untertitel
87 private final String epgMissingEnd = """
88 C S19.2E-1-1201-28326 WDR HD Bielefeld
89 E 9886 1610391600 900 4E F
91 D Themen u.a.:|* Corona-Pandemie in Deutschland: Verschärfter Lockdown bundesweit in Kraft|* Entmachtung des US-Präsidenten: Demokraten planen Schritte gegen Trump|* Wintereinbruch in Bosnien-Herzegowina: Dramatische Lage der Flüchtlinge an der Grenze zu Kroatien
94 X 2 03 deu ohne Audiodeskription
95 X 3 01 deu Teletext-Untertitel
96 X 3 20 deu mit DVB-Untertitel
104 public void testParseEpgEventComplete() throws SVDRPException, ParseException {
105 SVDRPEpgEvent event = SVDRPEpgEvent.parse(epgResponseComplete);
106 assertEquals("Tagesschau", event.getTitle());
107 assertEquals("Aktuelle Nachrichten aus der Welt", event.getSubtitle());
108 assertEquals(15, event.getDuration());
109 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
110 assertEquals(ZonedDateTime.parse("2021-01-11 19:00:00 UTC", dtf).toInstant(), event.getBegin());
111 assertEquals(ZonedDateTime.parse("2021-01-11 19:15:00 UTC", dtf).toInstant(), event.getEnd());
115 public void testParseEpgEventMissingSubtitle() throws SVDRPException {
116 SVDRPEpgEvent event = SVDRPEpgEvent.parse(epgMissingSubtitle);
117 assertEquals("Tagesschau", event.getTitle());
118 assertEquals("", event.getSubtitle());
122 public void testParseEpgEventCorruptDate() {
123 assertThrows(SVDRPParseResponseException.class, () -> {
124 SVDRPEpgEvent.parse(epgCorruptDate);
129 public void testParseEpgEventMissingEnd() throws SVDRPException, ParseException {
130 SVDRPEpgEvent event = SVDRPEpgEvent.parse(epgMissingEnd);
131 assertEquals("Tagesschau", event.getTitle());
132 assertEquals("", event.getSubtitle());
133 assertEquals(15, event.getDuration());
134 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
135 assertEquals(ZonedDateTime.parse("2021-01-11 19:00:00 UTC", dtf).toInstant(), event.getBegin());
136 assertEquals(ZonedDateTime.parse("2021-01-11 19:15:00 UTC", dtf).toInstant(), event.getEnd());
140 public void testParseExceptionVolumeData() {
141 assertThrows(SVDRPParseResponseException.class, () -> {
142 SVDRPEpgEvent.parse(epgParseError);