2 * Copyright (c) 2010-2024 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.knx.internal.i18n;
15 import static org.junit.jupiter.api.Assertions.*;
17 import org.eclipse.jdt.annotation.NonNullByDefault;
18 import org.junit.jupiter.api.Test;
20 import tuwien.auto.calimero.KNXException;
21 import tuwien.auto.calimero.link.KNXLinkClosedException;
25 * @author Holger Friedrich - initial contribution
29 class KNXTranslationProviderTest {
30 static final String UNKNOWN = "unknown text";
31 static final String UNKNOWN_PATTERN = "unknown text {0}";
32 static final String UNKNOWN_FIVE = "unknown text 5";
33 static final String UNKNOWN_NULL = "unknown text null";
34 static final String KNX_BINDING_KEY = "binding.knx.name";
35 static final String KNX_BINDING_VALUE = "KNX Binding";
36 static final String CONN_TYPE_PATTERN_KEY = "error.knx-unknown-ip-connection-type";
37 static final String CONN_TYPE_PATTERN_VALUE = "Unknown IP connection type: {0}.";
38 static final String CONN_TYPE_FIVE_VALUE = "Unknown IP connection type: 5.";
39 static final String CONN_TYPE_NULL_VALUE = "Unknown IP connection type: null.";
42 void testGetBeforeInit() {
43 // initial state, should not crash and preferably return original strings (w. pattern substitution)
44 assertEquals(UNKNOWN, KNXTranslationProvider.I18N.get(UNKNOWN));
45 assertEquals(UNKNOWN, KNXTranslationProvider.I18N.get(UNKNOWN, 5));
46 assertEquals(UNKNOWN_NULL, KNXTranslationProvider.I18N.get(UNKNOWN_PATTERN, null, null));
47 assertEquals(UNKNOWN_FIVE, KNXTranslationProvider.I18N.get(UNKNOWN_PATTERN, 5));
48 // KNXTranslationProvider.I18N.get(..., null) would cause a compiler warning,
49 // but using a null object of a defined type, it is possible to invoke with null value
51 assertEquals(UNKNOWN, KNXTranslationProvider.I18N.get(UNKNOWN, s));
52 assertEquals(UNKNOWN_NULL, KNXTranslationProvider.I18N.get(UNKNOWN_PATTERN, s));
56 void testSetProvider() {
57 // initial state, should not crash
58 KNXTranslationProvider.I18N.setProvider(null, null);
59 assertNotNull(KNXTranslationProvider.I18N.get(UNKNOWN));
61 // use mockup classes with known dictionary
62 KNXTranslationProvider.I18N.setProvider(new MockedLocaleProvider(), new MockedTranslationProvider());
63 assertEquals(KNX_BINDING_VALUE, KNXTranslationProvider.I18N.get(KNX_BINDING_KEY));
64 assertEquals(CONN_TYPE_FIVE_VALUE, KNXTranslationProvider.I18N.get(CONN_TYPE_PATTERN_KEY, 5));
65 assertEquals(UNKNOWN, KNXTranslationProvider.I18N.get(UNKNOWN));
66 assertEquals(UNKNOWN, KNXTranslationProvider.I18N.get(UNKNOWN, 5));
67 assertEquals(UNKNOWN_NULL, KNXTranslationProvider.I18N.get(UNKNOWN_PATTERN, null, null));
68 assertEquals(UNKNOWN_FIVE, KNXTranslationProvider.I18N.get(UNKNOWN_PATTERN, 5));
69 // KNXTranslationProvider.I18N.get(..., null) would cause a compiler warning,
70 // but using a null object of a defined type, it is possible to invoke with null value
72 assertEquals(UNKNOWN, KNXTranslationProvider.I18N.get(UNKNOWN, s));
73 assertEquals(UNKNOWN_NULL, KNXTranslationProvider.I18N.get(UNKNOWN_PATTERN, s));
75 assertEquals(CONN_TYPE_NULL_VALUE, KNXTranslationProvider.I18N.get(CONN_TYPE_PATTERN_KEY, s));
76 assertEquals(CONN_TYPE_PATTERN_VALUE, KNXTranslationProvider.I18N.get(CONN_TYPE_PATTERN_KEY));
78 // no locale, should work as fallback to default locale
79 KNXTranslationProvider.I18N.setProvider(null, new MockedTranslationProvider());
80 assertEquals(KNXTranslationProvider.I18N.get(KNX_BINDING_KEY), KNX_BINDING_VALUE);
82 // no translations, should return initial string
83 KNXTranslationProvider.I18N.setProvider(new MockedLocaleProvider(), null);
84 assertEquals(KNX_BINDING_KEY, KNXTranslationProvider.I18N.get(KNX_BINDING_KEY));
86 // initial state, dictionary should be gone
87 KNXTranslationProvider.I18N.setProvider(null, null);
88 assertEquals(KNX_BINDING_KEY, KNXTranslationProvider.I18N.get(KNX_BINDING_KEY));
92 void testGetLocalizedException() {
93 // initial state, should not crash
94 KNXTranslationProvider.I18N.setProvider(null, null);
96 final Exception e = new KNXException("error 1");
97 final Exception se = new KNXLinkClosedException("connection closed", e);
98 assertNotNull(KNXTranslationProvider.I18N.getLocalizedException(e));
99 assertNotNull(KNXTranslationProvider.I18N.getLocalizedException(se));
100 assertEquals("KNXException, error 1", KNXTranslationProvider.I18N.getLocalizedException(e));
102 // use mockup classes with known dictionary
103 KNXTranslationProvider.I18N.setProvider(new MockedLocaleProvider(), new MockedTranslationProvider());
104 // exception which is not part off the dictionary
105 assertEquals("KNXLinkClosedException, connection closed",
106 KNXTranslationProvider.I18N.getLocalizedException(se));
107 // exception which can be translated
108 assertEquals("Translated KNX Exception (KNXException, error 1)",
109 KNXTranslationProvider.I18N.getLocalizedException(e));