Merge branch 'openrocket-unstable' into gradle

This commit is contained in:
thzero 2023-05-06 11:38:36 -05:00
commit 537018d79e
6 changed files with 257 additions and 2 deletions

View File

@ -4,6 +4,7 @@ OpenRocket text:
Create logo using Gimp's "Blended" logo script.
Apply suitable gradient to text layer
(softened "Horizon 1" -> "Horizon 1 soft").
Font: Kanit (Italic): https://fonts.google.com/specimen/Kanit?query=kanit
Background starfield:

View File

@ -13,7 +13,7 @@ public abstract class Error extends Message {
* @return an Error with the specific text.
*/
public static Error fromString(String text) {
return new Error.Other(text);
return new Other(text);
}

View File

@ -18,7 +18,7 @@ public abstract class Warning extends Message {
* @return a Warning with the specific text.
*/
public static Warning fromString(String text) {
return new Warning.Other(text);
return new Other(text);
}

View File

@ -1,6 +1,8 @@
package net.sf.openrocket.aerodynamics;
import static org.junit.Assert.assertEquals;
import net.sf.openrocket.logging.WarningSet;
import org.junit.BeforeClass;
import org.junit.Test;

View File

@ -0,0 +1,13 @@
package net.sf.openrocket.file.rasaero.export;
import org.junit.Test;
public class RASAeroMotorExportTest {
// TODO: check correct name after export
// TODO: check 0-delay motors (should have -0 suffix)
@Test
public void dummy() {
// We need at least one runnable test method
}
}

View File

@ -0,0 +1,239 @@
package net.sf.openrocket.file.rasaero.export;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Provider;
import com.google.inject.util.Modules;
import net.sf.openrocket.ServicesForTesting;
import net.sf.openrocket.database.ComponentPresetDao;
import net.sf.openrocket.database.ComponentPresetDatabase;
import net.sf.openrocket.database.motor.MotorDatabase;
import net.sf.openrocket.database.motor.ThrustCurveMotorSetDatabase;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.OpenRocketDocumentFactory;
import net.sf.openrocket.file.DatabaseMotorFinder;
import net.sf.openrocket.file.DocumentLoadingContext;
import net.sf.openrocket.file.GeneralRocketLoader;
import net.sf.openrocket.file.RocketLoadException;
import net.sf.openrocket.file.rasaero.importt.RASAeroLoader;
import net.sf.openrocket.l10n.DebugTranslator;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.ErrorSet;
import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.plugin.PluginModule;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
public class RASAeroSaverTest {
// TODO: export a complex design
// TODO: check recovery
// TODO: check sims (including weights and CG)
@BeforeClass
public static void setup() {
Module applicationModule = new ServicesForTesting();
Module pluginModule = new PluginModule();
Module debugTranslator = new AbstractModule() {
@Override
protected void configure() {
bind(Translator.class).toInstance(new DebugTranslator(null));
}
};
Module dbOverrides = new AbstractModule() {
@Override
protected void configure() {
bind(ComponentPresetDao.class).toProvider(new EmptyComponentDbProvider());
bind(MotorDatabase.class).toProvider(new MotorDbProvider());
}
};
Injector injector = Guice.createInjector(Modules.override(applicationModule).with(debugTranslator), pluginModule, dbOverrides);
Application.setInjector(injector);
}
@Test
public void testSingleStage() {
OpenRocketDocument originalDocument = loadRocket("01.One-stage.ork");
try {
// Convert to RASAero XML
WarningSet warnings = new WarningSet();
ErrorSet errors = new ErrorSet();
String result = new RASAeroSaver().marshalToRASAero(originalDocument, warnings, errors);
assertEquals(" incorrect amount of RASAero export warnings", 3, warnings.size());
assertEquals(" incorrect amount of RASAero export errors", 0, errors.size());
// Write to .CDX1 file
Path output = Files.createTempFile("01.One-stage", ".CDX1");
Files.write(output, result.getBytes(StandardCharsets.UTF_8));
// Read the file
RASAeroLoader loader = new RASAeroLoader();
InputStream stream = new FileInputStream(output.toFile());
Assert.assertNotNull("Could not open 01.One-stage.CDX1", stream);
OpenRocketDocument importedDocument = OpenRocketDocumentFactory.createEmptyRocket();
DocumentLoadingContext context = new DocumentLoadingContext();
context.setOpenRocketDocument(importedDocument);
context.setMotorFinder(new DatabaseMotorFinder());
loader.loadFromStream(context, new BufferedInputStream(stream), null);
Rocket importedRocket = importedDocument.getRocket();
// Test children counts
List<RocketComponent> originalChildren = originalDocument.getRocket().getAllChildren();
List<RocketComponent> importedChildren = importedRocket.getAllChildren();
assertEquals(" Number of total children doesn't match",
originalChildren.size(), importedChildren.size());
// TODO: check all components
} catch (IllegalStateException ise) {
fail(ise.getMessage());
} catch (RocketLoadException | IOException e) {
throw new RuntimeException(e);
}
}
@Test
public void testTwoStage() {
OpenRocketDocument originalDocument = loadRocket("02.Two-stage.ork");
try {
// Convert to RASAero XML
WarningSet warnings = new WarningSet();
ErrorSet errors = new ErrorSet();
String result = new RASAeroSaver().marshalToRASAero(originalDocument, warnings, errors);
assertEquals(" incorrect amount of RASAero export warnings", 2, warnings.size());
assertEquals(" incorrect amount of RASAero export errors", 0, errors.size());
// Write to .CDX1 file
Path output = Files.createTempFile("02.Two-stage", ".CDX1");
Files.write(output, result.getBytes(StandardCharsets.UTF_8));
// Read the file
RASAeroLoader loader = new RASAeroLoader();
InputStream stream = new FileInputStream(output.toFile());
Assert.assertNotNull("Could not open 02.Two-stage.CDX1", stream);
OpenRocketDocument importedDocument = OpenRocketDocumentFactory.createEmptyRocket();
DocumentLoadingContext context = new DocumentLoadingContext();
context.setOpenRocketDocument(importedDocument);
context.setMotorFinder(new DatabaseMotorFinder());
loader.loadFromStream(context, new BufferedInputStream(stream), null);
Rocket importedRocket = importedDocument.getRocket();
// Test children counts
List<RocketComponent> importedChildren = importedRocket.getAllChildren();
assertEquals(" Number of total children doesn't match",
18, importedChildren.size());
} catch (IllegalStateException ise) {
fail(ise.getMessage());
} catch (RocketLoadException | IOException e) {
throw new RuntimeException(e);
}
}
@Test
public void testThreeStage() {
OpenRocketDocument originalDocument = loadRocket("03.Three-stage.ork");
try {
// Convert to RASAero XML
WarningSet warnings = new WarningSet();
ErrorSet errors = new ErrorSet();
String result = new RASAeroSaver().marshalToRASAero(originalDocument, warnings, errors);
assertEquals(" incorrect amount of RASAero export warnings", 2, warnings.size());
assertEquals(" incorrect amount of RASAero export errors", 0, errors.size());
// Write to .CDX1 file
Path output = Files.createTempFile("03.Three-stage", ".CDX1");
Files.write(output, result.getBytes(StandardCharsets.UTF_8));
// Read the file
RASAeroLoader loader = new RASAeroLoader();
InputStream stream = new FileInputStream(output.toFile());
Assert.assertNotNull("Could not open 03.Three-stage.CDX1", stream);
OpenRocketDocument importedDocument = OpenRocketDocumentFactory.createEmptyRocket();
DocumentLoadingContext context = new DocumentLoadingContext();
context.setOpenRocketDocument(importedDocument);
context.setMotorFinder(new DatabaseMotorFinder());
loader.loadFromStream(context, new BufferedInputStream(stream), null);
Rocket importedRocket = importedDocument.getRocket();
// Test children counts
List<RocketComponent> importedChildren = importedRocket.getAllChildren();
assertEquals(" Number of total children doesn't match",
21, importedChildren.size());
} catch (IllegalStateException ise) {
fail(ise.getMessage());
} catch (RocketLoadException | IOException e) {
throw new RuntimeException(e);
}
}
private OpenRocketDocument loadRocket(String fileName) {
GeneralRocketLoader loader = new GeneralRocketLoader(new File(fileName));
InputStream is = this.getClass().getResourceAsStream(fileName);
String failMsg = String.format("Problem in unit test, cannot find %s", fileName);
assertNotNull(failMsg, is);
OpenRocketDocument rocketDoc = null;
try {
rocketDoc = loader.load(is, fileName);
} catch (RocketLoadException e) {
fail("RocketLoadException while loading file " + fileName + " : " + e.getMessage());
}
try {
is.close();
} catch (IOException e) {
fail("Unable to close input stream for file " + fileName + ": " + e.getMessage());
}
return rocketDoc;
}
private static class EmptyComponentDbProvider implements Provider<ComponentPresetDao> {
final ComponentPresetDao db = new ComponentPresetDatabase();
@Override
public ComponentPresetDao get() {
return db;
}
}
private static class MotorDbProvider implements Provider<ThrustCurveMotorSetDatabase> {
final ThrustCurveMotorSetDatabase db = new ThrustCurveMotorSetDatabase();
public MotorDbProvider() {
}
@Override
public ThrustCurveMotorSetDatabase get() {
return db;
}
}
}