Merge pull request 'advancedSE-paul' (#1) from advancedSE-paul into advancedSE

Reviewed-on: #1
This commit is contained in:
2025-05-25 18:33:18 +02:00
28 changed files with 487 additions and 115 deletions

2
.idea/misc.xml generated
View File

@ -13,7 +13,7 @@
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_19" default="true" project-jdk-name="19" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="19" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

25
pom.xml
View File

@ -80,6 +80,13 @@
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.17.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
@ -113,6 +120,24 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>@{argLine} -javaagent:${org.mockito:mockito-core:jar}</argLine>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -4,6 +4,7 @@ import fabrik.simulator.pic16f84.interfaces.*;
public class Commands extends PICComponent implements CommandInterface {
private int wRegister;
private long totalExecutionTime;
private double executionTimeMultiplier = 1;
public Commands(){
super();
@ -22,7 +23,7 @@ public class Commands extends PICComponent implements CommandInterface {
}
public double getTotalExecutionTime() {
return (totalExecutionTime * frontendController.getExecutionTimeMultiplier());
return (totalExecutionTime * getExecutionTimeMultiplier());
}
public void resetTotalExecutionTime() {
@ -248,8 +249,6 @@ public class Commands extends PICComponent implements CommandInterface {
else{
System.out.println("Nicht gefunden!");
}
}
public void SLEEP() {
@ -557,9 +556,39 @@ public class Commands extends PICComponent implements CommandInterface {
}
}
public double getExecutionTimeMultiplier(){
return executionTimeMultiplier;
}
public void setExecutionTimeMultiplier(String option){
switch (option) {
case "8 MHZ":
executionTimeMultiplier = 0.5;
break;
case "4 MHZ":
executionTimeMultiplier = 1;
break;
case "1 MHZ":
executionTimeMultiplier = 4;
break;
case "500 HZ":
executionTimeMultiplier = 8;
break;
case "100 HZ":
executionTimeMultiplier = 40;
break;
case "32 HZ":
executionTimeMultiplier = 125;
break;
}
}
@Override
public void initialize(PICComponents picComponents) {
System.out.println("Commands");
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -3,7 +3,6 @@ package fabrik.simulator.pic16f84;
import com.gluonhq.charm.glisten.control.ToggleButtonGroup;
import fabrik.simulator.pic16f84.interfaces.*;
import fabrik.simulator.pic16f84.interfaces.WatchdogTimerInterface;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
@ -42,14 +41,7 @@ public class Controller_Frontend extends PICComponent implements FrontendControl
private int [] prog;
private int [][] read;
private int [] ind;
private PICComponents picComponents;
private double executionTimeMultiplier = 1;
public double getExecutionTimeMultiplier(){
return executionTimeMultiplier;
}
private PICComponentLocator picComponents;
private boolean isBreakpointReached = false;
@ -160,29 +152,7 @@ public class Controller_Frontend extends PICComponent implements FrontendControl
private void updateExecutionTimeMultiplier() {
String selectedOption = executionTimeComboBox.getValue();
switch (selectedOption) {
case "8 MHZ":
executionTimeMultiplier = 0.5;
break;
case "4 MHZ":
executionTimeMultiplier = 1;
break;
case "1 MHZ":
executionTimeMultiplier = 4;
break;
case "500 HZ":
executionTimeMultiplier = 8;
break;
case "100 HZ":
executionTimeMultiplier = 40;
break;
case "32 HZ":
executionTimeMultiplier = 125;
break;
}
commands.setExecutionTimeMultiplier(selectedOption);
}
@FXML
@ -582,9 +552,9 @@ public class Controller_Frontend extends PICComponent implements FrontendControl
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
this.picComponents = picComponents;
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
this.picComponents = locator;
System.out.println("Frontend");
}
}

View File

@ -4,11 +4,9 @@ import fabrik.simulator.pic16f84.interfaces.*;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
@ -16,30 +14,20 @@ import javafx.stage.Stage;
import java.io.IOException;
import java.util.Objects;
public class CreateWindow extends Application {
private PICComponents picComponents = new PICComponents(); // Subjekt
public class CreateWindow extends Application implements WindowManagement {
private static PICComponentLocator picComponents; // Subjekt
public static GridPane grid = new GridPane();
private static VBox table;
@Override
public void start(Stage primaryStage) throws IOException {
picComponents.registerComponent(CommandInterface.class, new Commands());
picComponents.registerComponent(ToggleButtonInterface.class, new ToggleButtonGroupExt());
picComponents.registerComponent(FrontendControllerInterface.class, new Controller_Frontend());
picComponents.registerComponent(DataRegisterInterface.class, new DataRegister());
picComponents.registerComponent(EEPROMInterface.class, new EEPROM());
picComponents.registerComponent(InterruptInterface.class, new Interrupts());
picComponents.registerComponent(IOPortInterface.class, new IOPorts());
picComponents.registerComponent(PreScalerInterface.class, new PreScaler());
picComponents.registerComponent(ProgramStackInterface.class, new ProgramStack());
picComponents.registerComponent(TimerInterface.class, new Timer());
picComponents.registerComponent(WatchdogTimerInterface.class, new WatchdogTimer());
picComponents.initAll();
FXMLLoader codewindow = new FXMLLoader(CreateWindow.class.getResource("frontend.fxml"));
codewindow.setController(picComponents.getComponent(FrontendControllerInterface.class));
Parent code = codewindow.load();
table = Table.init(picComponents);
grid.add(table, 1, 1);
grid.add(code, 0, 1);
@ -53,6 +41,10 @@ public class CreateWindow extends Application {
primaryStage.show();
}
public void startFromMain(String[] args){
launch(args);
}
public static void main(String[] args) {
launch(args);
}
@ -62,7 +54,15 @@ public class CreateWindow extends Application {
table= Table.refresh();
grid.add(table, 1, 1);
}
@Override
public void initialize(PICComponentLocator picComponents) {
CreateWindow.picComponents = picComponents;
}
public CreateWindow (){
}
}

View File

@ -39,8 +39,8 @@ public class DataRegister extends PICComponent implements DataRegisterInterface
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
System.out.println("DataRegister.\n");
initOrReset();
}

View File

@ -1,7 +1,6 @@
package fabrik.simulator.pic16f84;
import eu.hansolo.tilesfx.Command;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
@ -36,6 +35,7 @@ public class EEPROM extends PICComponent implements EEPROMInterface {
}
public long read (int address) {
if (address < 0) return 0;
FileReader reader;
try {
reader = new FileReader("eeprom.json");
@ -60,6 +60,7 @@ public class EEPROM extends PICComponent implements EEPROMInterface {
}
public void write (int address, long data) {
if (address < 0) return;
FileReader reader;
try {
reader = new FileReader("eeprom.json");
@ -171,8 +172,7 @@ public class EEPROM extends PICComponent implements EEPROMInterface {
}
@Override
public void initialize(PICComponents picComponents) {
System.out.println("EEPROM");
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -145,7 +145,7 @@ public class EmptyRegister implements DataRegisterInterface {
}
@Override
public void initialize(PICComponents picComponents) {
public void initialize(PICComponentLocator picComponents) {
}
}

View File

@ -227,8 +227,8 @@ public class IOPorts extends PICComponent implements IOPortInterface {
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
System.out.println("IOPorts.\n");
}
}

View File

@ -1,9 +1,5 @@
package fabrik.simulator.pic16f84;
import eu.hansolo.tilesfx.Command;
import fabrik.simulator.pic16f84.interfaces.CommandInterface;
import fabrik.simulator.pic16f84.interfaces.DataRegisterInterface;
import fabrik.simulator.pic16f84.interfaces.FrontendControllerInterface;
import fabrik.simulator.pic16f84.interfaces.InterruptInterface;
public class Interrupts extends PICComponent implements InterruptInterface {
@ -66,7 +62,7 @@ public class Interrupts extends PICComponent implements InterruptInterface {
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -0,0 +1,25 @@
package fabrik.simulator.pic16f84;
import fabrik.simulator.pic16f84.interfaces.*;
public class Main {
private static final PICComponentLocator picComponents = new PICComponentLocator(); // Subjekt
public static void main(String[] args) {
picComponents.registerComponent(CommandInterface.class, new Commands());
picComponents.registerComponent(ToggleButtonInterface.class, new ToggleButtonGroupExt());
picComponents.registerComponent(DataRegisterInterface.class, new DataRegister());
picComponents.registerComponent(EEPROMInterface.class, new EEPROM());
picComponents.registerComponent(InterruptInterface.class, new Interrupts());
picComponents.registerComponent(IOPortInterface.class, new IOPorts());
picComponents.registerComponent(PreScalerInterface.class, new PreScaler());
picComponents.registerComponent(ProgramStackInterface.class, new ProgramStack());
picComponents.registerComponent(TimerInterface.class, new Timer());
picComponents.registerComponent(WatchdogTimerInterface.class, new WatchdogTimer());
CreateWindow window = new CreateWindow();
picComponents.registerComponent(WindowManagement.class, window);
picComponents.initAll();
window.startFromMain(new String[]{});
}
}

View File

@ -5,31 +5,27 @@ import fabrik.simulator.pic16f84.interfaces.*;
public abstract class PICComponent {
DataRegisterInterface dataRegister;
EEPROMInterface eeprom;
PreScaler preScaler;
PreScalerInterface preScaler;
IOPortInterface ioPorts;
TimerInterface timer;
InterruptInterface interrupts;
//TableInterface table;
//WindowManagement createWindow;
FrontendControllerInterface frontendController;
WatchdogTimerInterface watchdogTimer;
ProgramStackInterface programStack;
CommandInterface commands;
ToggleButtonInterface toggleButtonExt;
void initialize(PICComponents picComponents) {
toggleButtonExt = (ToggleButtonInterface) picComponents.getComponent(ToggleButtonInterface.class);
dataRegister = (DataRegisterInterface) picComponents.getComponent(DataRegisterInterface.class);
eeprom = (EEPROMInterface) picComponents.getComponent(EEPROMInterface.class);
ioPorts = (IOPortInterface) picComponents.getComponent(IOPortInterface.class);
preScaler = (PreScaler) picComponents.getComponent(PreScalerInterface.class);
timer = (TimerInterface) picComponents.getComponent(TimerInterface.class);
interrupts = (InterruptInterface) picComponents.getComponent(InterruptInterface.class);
//table = (TableInterface) picComponents.getComponent(TableInterface.class);
//createWindow = (WindowManagement) picComponents.getComponent(WindowManagement.class);
frontendController = (FrontendControllerInterface) picComponents.getComponent(FrontendControllerInterface.class);
watchdogTimer = (WatchdogTimerInterface) picComponents.getComponent(WatchdogTimerInterface.class);
programStack = (ProgramStackInterface) picComponents.getComponent(ProgramStackInterface.class);
commands = (CommandInterface) picComponents.getComponent(CommandInterface.class);
void initialize(PICComponentLocator locator) {
toggleButtonExt = locator.getComponent(ToggleButtonInterface.class);
dataRegister = locator.getComponent(DataRegisterInterface.class);
eeprom = locator.getComponent(EEPROMInterface.class);
ioPorts = locator.getComponent(IOPortInterface.class);
preScaler = locator.getComponent(PreScalerInterface.class);
timer = locator.getComponent(TimerInterface.class);
interrupts = locator.getComponent(InterruptInterface.class);
frontendController = locator.getComponent(FrontendControllerInterface.class);
watchdogTimer = locator.getComponent(WatchdogTimerInterface.class);
programStack = locator.getComponent(ProgramStackInterface.class);
commands = locator.getComponent(CommandInterface.class);
}
}

View File

@ -4,10 +4,11 @@ import fabrik.simulator.pic16f84.interfaces.*;
import java.util.HashMap;
public class PICComponents {
public class PICComponentLocator {
// https://en.wikipedia.org/wiki/Service_locator_pattern
private final HashMap<Class<? extends PICComponentInterface>, PICComponentInterface> componentCatalogue;
public PICComponents() {
public PICComponentLocator() {
super();
this.componentCatalogue = new HashMap<>();
}
@ -16,8 +17,9 @@ public class PICComponents {
this.componentCatalogue.put(componentClass, component);
}
public PICComponentInterface getComponent(Class<? extends PICComponentInterface> componentClass) {
return this.componentCatalogue.get(componentClass);
public <T extends PICComponentInterface> T getComponent(Class<T> componentClass) {
T component = (T) this.componentCatalogue.get(componentClass);
return component;
}
public void initAll() {

View File

@ -54,7 +54,7 @@ public class PreScaler extends PICComponent implements PreScalerInterface {
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -48,7 +48,7 @@ public class ProgramStack extends PICComponent implements ProgramStackInterface
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -4,7 +4,6 @@ import fabrik.simulator.pic16f84.interfaces.*;
import javafx.beans.property.SimpleStringProperty;
import javafx.geometry.Insets;
import javafx.scene.chart.PieChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
@ -46,7 +45,7 @@ public class Table {
return s;
}
public static VBox init(PICComponents picComponents){
public static VBox init(PICComponentLocator picComponents){
dataRegister = (DataRegisterInterface) picComponents.getComponent(DataRegisterInterface.class);
commands = (CommandInterface) picComponents.getComponent(CommandInterface.class);
ioPorts = (IOPortInterface) picComponents.getComponent(IOPortInterface.class);

View File

@ -1,8 +1,5 @@
package fabrik.simulator.pic16f84;
import fabrik.simulator.pic16f84.interfaces.DataRegisterInterface;
import fabrik.simulator.pic16f84.interfaces.FrontendControllerInterface;
import fabrik.simulator.pic16f84.interfaces.InterruptInterface;
import fabrik.simulator.pic16f84.interfaces.TimerInterface;
public class Timer extends PICComponent implements TimerInterface {
@ -67,7 +64,7 @@ public class Timer extends PICComponent implements TimerInterface {
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -1,7 +1,6 @@
package fabrik.simulator.pic16f84;
import com.gluonhq.charm.glisten.control.ToggleButtonGroup;
import fabrik.simulator.pic16f84.interfaces.IOPortInterface;
import fabrik.simulator.pic16f84.interfaces.ToggleButtonInterface;
import javafx.collections.ListChangeListener;
import javafx.event.EventHandler;
@ -59,8 +58,8 @@ public class ToggleButtonGroupExt extends PICComponent implements ToggleButtonIn
};
@Override
public void initialize(PICComponents picComponents) {
public void initialize(PICComponentLocator locator) {
System.out.println("ToggleButtonGroupExt");
super.initialize(picComponents);
super.initialize(locator);
}
}

View File

@ -26,7 +26,7 @@ public class WatchdogTimer extends PICComponent implements WatchdogTimerInterfac
}
else {
rawtimer++;
realtimer = (long) (rawtimer * frontendController.getExecutionTimeMultiplier());
realtimer = (long) (rawtimer * commands.getExecutionTimeMultiplier());
}
}
}
@ -53,7 +53,7 @@ public class WatchdogTimer extends PICComponent implements WatchdogTimerInterfac
}
@Override
public void initialize(PICComponents picComponents) {
super.initialize(picComponents);
public void initialize(PICComponentLocator locator) {
super.initialize(locator);
}
}

View File

@ -10,4 +10,10 @@ public interface CommandInterface extends PICComponentInterface {
void decode(int i);
void resetTotalExecutionTime();
void addExecutionTime(int i);
double getExecutionTimeMultiplier();
void setExecutionTimeMultiplier(String option);
}

View File

@ -4,4 +4,8 @@ public interface EEPROMInterface extends PICComponentInterface {
void registerTime(boolean b);
void parse(int i, int content, int i1);
long read(int address);
void write (int address, long data);
}

View File

@ -1,7 +1,6 @@
package fabrik.simulator.pic16f84.interfaces;
public interface FrontendControllerInterface extends PICComponentInterface {
double getExecutionTimeMultiplier();
void sleep();

View File

@ -1,7 +1,7 @@
package fabrik.simulator.pic16f84.interfaces;
import fabrik.simulator.pic16f84.PICComponents;
import fabrik.simulator.pic16f84.PICComponentLocator;
public interface PICComponentInterface {
void initialize(PICComponents picComponents);
void initialize(PICComponentLocator picComponents);
}

View File

@ -1,5 +1,7 @@
package fabrik.simulator.pic16f84.interfaces;
public interface WindowManagement extends PICComponentInterface {
void refreshTable();
static void refreshTable() {}
static void startFromMain(String[] args) {}
}

View File

@ -0,0 +1,88 @@
package fabrik.simulator.pic16f84;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
import fabrik.simulator.pic16f84.interfaces.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
class CommandsTests {
PICComponentLocator picComponents;
public CommandsTests() {}
@BeforeEach
void resetComponents() {
picComponents = new PICComponentLocator();
}
@Test
@DisplayName("Execution Time wird korrekt addiert")
void executionTimeIsAddedCorrectly() {
TimerInterface timerMock = mock(TimerInterface.class);
picComponents.registerComponent(TimerInterface.class, timerMock);
EEPROMInterface eepromMock = mock(EEPROMInterface.class);
picComponents.registerComponent(EEPROMInterface.class, eepromMock);
CommandInterface commands = new Commands();
picComponents.registerComponent(CommandInterface.class, commands);
picComponents.initAll();
commands.addExecutionTime(5);
assertEquals(5, commands.getTotalExecutionTime());
}
@Test
@DisplayName("Execution Time wird korrekt zurückgesetzt")
void executionTimeResetWorks() {
TimerInterface timerMock = mock(TimerInterface.class);
picComponents.registerComponent(TimerInterface.class, timerMock);
EEPROMInterface eepromMock = mock(EEPROMInterface.class);
picComponents.registerComponent(EEPROMInterface.class, eepromMock);
CommandInterface commands = new Commands();
picComponents.registerComponent(CommandInterface.class, commands);
picComponents.initAll();
commands.addExecutionTime(5);
commands.resetTotalExecutionTime();
assertEquals(0, commands.getTotalExecutionTime());
}
@Test
@DisplayName("Execution Time Faktor wird berücksichtigt")
void executionTimeMultiplierIsUsed() {
TimerInterface timerMock = mock(TimerInterface.class);
picComponents.registerComponent(TimerInterface.class, timerMock);
EEPROMInterface eepromMock = mock(EEPROMInterface.class);
picComponents.registerComponent(EEPROMInterface.class, eepromMock);
CommandInterface commands = new Commands();
picComponents.registerComponent(CommandInterface.class, commands);
picComponents.initAll();
commands.addExecutionTime(5);
commands.setExecutionTimeMultiplier("100 HZ");
assertEquals(5 * 40, commands.getTotalExecutionTime());
}
@Test
@DisplayName("Decode mit ungültigem Opcode wirft keine Exception")
void decodeInvalidOpcodeDoesNotCrash() {
CommandInterface commands = new Commands();
assertDoesNotThrow(() -> commands.decode(1));
}
}

View File

@ -0,0 +1,50 @@
package fabrik.simulator.pic16f84;
import fabrik.simulator.pic16f84.interfaces.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
class DataRegisterTests {
PICComponentLocator picComponents;
public DataRegisterTests() {}
@BeforeEach
void resetComponents() {
picComponents = new PICComponentLocator();
}
@Test
@DisplayName("DataRegister wird durch Components initialisiert und enthält dann die korrekten Startwerte")
void registerGetsInitializedThroughComponents() {
IOPortInterface mockIOPorts = mock(IOPortInterface.class);
picComponents.registerComponent(IOPortInterface.class, mockIOPorts);
DataRegisterInterface dataRegister = new DataRegister();
picComponents.registerComponent(DataRegisterInterface.class, dataRegister);
picComponents.initAll();
int [] expected = {0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 255, 0, 24, 0, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int [] actual = dataRegister.getDataRegister();
assertEquals(expected.length, actual.length);
for (int i = 0; i<expected.length; i++){
assertEquals(expected[i], actual[i]);
}
}
}

View File

@ -0,0 +1,135 @@
package fabrik.simulator.pic16f84;
import fabrik.simulator.pic16f84.interfaces.CommandInterface;
import fabrik.simulator.pic16f84.interfaces.DataRegisterInterface;
import fabrik.simulator.pic16f84.interfaces.EEPROMInterface;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
class EEPROMTests {
PICComponentLocator picComponents;
String savedEEPROM;
public EEPROMTests() {}
@BeforeEach
void resetComponentsAndReadEEPROM() throws IOException {
picComponents = new PICComponentLocator();
savedEEPROM = Files.readString(Path.of("eeprom.json"));
}
@AfterEach
public void rewriteEEPROM() throws IOException {
FileWriter writer = new FileWriter("eeprom.json");
writer.write(savedEEPROM);
writer.close();
}
@Test
@DisplayName("EEPROM read gibt gültigen Wert zurück")
void eepromReadReturnsValidLong() throws IOException {
FileWriter writer = new FileWriter("eeprom.json");
writer.write("{\"0\": 255}");
writer.close();
DataRegisterInterface mockDataRegister = Mockito.mock(DataRegisterInterface.class);
picComponents.registerComponent(DataRegisterInterface.class, mockDataRegister);
EEPROMInterface eeprom = new EEPROM();
picComponents.registerComponent(EEPROMInterface.class, eeprom);
picComponents.initAll();
long value = eeprom.read(0);
assertEquals(255, value);
}
@Test
@DisplayName("EEPROM write schreibt an die korrekte Adresse in eeprom.json")
void eepromWritesCorrectly() throws IOException {
FileWriter writer = new FileWriter("eeprom.json");
writer.write("{}");
writer.close();
DataRegisterInterface mockDataRegister = Mockito.mock(DataRegisterInterface.class);
picComponents.registerComponent(DataRegisterInterface.class, mockDataRegister);
CommandInterface mockCommands = mock(CommandInterface.class);
picComponents.registerComponent(CommandInterface.class, mockCommands);
EEPROMInterface eeprom = new EEPROM();
picComponents.registerComponent(EEPROMInterface.class, eeprom);
picComponents.initAll();
eeprom.write(3, 123);
assertEquals("{\"3\":123}", Files.readString(Path.of("eeprom.json")));
}
@Test
@DisplayName("EEPROM write schreibt nicht an negative Adressen")
void eepromDoesntWriteNegative() throws IOException {
FileWriter writer = new FileWriter("eeprom.json");
writer.write("{}");
writer.close();
DataRegisterInterface mockDataRegister = Mockito.mock(DataRegisterInterface.class);
picComponents.registerComponent(DataRegisterInterface.class, mockDataRegister);
CommandInterface mockCommands = mock(CommandInterface.class);
picComponents.registerComponent(CommandInterface.class, mockCommands);
EEPROMInterface eeprom = new EEPROM();
picComponents.registerComponent(EEPROMInterface.class, eeprom);
picComponents.initAll();
eeprom.write(-1, 1);
assertEquals("{}", Files.readString(Path.of("eeprom.json")));
}
@Test
@DisplayName("EEPROM read mit negativem Wert liefert 0")
void eepromReadWithNegativeAddress() throws IOException {
FileWriter writer = new FileWriter("eeprom.json");
writer.write("{\"-1\":5}");
writer.close();
DataRegisterInterface mockDataRegister = Mockito.mock(DataRegisterInterface.class);
picComponents.registerComponent(DataRegisterInterface.class, mockDataRegister);
CommandInterface mockCommands = mock(CommandInterface.class);
picComponents.registerComponent(CommandInterface.class, mockCommands);
EEPROMInterface eeprom = new EEPROM();
picComponents.registerComponent(EEPROMInterface.class, eeprom);
picComponents.initAll();
long result = eeprom.read(-1);
assertEquals(0, result);
}
}

View File

@ -0,0 +1,50 @@
package fabrik.simulator.pic16f84;
import fabrik.simulator.pic16f84.interfaces.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class WatchDogTimerTests {
private PICComponentLocator picComponents;
@BeforeEach
void resetComponents() {
picComponents = new PICComponentLocator();
}
@Test
@DisplayName("WatchDogTimer testet ob er triggern soll, triggert korrekt nicht")
void watchDogIncrementWithoutTriggering() {
PreScalerInterface mockPreScaler = mock(PreScalerInterface.class);
when(
mockPreScaler.isPrescalerOnTimer()
).thenReturn(
true
);
picComponents.registerComponent(PreScalerInterface.class, mockPreScaler);
CommandInterface mockCommands = mock(CommandInterface.class);
when(
mockCommands.getExecutionTimeMultiplier()
).thenReturn(
1.0
);
picComponents.registerComponent(CommandInterface.class, mockCommands);
WatchdogTimerInterface watchDogTimer = new WatchdogTimer();
picComponents.registerComponent(WatchdogTimerInterface.class, watchDogTimer);
picComponents.initAll();
watchDogTimer.enable();
watchDogTimer.testAndTrigger();
assertEquals(1, watchDogTimer.get());
}
}