/**
* Copyright (C) 2022 Adrien Hopkins
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package sevenUnitsGUI;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.Set;
import org.junit.jupiter.api.Test;
import sevenUnits.unit.BaseDimension;
import sevenUnits.unit.Metric;
import sevenUnits.unit.Unit;
import sevenUnits.utils.NameSymbol;
import sevenUnits.utils.NamedObjectProduct;
/**
* @author Adrien Hopkins
*
* @since 2022-02-10
*/
public final class PresenterTest {
Set testUnits = Set.of(Metric.METRE, Metric.KILOMETRE,
Metric.METRE_PER_SECOND, Metric.KILOMETRE_PER_HOUR);
Set> testDimensions = Set.of(
Metric.Dimensions.LENGTH.withName(NameSymbol.ofName("Length")),
Metric.Dimensions.VELOCITY.withName(NameSymbol.ofName("Velocity")));
/**
* Test for {@link Presenter#updateView()}
*
* @since 2022-02-12
*/
@Test
void testUpdateView() {
// setup
final ViewBot viewBot = new ViewBot();
final Presenter presenter = new Presenter(viewBot);
viewBot.setFromUnits(this.testUnits);
viewBot.setToUnits(this.testUnits);
viewBot.setDimensions(this.testDimensions);
viewBot.setSelectedDimension(
Optional.of(this.testDimensions.iterator().next()));
// filter to length units only, then get the filtered sets of units
presenter.updateView();
final Set fromUnits = viewBot.getFromUnits();
final Set toUnits = viewBot.getToUnits();
// test that fromUnits/toUnits is [METRE, KILOMETRE]
// HOWEVER I don't care about the order so I'm testing it this way
assertEquals(2, fromUnits.size(),
"Invalid fromUnits (length != 2): " + fromUnits);
assertEquals(2, toUnits.size(),
"Invalid toUnits (length != 2): " + toUnits);
assertTrue(fromUnits.contains(Metric.METRE),
"Invaild fromUnits (METRE missing): " + fromUnits);
assertTrue(toUnits.contains(Metric.METRE),
"Invaild toUnits (METRE missing): " + toUnits);
assertTrue(fromUnits.contains(Metric.KILOMETRE),
"Invaild fromUnits (KILOMETRE missing): " + fromUnits);
assertTrue(toUnits.contains(Metric.KILOMETRE),
"Invaild toUnits (KILOMETRE missing): " + toUnits);
}
/**
* Test method for {@link Presenter#convertExpressions}
*
* @since 2022-02-12
*/
@Test
void testConvertExpressions() {
// setup
final ViewBot viewBot = new ViewBot();
final Presenter presenter = new Presenter(viewBot);
viewBot.setFromExpression("10000.0 m");
viewBot.setToExpression("km");
// convert expression
presenter.convertExpressions();
// test result
final List outputs = viewBot.getExpressionConversionOutputs();
assertEquals("10000.0 m = 10.0 km", outputs.get(outputs.size() - 1));
}
/**
* Tests that unit-conversion Views can correctly convert units
*
* @since 2022-02-12
*/
@Test
void testConvertUnits() {
// setup
final ViewBot viewBot = new ViewBot();
final Presenter presenter = new Presenter(viewBot);
viewBot.setFromUnits(this.testUnits);
viewBot.setToUnits(this.testUnits);
viewBot.setFromSelection(Optional.of(Metric.METRE));
viewBot.setToSelection(Optional.of(Metric.KILOMETRE));
viewBot.setInputValue(OptionalDouble.of(10000.0));
// convert units
presenter.convertUnits();
/*
* use result from system as expected - I'm not testing unit conversion
* here (that's for the backend tests), I'm just testing that it correctly
* calls the unit conversion system
*/
final String expected = String
.valueOf(Metric.METRE.convertTo(Metric.KILOMETRE, 10000.0));
final List outputs = viewBot.getUnitConversionOutputValues();
assertEquals(expected, outputs.get(outputs.size() - 1));
}
}