// Path: src/main/java/com/kasirgalabs/etumulator/processor/APSR.java
// @Singleton
// public class APSR implements Observable {
//     private boolean negative;
//     private boolean zero;
//     private boolean carry;
//     private boolean overflow;
//     private final Dispatcher dispatcher;
// 
//     /**
//      * Construct an APSR with {@link BaseDispatcher}.
//      *
//      * @see BaseDispatcher
//      */
//     public APSR() {
//         this.dispatcher = new BaseDispatcher();
//     }
// 
//     /**
//      * Construct an APSR with the given dispatcher as parameter.
//      *
//      * @param dispatcher The dispatcher which will be used to notify observers.
//      *
//      * @see Dispatcher
//      */
//     @Inject
//     public APSR(Dispatcher dispatcher) {
//         this.dispatcher = dispatcher;
//     }
// 
//     /**
//      * Adds an observer to the list of observers for this object.
//      *
//      * @param observer The observer to be deleted.
//      *
//      * @see Observer
//      */
//     @Override
//     public void addObserver(Observer observer) {
//         dispatcher.addObserver(observer);
//     }
// 
//     /**
//      * @return The negative.
//      */
//     public boolean isNegative() {
//         return negative;
//     }
// 
//     /**
//      * @param negative The negative to set.
//      */
//     public void setNegative(boolean negative) {
//         this.negative = negative;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * @return The zero.
//      */
//     public boolean isZero() {
//         return zero;
//     }
// 
//     /**
//      * @param zero The zero to set.
//      */
//     public void setZero(boolean zero) {
//         this.zero = zero;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * @return The carry.
//      */
//     public boolean isCarry() {
//         return carry;
//     }
// 
//     /**
//      * @param carry The carry to set.
//      */
//     public void setCarry(boolean carry) {
//         this.carry = carry;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * @return The overflow.
//      */
//     public boolean isOverflow() {
//         return overflow;
//     }
// 
//     /**
//      * @param overflow The overflow to set.
//      */
//     public void setOverflow(boolean overflow) {
//         this.overflow = overflow;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * Updates negative and zero flag depending on the given value as parameter.
//      *
//      * @param value The value used to update negative and zero flag.
//      *
//      * @return The returns the given value.
//      */
//     public int updateNZ(int value) {
//         negative = value < 0;
//         zero = value == 0;
//         dispatcher.notifyObservers(APSR.class);
//         return value;
//     }
// 
//     /**
//      * Sets all the flags to false.
//      */
//     public void reset() {
//         negative = false;
//         zero = false;
//         carry = false;
//         overflow = false;
//         dispatcher.notifyObservers(APSR.class);
//     }
// }
// 
// Path: src/main/java/com/kasirgalabs/etumulator/util/GUISafeDispatcher.java
// public class GUISafeDispatcher extends BaseDispatcher {
//     @Override
//     public void notifyObservers(Class<?> clazz, Object arg) {
//         final CountDownLatch latch = new CountDownLatch(1);
//         Platform.runLater(() -> {
//             super.notifyObservers(clazz, arg);
//             latch.countDown();
//         });
//         try {
//             if(!Platform.isFxApplicationThread()) {
//                 latch.await();
//             }
//         } catch(InterruptedException ex) {
//             throw new CancellationException();
//         }
//     }
// 
//     @Override
//     public void notifyObservers(Class<?> clazz) {
//         notifyObservers(clazz, null);
//     }
// }


import com.kasirgalabs.etumulator.processor.APSR;
import com.kasirgalabs.etumulator.util.GUISafeDispatcher;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.fxml.FXMLLoader;
import org.junit.Test;
package com.kasirgalabs.etumulator.navigator;


public class APSRStatusTest {
    private APSR apsr;
    private APSRStatus apsrStatus;

