Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
  • correction_video
  • going_further
  • ImprovedMouseInteraction
  • ModifGUI
  • final2023
  • template
7 results

Target

Select target project
No results found
Select Git revision
  • main
  • correction_video
  • going_further
  • ImprovedMouseInteraction
  • ModifGUI
  • final2023
  • template
7 results
Show changes
27 files
+ 268
245
Compare changes
  • Side-by-side
  • Inline

Files

+1 −1
Original line number Original line Diff line number Diff line
@@ -4,7 +4,7 @@ plugins {
}
}


javafx {
javafx {
    version = "20"
    version = "22"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}
}


Original line number Original line Diff line number Diff line
distributionBase=GRADLE_USER_HOME
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
zipStorePath=wrapper/dists
Original line number Original line Diff line number Diff line
package controller;
package controller;


import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.animation.Animation;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.animation.Timeline;
@@ -11,7 +11,6 @@ import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.ToggleGroup;
import javafx.util.Duration;
import javafx.util.Duration;
import model.CellularAutomatonSimulation;
import view.MatrixPane;
import view.MatrixPane;


import static java.util.Objects.requireNonNull;
import static java.util.Objects.requireNonNull;
Original line number Original line Diff line number Diff line
package controller;
package controller;


import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.paint.Color;
import javafx.scene.paint.Color;
import model.OnChangeListener;
import model.OnChangeListener;


+0 −182
Original line number Original line Diff line number Diff line
package datastruct;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;


/**
 * Represents a matrix, a rectangular array, with generic values in each cell.
 *
 * @param <T> The type of values stored in the matrix cells.
 */
public class Matrix<T> implements Iterable<T> {

    private final List<List<T>> matrix;
    private final int width;
    private final int height;

    /**
     * Creates a new {@link Matrix} with the specified width, height, and an initializer to set
     * values.
     *
     * @param width       The width of the {@link Matrix}.
     * @param height      The height of the {@link Matrix}.
     * @param initializer A matrix initializer to set values in the {@link Matrix}.
     */
    public Matrix(int width, int height, MatrixInitializer<T> initializer) {
        this.width = width;
        this.height = height;
        this.matrix = new ArrayList<>();
        this.initializeWith(initializer);
    }

    /**
     * Creates a new {@link Matrix} with the specified width, height, and initial value for all
     * cells.
     *
     * @param width        The width of the {@link Matrix}.
     * @param height       The height of the {@link Matrix}.
     * @param initialValue The initial value to set in all cells of the {@link Matrix}.
     */
    public Matrix(int width, int height, T initialValue) {
        this(width, height, new ConstantMatrixInitializer<>(initialValue));
    }

    private void initializeWith(MatrixInitializer<T> initializer) {
        for (int x = 0; x < width; x++) {
            List<T> row = new ArrayList<>();
            this.matrix.add(row);
            for (int y = 0; y < height; y++) {
                row.add(initializer.initialValueAt(Coordinate.of(x, y)));
            }
        }
    }

    /**
     * Returns the width of the {@link Matrix}.
     *
     * @return The width of the {@link Matrix}.
     */
    public int width() {
        return width;
    }

    /**
     * Returns the height of the {@link Matrix}.
     *
     * @return The height of the {@link Matrix}.
     */
    public int height() {
        return height;
    }

    /**
     * Gets the value at the specified coordinates (x, y) in the {@link Matrix}.
     *
     * @param x The x-coordinate.
     * @param y The y-coordinate.
     * @return The value at the specified coordinates.
     */
    public T get(int x, int y) {
        return this.matrix.get(x).get(y);
    }

    /**
     * Gets the value at the specified {@link Coordinate} in the {@link Matrix}.
     *
     * @param coordinate The {@link Coordinate}.
     * @return The value at the specified {@link Coordinate}.
     */
    public T get(Coordinate coordinate) {
        return this.get(coordinate.x(), coordinate.y());
    }

    /**
     * Sets the value at the specified coordinates (x, y) in the {@link Matrix}.
     *
     * @param x     The x-coordinate.
     * @param y     The y-coordinate.
     * @param value The value to set at the specified coordinates.
     */
    public void set(int x, int y, T value) {
        this.matrix.get(x).set(y, value);
    }


    /**
     * Sets the value at the specified {@link Coordinate} in the {@link Matrix}.
     *
     * @param coordinate The {@link Coordinate}.
     * @param value      The value to set at the specified {@link Coordinate}.
     */
    public void set(Coordinate coordinate, T value) {
        this.set(coordinate.x(), coordinate.y(), value);
    }

