diff --git a/pom.xml b/pom.xml index b7c617a..67f2028 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,11 @@ slf4j-simple 2.0.12 + + org.junit.jupiter + junit-jupiter + 5.11.0-M1 + \ No newline at end of file diff --git a/src/main/java/de/ph87/electro/circuit/Circuit.java b/src/main/java/de/ph87/electro/circuit/Circuit.java index 6ac3594..47e8a13 100644 --- a/src/main/java/de/ph87/electro/circuit/Circuit.java +++ b/src/main/java/de/ph87/electro/circuit/Circuit.java @@ -3,9 +3,12 @@ package de.ph87.electro.circuit; import de.ph87.electro.circuit.junction.Junction; import de.ph87.electro.circuit.junction.Wire; import de.ph87.electro.circuit.part.Part; -import de.ph87.electro.circuit.part.PartOther; import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.PartOther; import de.ph87.electro.circuit.part.other.PartLight; +import de.ph87.electro.circuit.part.other.PartSwitch1x1; +import de.ph87.electro.circuit.part.other.PartSwitch1x2; +import de.ph87.electro.circuit.part.other.PartSwitchCross; import lombok.Getter; import java.util.ArrayList; @@ -36,15 +39,37 @@ public class Circuit { return light; } - public void connect(final Junction a, final Junction b) { - wires.add(new Wire(a, b)); + public PartSwitch1x1 addSwitch1x1(final String name, final int x, final int y) { + final PartSwitch1x1 switch1x1 = new PartSwitch1x1(name, x, y); + parts.add(switch1x1); + others.add(switch1x1); + return switch1x1; + } + + public PartSwitch1x2 addSwitch1x2(final String name, final int x, final int y) { + final PartSwitch1x2 switch1x2 = new PartSwitch1x2(name, x, y); + parts.add(switch1x2); + others.add(switch1x2); + return switch1x2; + } + + public PartSwitchCross addSwitchCross(final String name, final int x, final int y) { + final PartSwitchCross switchCross = new PartSwitchCross(name, x, y); + parts.add(switchCross); + others.add(switchCross); + return switchCross; + } + + public Wire connect(final Junction a, final Junction b) { + final Wire wire = new Wire(a, b); + wires.add(wire); + return wire; } public void evaluate() { wires.forEach(Wire::reset); parts.forEach(Part::reset); - batteries.forEach(PartBattery::propagate); - others.forEach(PartOther::evaluate); + batteries.forEach(PartBattery::startPropagation); } } diff --git a/src/main/java/de/ph87/electro/circuit/junction/Junction.java b/src/main/java/de/ph87/electro/circuit/junction/Junction.java index a05aacf..11a711c 100644 --- a/src/main/java/de/ph87/electro/circuit/junction/Junction.java +++ b/src/main/java/de/ph87/electro/circuit/junction/Junction.java @@ -1,6 +1,7 @@ package de.ph87.electro.circuit.junction; import de.ph87.electro.circuit.ShortCircuit; +import de.ph87.electro.circuit.part.Part; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -13,6 +14,8 @@ import java.util.List; @ToString(onlyExplicitlyIncluded = true) public class Junction { + private final Part owner; + @ToString.Include private final String name; @@ -24,7 +27,8 @@ public class Junction { private final List wires = new ArrayList<>(); - public Junction(final String name, final int x, final int y) { + public Junction(final Part owner, final String name, final int x, final int y) { + this.owner = owner; this.name = name; this.position = new Point(x, y); } @@ -33,28 +37,15 @@ public class Junction { voltage = Double.NaN; } - public void injectVoltage(final double newVoltage) throws ShortCircuit { + public void propagate(final double newVoltage) throws ShortCircuit { if (voltage == newVoltage) { return; } if (Double.isNaN(voltage)) { voltage = newVoltage; + owner.propagate(this); for (Wire wire : wires) { - wire.propagateVoltage(this); - } - return; - } - throw new ShortCircuit(); - } - - public void propagateVoltage(final Wire source) throws ShortCircuit { - if (voltage == source.getVoltage()) { - return; - } - if (Double.isNaN(voltage)) { - voltage = source.getVoltage(); - for (Wire wire : this.wires) { - wire.propagateVoltage(this); + wire.propagate(newVoltage); } return; } diff --git a/src/main/java/de/ph87/electro/circuit/junction/Wire.java b/src/main/java/de/ph87/electro/circuit/junction/Wire.java index e747ca1..03a5d42 100644 --- a/src/main/java/de/ph87/electro/circuit/junction/Wire.java +++ b/src/main/java/de/ph87/electro/circuit/junction/Wire.java @@ -26,14 +26,14 @@ public class Wire { voltage = Double.NaN; } - public void propagateVoltage(final Junction source) throws ShortCircuit { - if (voltage == source.getVoltage()) { + public void propagate(final double newVoltage) throws ShortCircuit { + if (voltage == newVoltage) { return; } - if (Double.isNaN(this.voltage)) { - voltage = source.getVoltage(); - junction0.propagateVoltage(this); - junction1.propagateVoltage(this); + if (Double.isNaN(voltage)) { + voltage = newVoltage; + junction0.propagate(voltage); + junction1.propagate(voltage); return; } throw new ShortCircuit(); diff --git a/src/main/java/de/ph87/electro/circuit/part/Part.java b/src/main/java/de/ph87/electro/circuit/part/Part.java index cffded1..bf9a499 100644 --- a/src/main/java/de/ph87/electro/circuit/part/Part.java +++ b/src/main/java/de/ph87/electro/circuit/part/Part.java @@ -1,5 +1,6 @@ package de.ph87.electro.circuit.part; +import de.ph87.electro.circuit.ShortCircuit; import de.ph87.electro.circuit.junction.Junction; import lombok.Getter; import lombok.Setter; @@ -30,4 +31,6 @@ public abstract class Part { junctions.forEach(Junction::reset); } + public abstract void propagate(final Junction source) throws ShortCircuit; + } diff --git a/src/main/java/de/ph87/electro/circuit/part/PartBattery.java b/src/main/java/de/ph87/electro/circuit/part/PartBattery.java index 09e5889..f15a3d3 100644 --- a/src/main/java/de/ph87/electro/circuit/part/PartBattery.java +++ b/src/main/java/de/ph87/electro/circuit/part/PartBattery.java @@ -20,20 +20,25 @@ public class PartBattery extends Part { public PartBattery(final String name, final int x, final int y, final double voltage) { super(name, x, y); this.voltage = voltage; - minus = new Junction("-", 0, 1); - plus = new Junction("+", 2, 1); + minus = new Junction(this, "-", 0, 1); + plus = new Junction(this, "+", 2, 1); junctions.add(minus); junctions.add(plus); } - public void propagate() { + public void startPropagation() { try { shortCircuit = null; - minus.injectVoltage(0); - plus.injectVoltage(voltage); + minus.propagate(0); + plus.propagate(voltage); } catch (ShortCircuit e) { shortCircuit = e; } } + @Override + public void propagate(final Junction source) { + // nothing + } + } diff --git a/src/main/java/de/ph87/electro/circuit/part/PartOther.java b/src/main/java/de/ph87/electro/circuit/part/PartOther.java index d3cd1e8..e34f71e 100644 --- a/src/main/java/de/ph87/electro/circuit/part/PartOther.java +++ b/src/main/java/de/ph87/electro/circuit/part/PartOther.java @@ -6,6 +6,4 @@ public abstract class PartOther extends Part { super(name, x, y); } - public abstract void evaluate(); - } diff --git a/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java b/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java index 2cbe0af..be07da6 100644 --- a/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java +++ b/src/main/java/de/ph87/electro/circuit/part/other/PartLight.java @@ -1,5 +1,6 @@ package de.ph87.electro.circuit.part.other; +import de.ph87.electro.circuit.ShortCircuit; import de.ph87.electro.circuit.junction.Junction; import de.ph87.electro.circuit.part.PartOther; import lombok.Getter; @@ -24,8 +25,8 @@ public class PartLight extends PartOther { public PartLight(final String name, final int x, final int y, final double maxVoltage) { super(name, x, y); this.maxVoltage = maxVoltage; - minus = new Junction("", 0, 1); - plus = new Junction("", 2, 1); + minus = new Junction(this, "", 0, 1); + plus = new Junction(this, "", 2, 1); junctions.add(minus); junctions.add(plus); } @@ -35,7 +36,7 @@ public class PartLight extends PartOther { } @Override - public void evaluate() { + public void propagate(final Junction source) { voltage = abs(plus.getVoltage() - minus.getVoltage()); if (voltage > maxVoltage) { defect = true; diff --git a/src/main/java/de/ph87/electro/circuit/part/other/PartSwitch1x1.java b/src/main/java/de/ph87/electro/circuit/part/other/PartSwitch1x1.java new file mode 100644 index 0000000..6957f41 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/other/PartSwitch1x1.java @@ -0,0 +1,46 @@ +package de.ph87.electro.circuit.part.other; + +import de.ph87.electro.circuit.ShortCircuit; +import de.ph87.electro.circuit.junction.Junction; +import de.ph87.electro.circuit.part.PartOther; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@ToString(callSuper = true) +public class PartSwitch1x1 extends PartOther { + + private final Junction common; + + private final Junction output; + + @Setter + private boolean state = false; + + public PartSwitch1x1(final String name, final int x, final int y) { + super(name, x, y); + common = new Junction(this, "", 0, 1); + output = new Junction(this, "", 2, 1); + junctions.add(common); + junctions.add(output); + } + + public void toggle() { + state = !state; + } + + @Override + public void propagate(final Junction source) throws ShortCircuit { + if (source == common) { + if (state) { + output.propagate(source.getVoltage()); + } + } else if (source == output) { + if (state) { + common.propagate(source.getVoltage()); + } + } + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/other/PartSwitch1x2.java b/src/main/java/de/ph87/electro/circuit/part/other/PartSwitch1x2.java new file mode 100644 index 0000000..262501d --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/other/PartSwitch1x2.java @@ -0,0 +1,56 @@ +package de.ph87.electro.circuit.part.other; + +import de.ph87.electro.circuit.ShortCircuit; +import de.ph87.electro.circuit.junction.Junction; +import de.ph87.electro.circuit.part.PartOther; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@ToString(callSuper = true) +public class PartSwitch1x2 extends PartOther { + + private final Junction common; + + private final Junction output0; + + private final Junction output1; + + @Setter + private boolean state = false; + + public PartSwitch1x2(final String name, final int x, final int y) { + super(name, x, y); + common = new Junction(this, "", 0, 1); + output0 = new Junction(this, "", 2, 1); + output1 = new Junction(this, "", 2, 1); + junctions.add(common); + junctions.add(output0); + junctions.add(output1); + } + + public void toggle() { + state = !state; + } + + @Override + public void propagate(final Junction source) throws ShortCircuit { + if (source == common) { + if (state) { + output1.propagate(source.getVoltage()); + } else { + output0.propagate(source.getVoltage()); + } + } else if (source == output0) { + if (!state) { + common.propagate(source.getVoltage()); + } + } else if (source == output1) { + if (state) { + common.propagate(source.getVoltage()); + } + } + } + +} diff --git a/src/main/java/de/ph87/electro/circuit/part/other/PartSwitchCross.java b/src/main/java/de/ph87/electro/circuit/part/other/PartSwitchCross.java new file mode 100644 index 0000000..1e6dbd2 --- /dev/null +++ b/src/main/java/de/ph87/electro/circuit/part/other/PartSwitchCross.java @@ -0,0 +1,70 @@ +package de.ph87.electro.circuit.part.other; + +import de.ph87.electro.circuit.ShortCircuit; +import de.ph87.electro.circuit.junction.Junction; +import de.ph87.electro.circuit.part.PartOther; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +@Getter +@ToString(callSuper = true) +public class PartSwitchCross extends PartOther { + + private final Junction common0; + + private final Junction common1; + + private final Junction output0; + + private final Junction output1; + + @Setter + private boolean state = false; + + public PartSwitchCross(final String name, final int x, final int y) { + super(name, x, y); + common0 = new Junction(this, "", 0, 1); + common1 = new Junction(this, "", 0, 1); + output0 = new Junction(this, "", 2, 1); + output1 = new Junction(this, "", 2, 1); + junctions.add(common0); + junctions.add(common1); + junctions.add(output0); + junctions.add(output1); + } + + public void toggle() { + state = !state; + } + + @Override + public void propagate(final Junction source) throws ShortCircuit { + if (source == common0) { + if (state) { + output1.propagate(source.getVoltage()); + } else { + output0.propagate(source.getVoltage()); + } + } else if (source == common1) { + if (state) { + output0.propagate(source.getVoltage()); + } else { + output1.propagate(source.getVoltage()); + } + } else if (source == output0) { + if (state) { + common1.propagate(source.getVoltage()); + } else { + common0.propagate(source.getVoltage()); + } + } else if (source == output1) { + if (state) { + common0.propagate(source.getVoltage()); + } else { + common1.propagate(source.getVoltage()); + } + } + } + +} diff --git a/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java b/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java new file mode 100644 index 0000000..8a6a8b6 --- /dev/null +++ b/src/test/java/de/ph87/electro/circuit/BatteryLightTest.java @@ -0,0 +1,41 @@ +package de.ph87.electro.circuit; + +import de.ph87.electro.circuit.junction.Wire; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class BatteryLightTest { + + private static final double VOLTAGE = 3; + + private final Circuit circuit = new Circuit(); + + private final PartBattery battery = circuit.addBattery("Batterie", 1, 0, VOLTAGE); + + private final PartLight light = circuit.addLight("Licht", 1, 1, VOLTAGE); + + private final Wire plus = circuit.connect(battery.getPlus(), light.getPlus()); + + private final Wire minus = circuit.connect(light.getMinus(), battery.getMinus()); + + @Test + void test() { + circuit.evaluate(); + + assertEquals(VOLTAGE, battery.getPlus().getVoltage()); + assertEquals(VOLTAGE, plus.getVoltage()); + + assertEquals(VOLTAGE, light.getPlus().getVoltage()); + assertEquals(VOLTAGE, light.getVoltage()); + assertEquals(0, light.getMinus().getVoltage()); + assertFalse(light.isDefect()); + + assertEquals(0, minus.getVoltage()); + assertEquals(0, battery.getMinus().getVoltage()); + } + +} diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java new file mode 100644 index 0000000..82ad95a --- /dev/null +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x1Test.java @@ -0,0 +1,65 @@ +package de.ph87.electro.circuit; + +import de.ph87.electro.circuit.junction.Wire; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; +import de.ph87.electro.circuit.part.other.PartSwitch1x1; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class BatterySwitcher1x1Test { + + private static final double VOLTAGE = 3; + + private final Circuit circuit = new Circuit(); + + private final PartBattery battery = circuit.addBattery("Batterie", 1, 0, VOLTAGE); + + private final PartSwitch1x1 switcher = circuit.addSwitch1x1("Ein-/Ausschalter", 1, 1); + + private final PartLight light = circuit.addLight("Licht", 1, 1, VOLTAGE); + + private final Wire plus = circuit.connect(battery.getPlus(), switcher.getCommon()); + + private final Wire output = circuit.connect(switcher.getOutput(), light.getPlus()); + + private final Wire minus = circuit.connect(light.getMinus(), battery.getMinus()); + + @Test + public void test0() { + test(false); + } + + @Test + public void test1() { + test(true); + } + + private void test(final boolean state) { + final double voltage = state ? VOLTAGE : Double.NaN; + + switcher.setState(state); + + circuit.evaluate(); + + assertEquals(state, switcher.isState()); + + assertEquals(VOLTAGE, battery.getPlus().getVoltage()); + assertEquals(VOLTAGE, plus.getVoltage()); + + assertEquals(VOLTAGE, switcher.getCommon().getVoltage()); + + assertEquals(voltage, switcher.getOutput().getVoltage()); + assertEquals(voltage, output.getVoltage()); + assertEquals(voltage, light.getPlus().getVoltage()); + assertEquals(voltage, light.getVoltage()); + assertEquals(0, light.getMinus().getVoltage()); + assertEquals(0, minus.getVoltage()); + assertFalse(light.isDefect()); + + assertEquals(0, battery.getMinus().getVoltage()); + } + +} diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java new file mode 100644 index 0000000..d02cc7e --- /dev/null +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcher1x2Test.java @@ -0,0 +1,80 @@ +package de.ph87.electro.circuit; + +import de.ph87.electro.circuit.junction.Wire; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; +import de.ph87.electro.circuit.part.other.PartSwitch1x2; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class BatterySwitcher1x2Test { + + private static final double VOLTAGE = 3; + + private final Circuit circuit = new Circuit(); + + private final PartBattery battery = circuit.addBattery("Batterie", 1, 0, VOLTAGE); + + private final PartSwitch1x2 switcher = circuit.addSwitch1x2("Wechselschalter", 1, 1); + + private final PartLight light0 = circuit.addLight("Licht 0", 1, 1, VOLTAGE); + + private final PartLight light1 = circuit.addLight("Licht 1", 1, 1, VOLTAGE); + + private final Wire plus = circuit.connect(battery.getPlus(), switcher.getCommon()); + + private final Wire output0 = circuit.connect(switcher.getOutput0(), light0.getPlus()); + + private final Wire minus0 = circuit.connect(light0.getMinus(), battery.getMinus()); + + private final Wire output1 = circuit.connect(switcher.getOutput1(), light1.getPlus()); + + private final Wire minus1 = circuit.connect(light1.getMinus(), battery.getMinus()); + + @Test + public void test0() { + test(false); + } + + @Test + public void test1() { + test(true); + } + + private void test(final boolean state) { + final double voltage0 = state ? Double.NaN : VOLTAGE; + final double voltage1 = state ? VOLTAGE : Double.NaN; + + switcher.setState(state); + + circuit.evaluate(); + + assertEquals(state, switcher.isState()); + + assertEquals(VOLTAGE, battery.getPlus().getVoltage()); + assertEquals(VOLTAGE, plus.getVoltage()); + + assertEquals(VOLTAGE, switcher.getCommon().getVoltage()); + + assertEquals(voltage0, switcher.getOutput0().getVoltage()); + assertEquals(voltage0, output0.getVoltage()); + assertEquals(voltage0, light0.getPlus().getVoltage()); + assertEquals(voltage0, light0.getVoltage()); + assertEquals(0, light0.getMinus().getVoltage()); + assertEquals(0, minus0.getVoltage()); + assertFalse(light0.isDefect()); + + assertEquals(voltage1, switcher.getOutput1().getVoltage()); + assertEquals(voltage1, output1.getVoltage()); + assertEquals(voltage1, light1.getPlus().getVoltage()); + assertEquals(voltage1, light1.getVoltage()); + assertEquals(0, light1.getMinus().getVoltage()); + assertEquals(0, minus1.getVoltage()); + assertFalse(light1.isDefect()); + + assertEquals(0, battery.getMinus().getVoltage()); + } + +} diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java new file mode 100644 index 0000000..9690429 --- /dev/null +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcher2x2Test.java @@ -0,0 +1,94 @@ +package de.ph87.electro.circuit; + +import de.ph87.electro.circuit.junction.Wire; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; +import de.ph87.electro.circuit.part.other.PartSwitch1x2; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class BatterySwitcher2x2Test { + + private static final double VOLTAGE = 3; + + private final Circuit circuit = new Circuit(); + + private final PartBattery battery = circuit.addBattery("Batterie", 1, 0, VOLTAGE); + + private final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 1, 1); + + private final PartSwitch1x2 switcher1 = circuit.addSwitch1x2("Wechselschalter 1", 1, 1); + + private final PartLight light = circuit.addLight("Licht", 1, 1, VOLTAGE); + + private final Wire plus = circuit.connect(battery.getPlus(), switcher0.getCommon()); + + private final Wire switcher00 = circuit.connect(switcher0.getOutput0(), switcher1.getOutput0()); + + private final Wire switcher01 = circuit.connect(switcher0.getOutput1(), switcher1.getOutput1()); + + private final Wire output = circuit.connect(switcher1.getCommon(), light.getPlus()); + + private final Wire minus = circuit.connect(light.getMinus(), battery.getMinus()); + + @Test + public void test00() { + test(false, false); + } + + @Test + public void test10() { + test(true, false); + } + + @Test + public void test01() { + test(false, true); + } + + @Test + public void test11() { + test(true, true); + } + + private void test(final boolean state0, final boolean state1) { + final double voltage0 = state0 ? Double.NaN : VOLTAGE; + final double voltage1 = state0 ? VOLTAGE : Double.NaN; + final double voltage = state1 ? voltage1 : voltage0; + + switcher0.setState(state0); + switcher1.setState(state1); + + circuit.evaluate(); + + assertEquals(state0, switcher0.isState()); + assertEquals(state1, switcher1.isState()); + + assertEquals(VOLTAGE, battery.getPlus().getVoltage()); + assertEquals(VOLTAGE, plus.getVoltage()); + + assertEquals(VOLTAGE, switcher0.getCommon().getVoltage()); + + assertEquals(voltage0, switcher0.getOutput0().getVoltage()); + assertEquals(voltage0, switcher00.getVoltage()); + assertEquals(voltage0, switcher1.getOutput0().getVoltage()); + + assertEquals(voltage1, switcher0.getOutput1().getVoltage()); + assertEquals(voltage1, switcher01.getVoltage()); + assertEquals(voltage1, switcher1.getOutput1().getVoltage()); + + assertEquals(voltage, switcher1.getCommon().getVoltage()); + assertEquals(voltage, output.getVoltage()); + assertEquals(voltage, light.getPlus().getVoltage()); + assertEquals(voltage, light.getVoltage()); + + assertEquals(0, light.getMinus().getVoltage()); + assertEquals(0, minus.getVoltage()); + assertFalse(light.isDefect()); + + assertEquals(0, battery.getMinus().getVoltage()); + } + +} diff --git a/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java b/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java new file mode 100644 index 0000000..6813071 --- /dev/null +++ b/src/test/java/de/ph87/electro/circuit/BatterySwitcherCrossTest.java @@ -0,0 +1,132 @@ +package de.ph87.electro.circuit; + +import de.ph87.electro.circuit.junction.Wire; +import de.ph87.electro.circuit.part.PartBattery; +import de.ph87.electro.circuit.part.other.PartLight; +import de.ph87.electro.circuit.part.other.PartSwitch1x2; +import de.ph87.electro.circuit.part.other.PartSwitchCross; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +public class BatterySwitcherCrossTest { + + private static final double VOLTAGE = 3; + + private final Circuit circuit = new Circuit(); + + private final PartBattery battery = circuit.addBattery("Batterie", 1, 0, VOLTAGE); + + private final PartSwitch1x2 switcher0 = circuit.addSwitch1x2("Wechselschalter 0", 1, 1); + + private final PartSwitchCross switcherX = circuit.addSwitchCross("Kreuzschalter", 1, 1); + + private final PartSwitch1x2 switcher1 = circuit.addSwitch1x2("Wechselschalter 1", 1, 1); + + private final PartLight light = circuit.addLight("Licht", 1, 1, VOLTAGE); + + private final Wire plus = circuit.connect(battery.getPlus(), switcher0.getCommon()); + + private final Wire switcher00 = circuit.connect(switcher0.getOutput0(), switcherX.getCommon0()); + + private final Wire switcher01 = circuit.connect(switcher0.getOutput1(), switcherX.getCommon1()); + + private final Wire switcherX0 = circuit.connect(switcherX.getOutput0(), switcher1.getOutput0()); + + private final Wire switcherX1 = circuit.connect(switcherX.getOutput1(), switcher1.getOutput1()); + + private final Wire output = circuit.connect(switcher1.getCommon(), light.getPlus()); + + private final Wire minus = circuit.connect(light.getMinus(), battery.getMinus()); + + @Test + public void test000() { + test(false, false, false); + } + + @Test + public void test100() { + test(true, false, false); + } + + @Test + public void test010() { + test(false, true, false); + } + + @Test + public void test110() { + test(true, true, false); + } + + @Test + public void test001() { + test(false, false, true); + } + + @Test + public void test101() { + test(true, false, true); + } + + @Test + public void test011() { + test(false, true, true); + } + + @Test + public void test111() { + test(true, true, true); + } + + private void test(final boolean state0, final boolean stateX, final boolean state1) { + final double voltage00 = state0 ? Double.NaN : VOLTAGE; + final double voltage01 = state0 ? VOLTAGE : Double.NaN; + final double voltageX0 = stateX ? voltage01 : voltage00; + final double voltageX1 = stateX ? voltage00 : voltage01; + final double voltage = state1 ? voltageX1 : voltageX0; + + switcher0.setState(state0); + switcherX.setState(stateX); + switcher1.setState(state1); + + circuit.evaluate(); + + assertEquals(state0, switcher0.isState()); + assertEquals(stateX, switcherX.isState()); + assertEquals(state1, switcher1.isState()); + + assertEquals(VOLTAGE, battery.getPlus().getVoltage()); + assertEquals(VOLTAGE, plus.getVoltage()); + assertEquals(VOLTAGE, switcher0.getCommon().getVoltage()); + + assertEquals(voltage00, switcher0.getOutput0().getVoltage()); + assertEquals(voltage00, switcher00.getVoltage()); + assertEquals(voltage00, switcherX.getCommon0().getVoltage()); + + assertEquals(voltage01, switcher0.getOutput1().getVoltage()); + assertEquals(voltage01, switcher01.getVoltage()); + assertEquals(voltage01, switcherX.getCommon1().getVoltage()); + + assertEquals(voltageX0, switcherX.getOutput0().getVoltage()); + assertEquals(voltageX0, switcherX0.getVoltage()); + assertEquals(voltageX0, switcher1.getOutput0().getVoltage()); + + assertEquals(voltageX1, switcherX.getOutput1().getVoltage()); + assertEquals(voltageX1, switcherX1.getVoltage()); + assertEquals(voltageX1, switcher1.getOutput1().getVoltage()); + + assertEquals(voltage, switcher1.getCommon().getVoltage()); + assertEquals(voltage, output.getVoltage()); + assertEquals(voltage, light.getPlus().getVoltage()); + assertEquals(voltage, light.getVoltage()); + + assertEquals(0, light.getMinus().getVoltage()); + assertEquals(0, minus.getVoltage()); + assertFalse(light.isDefect()); + + assertEquals(0, battery.getMinus().getVoltage()); + } + +}