2 * Copyright (c) 2010-2022 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 = "C S19.2E-1-1201-28326 WDR HD Bielefeld\n"
37 + "E 9886 1610391600 900 4E F\n" + "T Tagesschau\n" + "S Aktuelle Nachrichten aus der Welt\n"
38 + "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\n"
39 + "G 20 80\n" + "X 2 03 deu stereo\n" + "X 2 03 deu ohne Audiodeskription\n"
40 + "X 3 01 deu Teletext-Untertitel\n" + "X 3 20 deu mit DVB-Untertitel\n" + "X 5 0B deu HD-Video\n"
41 + "V 1610391600\n" + "e\n" + "c\n" + "End of EPG data";
42 private final String epgMissingSubtitle = "C S19.2E-1-1201-28326 WDR HD Bielefeld\n"
43 + "E 9886 1610391600 900 4E F\n" + "T Tagesschau\n"
44 + "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\n"
45 + "G 20 80\n" + "X 2 03 deu stereo\n" + "X 2 03 deu ohne Audiodeskription\n"
46 + "X 3 01 deu Teletext-Untertitel\n" + "X 3 20 deu mit DVB-Untertitel\n" + "X 5 0B deu HD-Video\n"
47 + "V 1610391600\n" + "e\n" + "c\n" + "End of EPG data";
48 private final String epgParseError = "E 9999999999999999999999999";
49 private final String epgCorruptDate = "C S19.2E-1-1201-28326 WDR HD Bielefeld\n" + "E 9886 2a10391600 900 4E F\n"
51 + "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\n"
52 + "G 20 80\n" + "X 2 03 deu stereo\n" + "X 2 03 deu ohne Audiodeskription\n"
53 + "X 3 01 deu Teletext-Untertitel\n" + "X 3 20 deu mit DVB-Untertitel\n" + "X 5 0B deu HD-Video\n"
54 + "V 1610391600\n" + "e\n" + "c\n" + "End of EPG data";
56 private final String epgMissingEnd = "C S19.2E-1-1201-28326 WDR HD Bielefeld\n" + "E 9886 1610391600 900 4E F\n"
58 + "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\n"
59 + "G 20 80\n" + "X 2 03 deu stereo\n" + "X 2 03 deu ohne Audiodeskription\n"
60 + "X 3 01 deu Teletext-Untertitel\n" + "X 3 20 deu mit DVB-Untertitel\n" + "X 5 0B deu HD-Video\n"
61 + "V 1610391600\n" + "e\n" + "c\n";
64 public void testParseEpgEventComplete() throws SVDRPException, ParseException {
65 SVDRPEpgEvent event = SVDRPEpgEvent.parse(epgResponseComplete);
66 assertEquals("Tagesschau", event.getTitle());
67 assertEquals("Aktuelle Nachrichten aus der Welt", event.getSubtitle());
68 assertEquals(15, event.getDuration());
69 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
70 assertEquals(ZonedDateTime.parse("2021-01-11 19:00:00 UTC", dtf).toInstant(), event.getBegin());
71 assertEquals(ZonedDateTime.parse("2021-01-11 19:15:00 UTC", dtf).toInstant(), event.getEnd());
75 public void testParseEpgEventMissingSubtitle() throws SVDRPException {
76 SVDRPEpgEvent event = SVDRPEpgEvent.parse(epgMissingSubtitle);
77 assertEquals("Tagesschau", event.getTitle());
78 assertEquals("", event.getSubtitle());
82 public void testParseEpgEventCorruptDate() {
83 assertThrows(SVDRPParseResponseException.class, () -> {
84 SVDRPEpgEvent.parse(epgCorruptDate);
89 public void testParseEpgEventMissingEnd() throws SVDRPException, ParseException {
90 SVDRPEpgEvent event = SVDRPEpgEvent.parse(epgMissingEnd);
91 assertEquals("Tagesschau", event.getTitle());
92 assertEquals("", event.getSubtitle());
93 assertEquals(15, event.getDuration());
94 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
95 assertEquals(ZonedDateTime.parse("2021-01-11 19:00:00 UTC", dtf).toInstant(), event.getBegin());
96 assertEquals(ZonedDateTime.parse("2021-01-11 19:15:00 UTC", dtf).toInstant(), event.getEnd());
100 public void testParseExceptionVolumeData() {
101 assertThrows(SVDRPParseResponseException.class, () -> {
102 SVDRPEpgEvent.parse(epgParseError);