    /**
     * Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
     * row-major order.
     *
     * @return An {@link Iterator} for the {@link Matrix}.
     */
    public Iterator<T> iterator() {
        Iterator<Coordinate> coordIterator = this.coordinatesIterator();
        return new MatrixIterator<>(this, coordIterator);
    }

    /**
     * Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
     * {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
     * will loop over the coordinates of the {@link Matrix}.
     *
     * @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
     */
    public Iterable<Coordinate> coordinates() {
        return this::coordinatesIterator;
    }

    /**
     * Returns an {@link Iterator} that allows iterating over the {@link Coordinate}s in the
     * {@link Matrix} in row-major order.
     *
     * @return An {@link Iterator} for the {@link Matrix}.
     */
    private Iterator<Coordinate> coordinatesIterator() {
        return new CoordinateIterator(this.width, this.height);
    }

    /**
     * Returns a lens for accessing and modifying the value at the specified coordinates (x, y) in
     * the {@link Matrix}.
     *
     * @param x The x-coordinate.
     * @param y The y-coordinate.
     * @return A lens for the specified coordinates.
     */
    public Lens<T> at(int x, int y) {
        return new Lens<T>() {
            @Override
            public T get() {
                return Matrix.this.get(x, y);
            }

            @Override
            public void set(T value) {
                Matrix.this.set(x, y, value);
            }
        };
    }

    /**
     * Returns a lens for accessing and modifying the value at the specified coordinate in the
     * {@link Matrix}.
     *
     * @param coordinate The {@link Coordinate}.
     * @return A lens for the specified  {@link Coordinate}.
     */
    public Lens<T> at(Coordinate coordinate) {
        return this.at(coordinate.x(), coordinate.y());
    }

}
Original line number Original line Diff line number Diff line
package datastruct;
package matrix;


public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {
public class ConstantMatrixInitializer<T> implements MatrixInitializer<T> {


    private final T constant;
  // TODO: add instance variables


  public ConstantMatrixInitializer(T constant) {
  public ConstantMatrixInitializer(T constant) {
        this.constant = constant;
    // TODO
  }
  }

    @Override
    @Override
    public T initialValueAt(Coordinate coordinate) {
    public T initialValueAt(Coordinate coordinate) {
        return constant;
      // TODO
      return null;
    }
    }
}
}
Original line number Original line Diff line number Diff line
package datastruct;
package matrix;


import java.util.ArrayList;
import java.util.List;
import java.util.List;


