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.homematic.internal.converter;
15 import static org.hamcrest.CoreMatchers.is;
16 import static org.hamcrest.MatcherAssert.assertThat;
17 import static org.junit.jupiter.api.Assertions.assertThrows;
19 import org.junit.jupiter.api.Test;
20 import org.openhab.binding.homematic.internal.converter.type.AbstractTypeConverter;
21 import org.openhab.binding.homematic.internal.converter.type.DecimalTypeConverter;
22 import org.openhab.binding.homematic.internal.converter.type.QuantityTypeConverter;
23 import org.openhab.binding.homematic.internal.model.HmDatapoint;
24 import org.openhab.core.library.types.DecimalType;
25 import org.openhab.core.library.types.QuantityType;
28 * Tests for {@link AbstractTypeConverter#convertToBinding(org.openhab.core.types.Type, HmDatapoint)}.
30 * @author Michael Reitler - Initial Contribution
33 public class ConvertToBindingTest extends BaseConverterTest {
36 public void testDecimalTypeConverter() throws ConverterException {
37 Object convertedValue;
38 TypeConverter<?> dTypeConverter = new DecimalTypeConverter();
40 // the binding is backwards compatible, so clients may still use DecimalType, even if a unit is used
41 floatDp.setUnit("°C");
43 convertedValue = dTypeConverter.convertToBinding(new DecimalType(99.9), floatDp);
44 assertThat(convertedValue, is(99.9));
46 convertedValue = dTypeConverter.convertToBinding(new DecimalType(99.9999999999999999999999999999999), floatDp);
47 assertThat(convertedValue, is(100.0));
49 convertedValue = dTypeConverter.convertToBinding(new DecimalType(99.0), integerDp);
50 assertThat(convertedValue, is(99));
52 convertedValue = dTypeConverter.convertToBinding(new DecimalType(99.9), integerDp);
53 assertThat(convertedValue, is(99));
57 public void testQuantityTypeConverter() throws ConverterException {
58 Object convertedValue;
59 TypeConverter<?> qTypeConverter = new QuantityTypeConverter();
60 floatQuantityDp.setUnit("°C");
62 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("99.9 °C"), floatQuantityDp);
63 assertThat(convertedValue, is(99.9));
65 floatQuantityDp.setUnit("°C"); // at some points datapoints come with such unit instead of °C
67 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("451 °F"), floatQuantityDp);
68 assertThat(convertedValue, is(232.777778));
70 floatQuantityDp.setUnit("km/h");
72 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("70.07 m/s"), floatQuantityDp);
73 assertThat(convertedValue, is(252.252));
75 integerQuantityDp.setUnit("%");
77 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("99.0 %"), integerQuantityDp);
78 assertThat(convertedValue, is(99));
80 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("99.9 %"), integerQuantityDp);
81 assertThat(convertedValue, is(99));
83 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("1"), integerQuantityDp);
84 assertThat(convertedValue, is(100));
86 floatQuantityDp.setUnit("100%"); // not really a unit, but it occurs in homematic datapoints
88 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("99.0 %"), floatQuantityDp);
89 assertThat(convertedValue, is(0.99));
91 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("99.9 %"), floatQuantityDp);
92 assertThat(convertedValue, is(0.999));
94 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("1"), floatQuantityDp);
95 assertThat(convertedValue, is(1.0));
97 integerQuantityDp.setUnit("Lux");
99 convertedValue = qTypeConverter.convertToBinding(new QuantityType<>("42 lx"), integerQuantityDp);
100 assertThat(convertedValue, is(42));
104 public void testQuantityTypeConverterFailsToConvertDecimalType() {
105 QuantityTypeConverter converter = new QuantityTypeConverter();
106 assertThrows(ConverterException.class, () -> converter.convertToBinding(new DecimalType(99.9), floatDp));
110 public void testDecimalTypeConverterFailsToConvertQuantityType() {
111 DecimalTypeConverter converter = new DecimalTypeConverter();
112 assertThrows(ConverterException.class, () -> converter.convertToBinding(new QuantityType<>("99.9 %"), floatDp));