    public APSRStatusTest() throws IOException, InterruptedException, ExecutionException,
            TimeoutException {
        assert !Platform.isFxApplicationThread();
        new JFXPanel();

        FutureTask<Void> futureTask = new FutureTask<>(() -> {
// Path: src/main/java/com/kasirgalabs/etumulator/processor/APSR.java
// @Singleton
// public class APSR implements Observable {
//     private boolean negative;
//     private boolean zero;
//     private boolean carry;
//     private boolean overflow;
//     private final Dispatcher dispatcher;
// 
//     /**
//      * Construct an APSR with {@link BaseDispatcher}.
//      *
//      * @see BaseDispatcher
//      */
//     public APSR() {
//         this.dispatcher = new BaseDispatcher();
//     }
// 
//     /**
//      * Construct an APSR with the given dispatcher as parameter.
//      *
//      * @param dispatcher The dispatcher which will be used to notify observers.
//      *
//      * @see Dispatcher
//      */
//     @Inject
//     public APSR(Dispatcher dispatcher) {
//         this.dispatcher = dispatcher;
//     }
// 
//     /**
//      * Adds an observer to the list of observers for this object.
//      *
//      * @param observer The observer to be deleted.
//      *
//      * @see Observer
//      */
//     @Override
//     public void addObserver(Observer observer) {
//         dispatcher.addObserver(observer);
//     }
// 
//     /**
//      * @return The negative.
//      */
//     public boolean isNegative() {
//         return negative;
//     }
// 
//     /**
//      * @param negative The negative to set.
//      */
//     public void setNegative(boolean negative) {
//         this.negative = negative;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * @return The zero.
//      */
//     public boolean isZero() {
//         return zero;
//     }
// 
//     /**
//      * @param zero The zero to set.
//      */
//     public void setZero(boolean zero) {
//         this.zero = zero;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * @return The carry.
//      */
//     public boolean isCarry() {
//         return carry;
//     }
// 
//     /**
//      * @param carry The carry to set.
//      */
//     public void setCarry(boolean carry) {
//         this.carry = carry;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * @return The overflow.
//      */
//     public boolean isOverflow() {
//         return overflow;
//     }
// 
//     /**
//      * @param overflow The overflow to set.
//      */
//     public void setOverflow(boolean overflow) {
//         this.overflow = overflow;
//         dispatcher.notifyObservers(APSR.class);
//     }
// 
//     /**
//      * Updates negative and zero flag depending on the given value as parameter.
//      *
//      * @param value The value used to update negative and zero flag.
//      *
//      * @return The returns the given value.
//      */
//     public int updateNZ(int value) {
//         negative = value < 0;
//         zero = value == 0;
//         dispatcher.notifyObservers(APSR.class);
//         return value;
//     }
// 
//     /**
//      * Sets all the flags to false.
//      */
//     public void reset() {
//         negative = false;
//         zero = false;
//         carry = false;
//         overflow = false;
//         dispatcher.notifyObservers(APSR.class);
//     }
// }
// 
// Path: src/main/java/com/kasirgalabs/etumulator/util/GUISafeDispatcher.java
// public class GUISafeDispatcher extends BaseDispatcher {
//     @Override
//     public void notifyObservers(Class<?> clazz, Object arg) {
//         final CountDownLatch latch = new CountDownLatch(1);
//         Platform.runLater(() -> {
//             super.notifyObservers(clazz, arg);
//             latch.countDown();
//         });
//         try {
//             if(!Platform.isFxApplicationThread()) {
//                 latch.await();
//             }
//         } catch(InterruptedException ex) {
//             throw new CancellationException();
//         }
//     }
// 
//     @Override
//     public void notifyObservers(Class<?> clazz) {
//         notifyObservers(clazz, null);
//     }
// }


// Path: src/test/java/com/kasirgalabs/etumulator/navigator/APSRStatusTest.java
import com.kasirgalabs.etumulator.processor.APSR;
import com.kasirgalabs.etumulator.util.GUISafeDispatcher;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.fxml.FXMLLoader;
import org.junit.Test;

package com.kasirgalabs.etumulator.navigator;


public class APSRStatusTest {
    private APSR apsr;
    private APSRStatus apsrStatus;

    public APSRStatusTest() throws IOException, InterruptedException, ExecutionException,
            TimeoutException {
        assert !Platform.isFxApplicationThread();
        new JFXPanel();

        FutureTask<Void> futureTask = new FutureTask<>(() -> {
            apsr = new APSR(new GUISafeDispatcher());