/**
/**
@@ -62,7 +61,15 @@ public record Coordinate(int x, int y) {


    /**
    /**
     * Computes and returns a list of orthogonal (adjacent in horizontal or vertical direction) neighbors.
     * Computes and returns a list of orthogonal (adjacent in horizontal or vertical direction) neighbors.
     *
     *  | | | |
     * ---------
     *  | |X| |
     * ---------
     *  |X|O|X|
     * ---------
     *  | |X| |
     * ---------
     * | | | |
     * @return A list of orthogonal neighboring {@link Coordinate}s.
     * @return A list of orthogonal neighboring {@link Coordinate}s.
     */
     */
    public List<Coordinate> orthogonalNeighbours() {
    public List<Coordinate> orthogonalNeighbours() {
@@ -72,6 +79,15 @@ public record Coordinate(int x, int y) {


    /**
    /**
     * Computes and returns a list of diagonal (adjacent in diagonal direction) neighbors.
     * Computes and returns a list of diagonal (adjacent in diagonal direction) neighbors.
     *  | | | |
     * ---------
     *  |X| |X|
     * ---------
     *  | |O| |
     * ---------
     *  |X| |X|
     * ---------
     * | | | |
     *
     *
     * @return A list of diagonal neighboring {@link Coordinate}s.
     * @return A list of diagonal neighboring {@link Coordinate}s.
     */
     */
@@ -82,6 +98,15 @@ public record Coordinate(int x, int y) {


    /**
    /**
     * Computes and returns a list of all orthogonal and diagonal neighbors.
     * Computes and returns a list of all orthogonal and diagonal neighbors.
     *      *  | | | |
     *      * ---------
     *      *  |X|X|X|
     *      * ---------
     *      *  |X|O|X|
     *      * ---------
     *      *  |X|X|X|
     *      * ---------
     *      * | | | |
     *
     *
     * @return A list of all neighboring {@link Coordinate}s.
     * @return A list of all neighboring {@link Coordinate}s.
     */
     */
@@ -94,4 +119,12 @@ public record Coordinate(int x, int y) {
    public String toString() {
    public String toString() {
        return "(" + this.x + "," + this.y + ")";
        return "(" + this.x + "," + this.y + ")";
    }
    }

  public Coordinate minus(Coordinate corner) {
    return new Coordinate(this.x - corner.x, this.y - corner.y);
  }

  public Coordinate plus(Coordinate corner) {
      return new Coordinate(this.x + corner.x, this.y + corner.y);
  }
}
}
 No newline at end of file
+63 −0
Original line number Original line Diff line number Diff line
package matrix;

import java.util.List;


/**
 * Represents a matrix, a rectangular array, with generic values in each cell.
 *
 * @param <T> The type of values stored in the matrix cells.
 */
public class ListMatrix<T> implements Matrix<T> {

  private final List<List<T>> matrix;
  private final int width;
  private final int height;

  /**
   * Creates a new {@link ListMatrix} with the specified width, height, and an initializer to set
   * values.
   *
   * @param width       The width of the {@link ListMatrix}.
   * @param height      The height of the {@link ListMatrix}.
   * @param initializer A matrix initializer to set values in the {@link ListMatrix}.
   */
  public ListMatrix(int width, int height, MatrixInitializer<T> initializer) {
    // TODO
    this.width = 0;
    this.height = 0;
    this.matrix = null;
    this.initializeWith(initializer); // fills the matrix using initializer
  }

  public ListMatrix(int width, int height, T constant) {
    this(width, height, new ConstantMatrixInitializer<>(constant));
  }

  private void initializeWith(MatrixInitializer<T> initializer) {
    // TODO initialize each cell of the matrix, with a value determined by initializer
  }

  public int width() {
    // TODO
    return 0;
  }

  public int height() {
    // TODO
    return 0;
  }

  @Override
  public T get(int x, int y) {
    // TODO
    return null;
  }


  @Override
  public void set(int x, int y, T newValue) {
    // TODO
  }

}
+87 −0
Original line number Original line Diff line number Diff line
package matrix;

import java.util.Iterator;

public interface Matrix<T> extends Iterable<T> {

  /**
   * Returns the width of the {@link Matrix}.
   *
   * @return The width of the {@link Matrix}.
   */
  int width();

  /**
   * Returns the height of the {@link Matrix}.
   *
   * @return The height of the {@link Matrix}.
   */
  int height();

  /**
   * Returns the value at the specified coordinates (x, y) in
   * the {@link Matrix}.
   *
   * @param x The x-coordinate.
   * @param y The y-coordinate.
   * @return The content of the matrix at the coordinates (x,y).
   */
  T get(int x, int y);
  /**
   * Returns the value at the specified coordinates (x, y) in
   * the {@link Matrix}.
   *
   * @param coordinate The coordinates (x,y).
   * @return The content of the matrix at the coordinates (x,y).
   */
  default T get(Coordinate coordinate) {
    return this.get(coordinate.x(), coordinate.y());
  }

  /**
   *  Changes the value at the specified coordinates (x,y) in the {@link Matrix}
   *
   * @param x the x-coordinate
   * @param y the y-coordinate
   * @param newValue the value to assign to coordinates (x,y).
   */
  void set(int x, int y, T newValue);

  /**
   *  Changes the value at the specified coordinates (x,y) in the {@link Matrix}
   *
   * @param coordinate The coordinates (x,y)
   * @param newValue the value to assign to coordinates (x,y).
   */
  default void set(Coordinate coordinate, T newValue) {
    this.set(coordinate.x(), coordinate.y(), newValue);
  }

  default Matrix<T> subMatrix(Coordinate corner, int width, int height){
    return null ;
  }


  /**
   * Returns an {@link Iterable} that provides access to the {@link Coordinate}s of the
   * {@link Matrix} in row-major order. This means that a {@code for} loop on a {@link Matrix}
   * will loop over the coordinates of the {@link Matrix}.
   *
   * @return An {@link Iterable} for the {@link Coordinate}s of the {@link Matrix}.
   */
  default Iterable<Coordinate> coordinates() {
    return () -> new CoordinateIterator(this.width(), this.height());
  }

  /**
   * Returns an {@link Iterator} that allows iterating over the elements in the {@link Matrix} in
   * row-major order.
   *
   * @return An {@link Iterator} for the {@link Matrix}.
   */
  default Iterator<T> iterator() {
    Iterator<Coordinate> coords =
      new CoordinateIterator(this.width(),this.height());
    return new MatrixIterator<>(this, coords);
  }
}
Original line number Original line Diff line number Diff line
package datastruct;
package matrix;


/**
/**
 * An interface for initializing a {@link Matrix} by providing initial values for each cell.
 * An interface for initializing a {@link ListMatrix} by providing initial values for each cell.
 *
 *
 * @param <T> The type of values to initialize the {@link Matrix} with.
 * @param <T> The type of values to initialize the {@link ListMatrix} with.
 */
 */
public interface MatrixInitializer<T> {
public interface MatrixInitializer<T> {


    /**
    /**
     * Returns the initial value to be set in a {@link Matrix} cell at the specified
     * Returns the initial value to be set in a {@link ListMatrix} cell at the specified
     * {@link Coordinate}.
     * {@link Coordinate}.
     *
     *
     * @param coordinate The {@link Coordinate} at which to set the initial value.
     * @param coordinate The {@link Coordinate} at which to set the initial value.
Original line number Original line Diff line number Diff line
package model;
package model;


import datastruct.Lens;

import java.util.ArrayList;
import java.util.ArrayList;
import java.util.List;
import java.util.List;


Original line number Original line Diff line number Diff line
package model;
package model;


import controller.Simulation;
import controller.Simulation;
import datastruct.Coordinate;
import matrix.Coordinate;
import datastruct.Matrix;
import matrix.ListMatrix;
import javafx.scene.paint.Color;
import javafx.scene.paint.Color;


import java.util.Iterator;
import java.util.Iterator;
@@ -18,7 +18,7 @@ import java.util.Random;
public class CellularAutomatonSimulation<S extends State<S>>
public class CellularAutomatonSimulation<S extends State<S>>
        implements Simulation {
        implements Simulation {


    private final Matrix<Cell<S>> grid;
    private final ListMatrix<Cell<S>> grid;
    private final Cell<Integer> generationNumber = new Cell<>(0);
    private final Cell<Integer> generationNumber = new Cell<>(0);
    private final CellularAutomaton<S> automaton;
    private final CellularAutomaton<S> automaton;
    private final Random generator;
    private final Random generator;
@@ -31,7 +31,7 @@ public class CellularAutomatonSimulation<S extends State<S>>
     */
     */
    public CellularAutomatonSimulation(CellularAutomaton<S> automaton, Random generator) {
    public CellularAutomatonSimulation(CellularAutomaton<S> automaton, Random generator) {
        this.automaton = automaton;
        this.automaton = automaton;
        this.grid = new Matrix<>(
        this.grid = new ListMatrix<>(
                automaton.numberOfColumns(),
                automaton.numberOfColumns(),
                automaton.numberOfRows(),
                automaton.numberOfRows(),
                new ConstantCellInitializer<>(automaton.defaultState())
                new ConstantCellInitializer<>(automaton.defaultState())
@@ -68,12 +68,12 @@ public class CellularAutomatonSimulation<S extends State<S>>
        //TODO: à compléter, en utilisant nextGenerationMatrix()
        //TODO: à compléter, en utilisant nextGenerationMatrix()
    }
    }


    /** Computes the {@link Matrix} of states obtained after a single step of updates
    /** Computes the {@link ListMatrix} of states obtained after a single step of updates
     * of the simulation.
     * of the simulation.
     *
     *
     * @return the states of each cell after one generation
     * @return the states of each cell after one generation
     */
     */
    private Matrix<S> nextGenerationMatrix() {
    private ListMatrix<S> nextGenerationMatrix() {
        //TODO: à compléter
        //TODO: à compléter
        return null;
        return null;
    }
    }
Original line number Original line Diff line number Diff line
package model;
package model;


import datastruct.Coordinate;
import matrix.Coordinate;
import datastruct.Matrix;
import matrix.ListMatrix;
import datastruct.MatrixInitializer;
import matrix.MatrixInitializer;


/**
/**
 *  An initializer for {@link Matrix} of {@link Cell}s, where each cell is initialized to the
 *  An initializer for {@link ListMatrix} of {@link Cell}s, where each cell is initialized to the
 *  same value.
 *  same value.
 *
 *
 * @param <T> the type of content of each cell
 * @param <T> the type of content of each cell
Original line number Original line Diff line number Diff line
package model;
package model;


import datastruct.Coordinate;
import matrix.Coordinate;
import datastruct.MatrixInitializer;
import matrix.MatrixInitializer;
import datastruct.Matrix;
import matrix.ListMatrix;
import controller.Simulation;
import controller.Simulation;
import java.util.ArrayList;
import java.util.List;


/**
/**
 * An initializer for a {@link Matrix} of states, where each state is computed based on the value
 * An initializer for a {@link ListMatrix} of states, where each state is computed based on the value
 * of its neighbours in a {@link Simulation} of a cellular automaton.
 * of its neighbours in a {@link Simulation} of a cellular automaton.
 *
 *
 * @param <S> the type of states in the simulation.
 * @param <S> the type of states in the simulation.
Original line number Original line Diff line number Diff line
package view;
package view;


import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.MouseEvent;


public class FillingMouseListener implements MouseListener {
public class FillingMouseListener implements MouseListener {
Original line number Original line Diff line number Diff line
package view;
package view;


import controller.Controller;
import controller.Controller;
import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.GridPane;
Original line number Original line Diff line number Diff line
package view;
package view;


import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.MouseEvent;


interface MouseListener {
interface MouseListener {
Original line number Original line Diff line number Diff line
package view;
package view;


import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.MouseEvent;


class WaitingMouseListener implements MouseListener {
class WaitingMouseListener implements MouseListener {
Original line number Original line Diff line number Diff line
package datastruct;
package matrix;


import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Test;


@@ -7,7 +7,7 @@ import static org.junit.jupiter.api.Assertions.*;
class ConstantMatrixInitializerTest {
class ConstantMatrixInitializerTest {
    @Test
    @Test
    public void testMatrixInitializationWithConstantValue() {
    public void testMatrixInitializationWithConstantValue() {
        Matrix<String> matrix = new Matrix<>(3, 3, new ConstantMatrixInitializer<>("X"));
        ListMatrix<String> matrix = new ListMatrix<>(3, 3, new ConstantMatrixInitializer<>("X"));


        // Test that all cells have the constant value.
        // Test that all cells have the constant value.
        for (int x = 0; x < 3; x++) {
        for (int x = 0; x < 3; x++) {
@@ -19,7 +19,7 @@ class ConstantMatrixInitializerTest {


    @Test
    @Test
    public void testMatrixInitializationWithConstantValue2() {
    public void testMatrixInitializationWithConstantValue2() {
        Matrix<Integer> matrix = new Matrix<>(3, 5, new ConstantMatrixInitializer<>(12));
        ListMatrix<Integer> matrix = new ListMatrix<>(3, 5, new ConstantMatrixInitializer<>(12));


        // Test that all cells have the constant value.
        // Test that all cells have the constant value.
        for (int x = 0; x < 3; x++) {
        for (int x = 0; x < 3; x++) {
Original line number Original line Diff line number Diff line
package datastruct;
package matrix;


import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Test;


@@ -6,14 +6,14 @@ import java.util.Iterator;


import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;


class MatrixTest {
class ListMatrixTest {


    private final MatrixInitializer<Integer> sumInitializer =
    private final MatrixInitializer<Integer> sumInitializer =
            coord -> coord.x() + coord.y();
            coord -> coord.x() + coord.y();


    @Test
    @Test
    public void testMatrixCreationWithInitializer() {
    public void testMatrixCreationWithInitializer() {
        Matrix<Integer> matrix = new Matrix<>(3, 4, sumInitializer);
        ListMatrix<Integer> matrix = new ListMatrix<>(3, 4, sumInitializer);
        assertEquals(3, matrix.width());
        assertEquals(3, matrix.width());
        assertEquals(4, matrix.height());
        assertEquals(4, matrix.height());
        assertEquals(4, matrix.get(2, 2));
        assertEquals(4, matrix.get(2, 2));
@@ -24,7 +24,7 @@ class MatrixTest {


    @Test
    @Test
    public void testMatrixCreationWithInitialValue() {
    public void testMatrixCreationWithInitialValue() {
        Matrix<String> matrix = new Matrix<>(2, 2, "Foo");
        ListMatrix<String> matrix = new ListMatrix<>(2, 2, "Foo");
        assertEquals(2, matrix.width());
        assertEquals(2, matrix.width());
        assertEquals(2, matrix.height());
        assertEquals(2, matrix.height());
        assertEquals("Foo", matrix.get(1, 1)); // Test a specific cell value.
        assertEquals("Foo", matrix.get(1, 1)); // Test a specific cell value.
@@ -32,7 +32,7 @@ class MatrixTest {


    @Test
    @Test
    public void testMatrixSetAndGet() {
    public void testMatrixSetAndGet() {
        Matrix<Integer> matrix = new Matrix<>(3, 3, 0);
        ListMatrix<Integer> matrix = new ListMatrix<>(3, 3, 0);
        matrix.set(1, 1,42);
        matrix.set(1, 1,42);
        assertEquals(42, matrix.get(1, 1));
        assertEquals(42, matrix.get(1, 1));
        matrix.set(0, 2,10);
        matrix.set(0, 2,10);
@@ -43,7 +43,7 @@ class MatrixTest {


    @Test
    @Test
    public void testMatrixWidthAndHeight() {
    public void testMatrixWidthAndHeight() {
        Matrix<String> matrix = new Matrix<>(4, 2, "A");
        ListMatrix<String> matrix = new ListMatrix<>(4, 2, "A");
        assertEquals(4, matrix.width());
        assertEquals(4, matrix.width());
        assertEquals(2, matrix.height());
        assertEquals(2, matrix.height());
        matrix.set(3, 1,"B");
        matrix.set(3, 1,"B");
@@ -53,7 +53,7 @@ class MatrixTest {


    @Test
    @Test
    public void testMatrixIterator() {
    public void testMatrixIterator() {
        Matrix<Integer> matrix = new Matrix<>(2, 2, sumInitializer);
        ListMatrix<Integer> matrix = new ListMatrix<>(2, 2, sumInitializer);
        Iterator<Integer> iterator = matrix.iterator();
        Iterator<Integer> iterator = matrix.iterator();
        assertTrue(iterator.hasNext());
        assertTrue(iterator.hasNext());
        assertEquals(0, iterator.next());
        assertEquals(0, iterator.next());
@@ -68,7 +68,7 @@ class MatrixTest {


    @Test
    @Test
    public void testMatrixCoordinates() {
    public void testMatrixCoordinates() {
        Matrix<Integer> matrix = new Matrix<>(2, 2, 0);
        ListMatrix<Integer> matrix = new ListMatrix<>(2, 2, 0);
        Iterable<Coordinate> coordinates = matrix.coordinates();
        Iterable<Coordinate> coordinates = matrix.coordinates();
        int count = 0;
        int count = 0;
        for (Coordinate coord : coordinates) {
        for (Coordinate coord : coordinates) {
@@ -77,12 +77,24 @@ class MatrixTest {
        assertEquals(4, count);
        assertEquals(4, count);
    }
    }



    @Test
    @Test
    public void testMatrixLens() {
    public void testSubMatrix() {
        Matrix<Integer> matrix = new Matrix<>(2, 2, 0);
      Matrix<Integer> matrix = new ListMatrix<>(5, 5, 0);
        Lens<Integer> lens = matrix.at(1, 1);
      for (int x = 0; x < 5; x++) {
        assertEquals(0, lens.get());
        for (int y = 0; y < 5; y++) {
        lens.set(42);
          matrix.set(x,y,x + y * 5);
        assertEquals(42, matrix.get(1, 1));
        }
      }
      Matrix<Integer> sub = matrix.subMatrix(Coordinate.of(2,1),2,3);
      assertEquals(2, sub.width());
      assertEquals(3, sub.height());
      for (int x = 2; x < 4; x++) {
        for (int y = 1; y < 4; y++) {
          assertEquals(x + y * 5, sub.get(x-2,y-1));
        }
        }
      }
      }
    }


}
Original line number Original line Diff line number Diff line
package model;
package model;


import datastruct.Coordinate;
import matrix.Coordinate;
import javafx.scene.paint.Color;
import javafx.scene.paint.Color;
import model.automata.GameOfLifeAutomaton;
import model.automata.GameOfLifeAutomaton;
import static model.automata.GameOfLifeState.*;
import static model.automata.GameOfLifeState.*;
Original line number Original line Diff line number Diff line
package model;
package model;


import controller.Simulation;
import matrix.Coordinate;
import datastruct.Coordinate;
import model.automata.GameOfLifeAutomaton;
import model.automata.GameOfLifeAutomaton;
import model.automata.GameOfLifeState;
import model.automata.GameOfLifeState;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.BeforeEach;